Android中带游标适配器的ORMLite

Android中带游标适配器的ORMLite,android,ormlite,android-cursoradapter,Android,Ormlite,Android Cursoradapter,我正在修改我的Android应用程序以与ORMLite配合使用,目前它使用了大量的CursorAdapter,我很想保留这些,以尽量减少编码 我不是100%确定,但是当ORMLite在db中创建id字段时,它总是使用id,而CursorAdapter需要\u id 可以使用如下查询绕过此问题: select id as _id ...... // build your query QueryBuilder<Foo, String> qb = fooDao.queryBuilder(

我正在修改我的Android应用程序以与ORMLite配合使用,目前它使用了大量的CursorAdapter,我很想保留这些,以尽量减少编码

我不是100%确定,但是当ORMLite在db中创建id字段时,它总是使用
id
,而CursorAdapter需要
\u id

可以使用如下查询绕过此问题:

select id as _id ......
// 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();
}
但是
Dao.queryRaw()
方法返回一个列表,而不是游标,因此我所做的是打开另一个SQLiteOpenHelper数据库连接并使用
rawQuery()


这是可行的,但是有没有更好的方法呢?拥有两个独立的数据库连接似乎有些过分,可能会在以后存储问题。

您的评论表明您已经回答了问题。您当然可以使用以下方法创建名为“\u id”的列:

如果您使用的是
Cursor
s,则可能需要查看
DatabaseResults
类上的
last()
moveAbsolute(…)
方法。此外,(您可以强制转换到的)还有一个
getRawCursor()
方法,该方法返回基础
Cursor
对象,并有其他
getCount()
getPosition()
方法

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

您可以通过以下方式访问
光标

select id as _id ......
// 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();
}
//生成查询
QueryBuilder qb=fooDao.QueryBuilder();
qb.where()。。。;
//完成后,准备查询并构建迭代器
CloseableIterator迭代器=dao.iterator(qb.prepare());
试一试{
//获取可以在Android下播放的原始结果
AndroidDatabaseResults结果=
(AndroidDatabaseResults)迭代器。getRawResults();
Cursor=results.getRawCursor();
...
}最后{
迭代器;
}

事实证明,我确实需要使用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);
    }
}

感谢您的建议

用另一个将
“\u id”
视为实际主键列别名的光标包装起来。例如:

cursor = new CursorWrapper(cursor) {
                @Override
                public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException {
                    if ("_id".equals(columnName)) columnName = "id";
                    return super.getColumnIndexOrThrow(columnName);
                }
            };

对不起,这个问题似乎是假的。我错了,可以用ORMLite来命名列_id,所以我建议删除这个问题以避免混淆,除非有人很快有进一步的补充。与其删除它,我建议你用你如何修复它来回答它——有人可能会觉得这很有帮助,特别是有关如何创建光标以使用ORMhave的代码示例,请参见下文。你说得对-删除没有用,我只是担心人们会无意中发现这种错误信息,这会让人们感到不舒服,但答案是要仔细阅读!仅供参考:我们在4.22版中添加了ORMLite的左连接功能。它刚刚发布,我刚刚发现在使用游标时不能关闭迭代器(我猜是这样的)。你是怎么处理的?保留它并在
onDestroy()
中关闭它?如果它是一个急切获取的集合,则不需要关闭它。如果它是一个惰性集合,那么将保持与数据库的连接打开,您需要关闭它。如果你在Android CursorAdapter@Sebastian中,不知道该怎么做。很抱歉,有个新手问:a集合是否默认为懒惰的?我遇到了与@Sebastian相同的问题,在使用游标时关闭迭代器导致崩溃。现在,我正在将游标从Datamanager类传递到列表片段和自定义游标适配器。它可以工作,但我不确定何时何地释放迭代器。请看这里: