1

アプリ用の多数のオブジェクトを SQLite データベースに保存しています。これらのオブジェクトのクラスには、Database クラスから渡された Cursor オブジェクトを受け取るコンストラクターがあります。例:

public MyClass(Cursor cursor) {
    this.id = cursor.getString(cursor.getColumnIndex(MyDatabase.KEY_ROWID));
    this.nickname = cursor.getString(cursor.getColumnIndex(MyDatabase.KEY_NICKNAME));

...等々。

ただし、ID 列の getColumnIndex が -16 を返すと、ランダムにクラッシュすることに気付きました。(そして、その行をコメントアウトすると、アクセスしようとする最初の列が何であれ、-16 も返されます)。その周りにいくつかの追加のログを追加しましたが、列が問題ないように見えるため、役に立ちませんでした:

public MyClass(Cursor cursor) {     
    Log.i("TEST", Column names are: " + Arrays.toString(cursor.getColumnNames()));
    Log.i("TEST", Making object, id column index is " + cursor.getColumnIndex(MyDatabase.KEY_ROWID));

どちらが印刷されますか:

Column names are: [_id, nickname...]
Making object, id column index is -16

だから、すべてがうまくいくように見えます.Cursorからの読み取り中に、なぜすべてがめちゃくちゃになるのか、誰もが何か手がかりを得ましたか?

編集:これがカーソルを取得する方法です。これはデータベースクラスのメソッドです:

public MyObject getMyObject(String id) {
    MyObject objectFound = null;
    String[] whereArgs = { id };
    Cursor cursor = db.query(true, getTableName(), null, WHERE_EQUALS, whereArgs, null, null, null, null);
    if(cursor.moveToFirst()) {
        //Should only return 1 entry from DB
        while(cursor.isAfterLast() == false) {
            objectFound = new MyObject(cursor);
            cursor.moveToNext();
        }
    }

    cursor.close();     
    return objectFound;     
}
4

0 に答える 0