2012-09-14 13 views
12

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

私は100%確信していませんが、ORMLiteがdbにIDフィールドを作成すると、常にidが使用されますが、CursorAdapterは_idが必要です。

次のようなクエリを使用して、このラウンドを取得することが可能である:

select id as _id ...... 

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

これは機能しますが、これを行うにはより良い方法がありますか? 2つの別々のデータベース接続があり、おそらく後でトラブルを格納するのは残念です。

+0

ため

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); } } 

ありがとう:クエリでID列の名前を変更することの結果として、OT、それは、上記のグレーの答え)

私はそれをやった方法は以下の通りですにつき、必要に応じてではありません申し訳ありませんが、この疑問は偽りのようです。私は間違っていましたが、ORMLiteで列_idに名前を付けることは可能ですので、誰かがすぐに追加するものがない限り、混乱を避けるためにこの質問を削除することを提案しました.. –

+2

それを削除するのではなく、 ORM – pjco

+1

で動作するようにカーソルを作成した方法に関するこのサンプルコードを参考にしてください。あなたは正しいのです - 削除しないでください、私はちょうどこのタイプの誤解に遭遇して人々を香りから守ることを心配しますが、答えは慎重に読むことです! –

答えて

12

お客様からのご意見は、既に問題にお答えしていることを示しています。あなたは確かにORMLiteを使用して、「_id」という名前の列を作成することができます

@DatabaseField(generatedId = true) 
private int _id; 

または

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

あなたはCursor Sを使用している場合、あなたは上のlast()moveAbsolute(...)方法を見てみたいことがありDatabaseResultsクラス。また、キャスト可能なAndroidDatabaseResultsにはというメソッドがあり、それは基底のCursorオブジェクトを返し、さらにgetCount()getPosition()のメソッドを返します。ここで

はORMLiteとCursor Sについてのいくつかの詳細は以下のとおりです。

Android Cursor with ORMLite to use in CursorAdapter

あなたは、次のようなものを使用して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(); 
} 
+3

カーソルが使用されている間にイテレータを閉じてはいけないことがわかりました(私はそう推測しました)。あなたはそれをどのように扱いますか? onDestroy()でそれを閉じて閉じてください。 – Sebastian

+2

eager fetchedされたコレクションであれば、それを閉じる必要はありません。遅延コレクションの場合は、データベースへの接続が開いたままになるため、接続を閉じる必要があります。あなたがAndroid CursorAdapter @Sebastianの中にいる場合、それを行う方法がわかりません。 – Gray

+0

初心者のご迷惑をおかけして申し訳ありません。デフォルトでは、コレクションは怠惰ですか? @Sebastianと同じ問題がありました。カーソルが使用されているときにイテレータを閉じるとクラッシュしました。今私は、カーソルをDatamanagerクラスからリストフラグメントとカスタムのcursorAdapterに渡しています。それは動作しますが、イテレータをいつどこでいつリリースするのか分かりません。 – jannej

6

それは変わります私は左結合を行う必要があったので、ORMLiteを使った生のSQLクエリが必要でした(つまり、nアドバイス

+0

FYI:バージョン4.22のLEFT JOIN機能をORMLiteに追加しました。それはちょうど解放された。 – Gray

関連する問題