13

私はAndroidアプリをORMLiteで動作するように変更していますが、現在、コーディングを最小限に抑えるために、多数のCursorAdapterを使用しています。

100%確信はありませんが、ORMLiteがデータベースにidフィールドを作成するとき、それは常にを使用しますidが、CursorAdapterはを必要とします_id

次のようなクエリを使用して、これを回避することができます。

select id as _id ......

しかし、このDao.queryRaw()メソッドはカーソルではなくリストを返すので、私が行った方法は、別のSQLiteOpenHelperデータベース接続を開いてを使用することrawQuery()です。

これは機能しますが、それを行うためのより良い方法はありますか?2つの別々のデータベース接続を持ち、後で問題を保存するのはやり過ぎのようです。

4

3 に答える 3

11

あなたのコメントは、あなたがすでにあなたの問題に答えたことを示しています。ORMLiteを使用して、「_id」という名前の列を作成できます。

@DatabaseField(generatedId = true)
private int _id;

また

@DatabaseField(generatedId = true, columnName = "_id")
private int id;

Cursorsを使用している場合は、クラスのメソッドlast()moveAbsolute(...)メソッドを確認することをお勧めします。DatabaseResultsまた、AndroidDatabaseResults(キャストできる)には、基になるオブジェクトgetRawCursor()を返すメソッドと、追加のメソッドとメソッドがあります。CursorgetCount()getPosition()

ORMLiteとCursorsに関する詳細情報は次のとおりです。

CursorAdapterで使用するORMLiteを搭載したAndroidカーソル

Cursor次のようなものを使用してアクセスできます。

// build your query
QueryBuilder<Foo, String> qb = fooDao.queryBuilder();
qb.where()...;
// when you are done, prepare your query and build an iterator
CloseableIterator<Foo> iterator = dao.iterator(qb.prepare());
try {
   // get the raw results which can be cast under Android
   AndroidDatabaseResults results =
       (AndroidDatabaseResults)iterator.getRawResults();
   Cursor cursor = results.getRawCursor();
   ...
} finally {
   iterator.closeQuietly();
}
于 2012-09-14T13:17:39.973 に答える
5

左結合を実行する必要があったので、結局ORMLiteを使用した生のSQLクエリが必要でした(つまり、クエリのid列の名前を変更する必要があったためではなく、上記のGrayの回答では必要ありません)。

私がそれをした方法は以下の通りです:

public class DatabaseHelper extends OrmLiteSqliteOpenHelper{
   public void myRawQueryMethod() {
        SQLiteDatabase database = this.getReadableDatabase();
        String SqlQuery = "Write raw SQL query here"; 
        Cursor cursor = database.rawQuery(SqlQuery, null);
    }
}

アドバイスをありがとう

于 2012-09-14T13:26:47.347 に答える
0

"_id"実際の主キー列のエイリアスとして扱われる別のカーソルでカーソルをラップします。例:

cursor = new CursorWrapper(cursor) {
                @Override
                public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException {
                    if ("_id".equals(columnName)) columnName = "id";
                    return super.getColumnIndexOrThrow(columnName);
                }
            };
于 2020-02-19T13:15:14.877 に答える