在Android中使用CursorAdapter进行ORMLite

Ste*_*v_k 12 android ormlite android-cursoradapter

我正在修改我的Android应用程序以使用ORMLite,它目前使用了许多CursorAdapter,我非常希望尽量减少编码.

我不是100%肯定但是看起来当ORMLite在db中创建一个id字段时,它总是使用id,而CursorAdapter需要_id.

可以使用如下查询来解决此问题:

select id as _id ......
Run Code Online (Sandbox Code Playgroud)

但该Dao.queryRaw()方法返回一个列表,而不是Cursor,所以我这样做的方法是打开另一个SQLiteOpenHelper数据库连接并使用rawQuery().

这有效,但有没有更好的方法呢?拥有两个独立的数据库连接似乎有点过头了,以后可能会存在麻烦.

Gra*_*ray 12

您的评论表明您已经回答了问题.您当然可以使用ORMLite创建名为"_id"的列:

@DatabaseField(generatedId = true)
private int _id;
Run Code Online (Sandbox Code Playgroud)

要么

@DatabaseField(generatedId = true, columnName = "_id")
private int id;
Run Code Online (Sandbox Code Playgroud)

如果您正在使用Cursors,那么您可能需要查看该类的last()moveAbsolute(...)方法DatabaseResults.此外,AndroidDatabaseResults(您可以强制转换)还有一个getRawCursor()方法,它返回底层Cursor对象并具有附加getCount()getPosition()方法.

以下是有关ORMLite和Cursors的更多信息:

使用ORMLite的Android Cursor在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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我只是发现在光标使用时不能关闭迭代器(我猜是这样).你怎么处理?保持它并在`onDestroy()`中关闭它? (3认同)
  • 如果它是一个渴望获取的集合,则不需要关闭它.如果它是一个惰性集合,那么连接将对数据库保持打开状态,您需要将其关闭.如果你在Android CursorAdapter @Sebastian中,不知道如何做到这一点. (2认同)

Ste*_*v_k 6

事实证明我确实需要一个带有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);
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议