Pregunta

Estoy creando una aplicación que utiliza SQLiteDatabase para almacenar los elementos de un ListView.Pero, me sale un error al rellenar los datos en el ListView a partir de la Base de datos, y la aplicación se bloquea.

Aquí está mi Base de datos

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;

import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class NotesDatabase extends SQLiteOpenHelper {

private static final String NOTE_NAME = "name";
private static final String NOTE_ID = "id";
private static final String NOTE_SUBJECT = "subject";

private static final String DATABASE_NAME = "notesDatabase";
private static final String TABLE_NOTES = "notes";
private static final int DATABASE_VERSION = 1;
private static final String CREATE_NOTES_TABLE = "CREATE TABLE " + TABLE_NOTES + "("
        + NOTE_ID + " INTEGER PRIMARY KEY," + NOTE_NAME + " TEXT,"
        + NOTE_SUBJECT + " TEXT" + ")";
public NotesDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {

    try {
        db.execSQL(CREATE_NOTES_TABLE);
    }
    catch(SQLException e) {
        e.printStackTrace();
    }
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    db.execSQL("DROP TABLE IF EXSISTS topics");
    onCreate(db);
}
public void addNote(Note note) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues notes = new ContentValues();
    notes.put(NOTE_NAME, note.getNote());
    notes.put(NOTE_SUBJECT, note.getSubject());

    db.insert(TABLE_NOTES, null, notes);
    db.close();
}
public void removeNote(Note note) {

    SQLiteDatabase db = this.getWritableDatabase();

    db.delete(TABLE_NOTES, NOTE_NAME + " = ?", 
            new String[] {note.getNote()});

    db.close();
}
public ArrayList<Note> getNotes(){

    ArrayList<Note> notes = new ArrayList<Note>();

    String selectQuery = "SELECT * FROM " + TABLE_NOTES;

    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cur = db.rawQuery(selectQuery, null);

    if(cur.moveToFirst()) {
        do {
            Note note = new Note();
            note.setId(Integer.parseInt(cur.getString(0)));
            note.setNote(cur.getString(cur.getColumnIndex(NOTE_NAME)));
            note.setSubject(cur.getString(cur.getColumnIndex(NOTE_SUBJECT)));
            notes.add(note);
        } while(cur.moveToNext());
    }
    db.close();
    return notes;
}
public void updateNote(String old_name, String new_name) {
    SQLiteDatabase db = this.getWritableDatabase();

    ContentValues topic = new ContentValues();

    topic.put(NOTE_NAME, new_name);

    db.update(TABLE_NOTES, topic, NOTE_NAME + " = ?", 
            new String[] {old_name});
    db.close();
}
}

Note.java -

public class Note {

String _Note;
int _id;
String subject;

public String getSubject() {
    return subject;
}
public void setSubject(String subject) {
    this.subject = subject;
}
public Note() {

}
public Note(int id, String Note, String Subject) {
    this._id = id;
    this._Note = Note;
    this.subject = Subject;
}
public Note(String Note, String Subject) {
    this._Note = Note;
    this.subject = Subject;
}
public Note(String Note) {
    this._Note = Note;
}
public String getNote() {
    return _Note;
}
public void setNote(String _Note) {
    this._Note = _Note;
}
public int getId() {
    return _id;
}
public void setId(int _id) {
    this._id = _id;
}

}

NotesDatabase.java -

import java.util.ArrayList;

import android.os.Bundle;

import android.app.Activity;

import android.content.Intent;

import android.util.Log;

import android.view.Menu;
import android.view.View;

import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class Notes_page extends Activity {

ArrayList<Note> notes = new ArrayList<Note>();

NotesDatabase ndb = new NotesDatabase(this);
private NoteAdapter adapter;

private ListView notes_list;
private TextView subject_display;

String subject;

int requestCode = 1;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notes_page);

    notes_list = (ListView) findViewById(R.id.notes);
    ndb.getWritableDatabase();
    notes = ndb.getNotes();
    adapter = new NoteAdapter(this, notes);

    subject = getIntent().getStringExtra("SUBJECT_NAME");

    notes_list.setAdapter(adapter);

    subject_display = (TextView) findViewById(R.id.subject_name);
    subject_display.setText(subject);
}

public void onClickAddNewNote(View v) {
    startActivityForResult(new Intent("com.Swap.Add_New_Note"), requestCode);

}

public void onActivityResult(int request_Code, int result_Code, Intent i) {
    if(request_Code == requestCode) {
        if(result_Code == RESULT_OK) {
            Note mNote = new Note(i.getStringExtra("NOTE"), getIntent().getStringExtra("SUBJECT_NAME"));
            ndb.getWritableDatabase();
            ndb.addNote(mNote);
            Log.d("AddNote", "Note Succesfully Added to Database");
            adapter.add(mNote);
            adapter.notifyDataSetChanged();

            Toast.makeText(getBaseContext(), mNote.getNote(), Toast.LENGTH_SHORT).show();
        }
    }
} 

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_notes_page, menu);
    return true;
}
}

Aquí está el LogCat de registro de Errores -

04-13 22:17:10.766: E/linker(25692): load_library(linker.cpp:759): library "libmaliinstr.so" not found
04-13 22:17:14.816: E/CursorWindow(25692): Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 2 columns.
04-13 22:17:14.869: E/AndroidRuntime(25692): FATAL EXCEPTION: main
04-13 22:17:14.869: E/AndroidRuntime(25692): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.Swap.RR/com.Swap.RR.Notes_page}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2416)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.app.ActivityThread.access$600(ActivityThread.java:174)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1382)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.os.Handler.dispatchMessage(Handler.java:107)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.os.Looper.loop(Looper.java:194)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.app.ActivityThread.main(ActivityThread.java:5409)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at java.lang.reflect.Method.invokeNative(Native Method)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at java.lang.reflect.Method.invoke(Method.java:525)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:606)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at dalvik.system.NativeStart.main(Native Method)
04-13 22:17:14.869: E/AndroidRuntime(25692): Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.database.CursorWindow.nativeGetString(Native Method)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.database.CursorWindow.getString(CursorWindow.java:434)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at com.Swap.RR.NotesDatabase.getNotes(NotesDatabase.java:78)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at com.Swap.RR.Notes_page.onCreate(Notes_page.java:41)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.app.Activity.performCreate(Activity.java:5122)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1146)
04-13 22:17:14.869: E/AndroidRuntime(25692):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2328)
04-13 22:17:14.869: E/AndroidRuntime(25692):    ... 11 more

Por favor me ayude a averiguar lo que está mal conmigo código.Gracias de antemano!!

¿Fue útil?

Solución

Su línea de asunto es engañosa.La excepción en el stacktrace dice

Couldn't read row 0, col -1 from CursorWindow

lo que en esencia significa que getColumnIndex() no se pudo encontrar la columna especificada en la Cursor y -1 se devuelve como índice de columna.

Su selección SELECT * contiene todas las columnas de la tabla.

Su CREATE TABLE parece contener todas las columnas que solicita el índice de con getColumnIndex() en getNotes().

Las posibilidades son que usted ha añadido una columna, pero el dispositivo de prueba todavía tiene un archivo de base de datos sin que la columna.Simplemente desinstalar la aplicación o borrar sus datos para quitar el antiguo archivo de base de datos y hacer que su onCreate() recrear la base de datos en la siguiente ejecución.

Otros consejos

Puede haber una diferencia entre el nombre de la columna en la tabla y el nombre que da acceso a la columna en su código.Así que usted debe volver a comprobar el nombre, porque en mi caso no fue un error de ortografía :P

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top