2012-09-14 60 views
12

我正在修改我的Android應用程序以使用ORMLite,並且它當前使用了一些CursorAdapter,我很想繼續嘗試最小化編碼。ORMLite與Android中的CursorAdapter

我不是100%確定的,但似乎ORMLite在db中創建一個id字段時,它始終使用id,而CursorAdapter需要_id

它可以避開這個使用類似下面的查詢:

select id as _id ...... 

Dao.queryRaw()方法返回一個列表,而不是一個光標,所以我做了它的方法是打開另一個SQLiteOpenHelper數據庫連接和使用rawQuery()

這是有效的,但有沒有更好的方法呢?有兩個單獨的數據庫連接看起來有點矯枉過正,並且稍後可能會存儲麻煩。

+0

對不起,這個問題似乎是虛假的。我錯了,可以用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(您可以投射到)也有一個getRawCursor()方法,該方法返回基礎Cursor對象並具有其他getCount()getPosition()方法。

以下是有關ORMLite和Cursor小號一些更多的信息:

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

如果它是一個渴望獲取的集合,它不需要關閉。如果它是一個懶惰的集合,那麼連接將保持對數據庫開放,您將需要關閉它。不確定如果你在Android CursorAdapter @Sebastian中如何做到這一點。 – Gray

+0

對不起,對於一個新手問題:默認情況下是一個收藏惰性?我遇到了和@Sebastian一樣的問題,當光標在使用時關閉迭代器導致崩潰。現在我將光標從Datamanager類傳遞給列表片段和自定義的cursorAdapter。它的工作原理,但我不知道何時何地發佈迭代器。 – jannej

6

事實我確實需要ORMLite的原始SQL查詢,因爲我需要做一個左連接,(即n OT具有的ID列重命名查詢的結果,這是沒有必要按照上面灰色的回答)

我做它的方式是如下:

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

感謝意見

+0

僅供參考:我們已將版本4.22添加到ORMLite的LEFT JOIN功能。它剛剛發佈。 – Gray

相關問題