在CursorAdapter中使用带ORMLite的Android游标

在CursorAdapter中使用带ORMLite的Android游标,android,sqlite,cursor,ormlite,Android,Sqlite,Cursor,Ormlite,有没有办法,如何为我正在使用ORMLite Dao对象处理的查询获取游标?如果您指的是到达Dao方法创建等的getHelper()方法,那么您只需从OrmLiteBaseActivity继承即可调用它。它看起来像这样: public class YourClass extends OrmLiteBaseActivity<YourDBHelper> { @Override protected void onCreate(Bundle savedInstanceState) {

有没有办法,如何为我正在使用ORMLite Dao对象处理的查询获取游标?

如果您指的是到达Dao方法创建等的
getHelper()
方法,那么您只需从
OrmLiteBaseActivity
继承即可调用它。它看起来像这样:

public class YourClass extends OrmLiteBaseActivity<YourDBHelper> {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
     ...
     getHelper().getDao().queryForAll();
     ...
  }
}
public类YourClass扩展了ormlitebase活动{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
...
getHelper().getDao().queryForAll();
...
}
}
如果你指的是处理数据库操作的光标:我认为你够不着它!但我不明白你为什么需要它。ORMLite几乎具有光标的所有功能。那么您需要它做什么呢?

现在支持
next()
previous()
moveRelative(offset)
。。。方法在网上。这应该允许您随意移动基础
光标
对象

它还支持以下DAO游标方法:

  • 将查询的数据库结果中的最新行返回到
    select*
    。使用此选项,您可以更改光标位置(例如),然后获取当前对象
  • 提供一个映射器,可用于映射Dao外部的对象

使用构建自己的查询时,使用
QueryBuilder
对象
queryBuilder.prepare()
返回一个
PreparedQuery
,DAO中的各种方法使用该查询。您可以调用
dao.iterator(preparedQuery)
,它将返回一个
CloseableIterator
,用于遍历结果。有一个
迭代器.getRawResults()
来访问
数据库结果
类。在Android下,可以将其转换为一个
AndroidDatabaseResults
,其上有一个
getCursor()
方法来返回Android
光标

类似于以下代码:

// 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();
...
}最后{
迭代器;
}

这有点复杂,但您肯定必须在vale后面查看,才能找到这个被数据库抽象类隐藏的对象。

您是否尝试过Gray在post中的一些建议?他解释了如何选择一个列作为另一个名称,例如,选择id作为_id。

如果您正在进行一项活动,并且不想与QueryBuilder为伍,请尝试以下操作,这同样有效

Cursor cursor = getHelper().getReadableDatabase().query(tableName, projection, selection, selectionArgs, groupBy, having, sortOrder)

我知道这一点,但我需要让Cursor在CursorAdapter中使用它。我如何获得数据库连接?我已更改了此答案,以说明如何在不需要数据库连接的情况下完成此操作。@Gray非常感谢您对ORMLite的特别贡献, tnx@Gray在Android Grid/ListView中使用此策略并将光标交给我自己使用的
SimpleCursorAdapter
CursorAdapter
子类时,我得到了一个
StaleDataException
——我注意到注释掉
迭代器。closequity()
可以防止这种情况发生。除了保持迭代器在我使用完光标之前保持不变之外,您建议如何解决这个问题?@markyes,这里也有同样的问题。你最终做了什么?既然你可以在ormlite中命名你的列,我想为什么不直接将它们命名为_id,而不是选择为:)?当然可以,但在不能重命名它们的情况下,你只需使用sql语法“as”;)