在 CursorAdapter 中使用带有 ORMLite 的 Android 游标

Posted

技术标签:

【中文标题】在 CursorAdapter 中使用带有 ORMLite 的 Android 游标【英文标题】:Android Cursor with ORMLite to use in CursorAdapter 【发布时间】:2011-11-01 20:31:09 【问题描述】:

有什么方法可以让我正在使用 ORMLite Dao 对象处理的查询获取光标?

【问题讨论】:

【参考方案1】:

ORMLite 现在支持next(), previous(), moveRelative(offset), ... CloseableIterator class 上的方法。这应该允许您随意移动底层的Cursor 对象。

它还支持以下DAO Cursor方法:

dao.mapSelectStarRow(databaseResults) 将查询的数据库结果中的最新行返回到select *。有了这个,您可以更改光标位置(例如),然后获取当前对象。 dao.getSelectStarRowMapper() 提供了一个映射器,您可以使用它来映射 Dao 之外的对象。

当您使用ORMLite 构建自己的查询时,您使用QueryBuilder 对象。 queryBuilder.prepare() 返回一个 PreparedQuery,它被 DAO 中的各种方法使用。您可以调用dao.iterator(preparedQuery),它将返回一个CloseableIterator,用于遍历结果。有一个iterator.getRawResults() 可以访问DatabaseResults 类。在 android 下,可以将其强制转换为 AndroidDatabaseResults,其上有一个 getCursor() 方法以返回 Android 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();

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

【讨论】:

如何获取databaseConnection? 我已经更改了这个答案,以展示如何在不需要数据库连接的情况下完成。 @Gray 非常感谢您对 SO 特别是关于 ORMLite 的贡献,tnx @Gray 在使用此策略并将光标传递给我自己与 Android Grid/ListView 一起使用的 SimpleCursorAdapterCursorAdapter 子类时,我得到一个 StaleDataException - 我注意到注释掉iterator.closeQuietly() 可以防止这种情况发生。你会建议什么来解决这个问题——除了在我完成光标之前保留迭代器? @Mark 是的,同样的问题。你最后做了什么?【参考方案2】:

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

【讨论】:

既然您可以在 ormlite 中命名您的列,我猜为什么不直接将它们命名为 _id,而不是将其选择为 :)? 当然可以,但是在不能重命名它们的情况下,您只需使用“as”的sql语法;)【参考方案3】:

如果您在 Activity 中并且不想弄乱 QueryBuilder,请尝试以下方法,这同样有效。

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

【讨论】:

【参考方案4】:

如果你的意思是 getHelper() 方法到达 dao 方法 create 等,你只需要从 OrmLiteBaseActivity&lt;YourDBHelper&gt; 继承就可以调用它。它看起来像这样:

public class YourClass extends OrmLiteBaseActivity<YourDBHelper> 
  @Override
  protected void onCreate(Bundle savedInstanceState) 
     ...
     getHelper().getDao().queryForAll();
     ...
  

如果你的意思是用游标来处理数据库操作:我不认为你可以达到它!但我不明白你为什么需要它。 ORMLite 几乎具有游标的所有功能。那你需要它干什么?

【讨论】:

这个我知道,但是我需要让Cursor在CursorAdapter中使用它。

以上是关于在 CursorAdapter 中使用带有 ORMLite 的 Android 游标的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 CursorAdapter 时 ListView 未显示在活动中

在 cursoradapter 中从 ListView 中删除项目

带有自定义 CursorAdapter 的 Android ListFragment 不显示数据

VFP CursorAdapter 起步二(作者:Dung Hennig 译者:fbilo)

如何使用CursorAdapter将Filter设置为ListView?

在 searchview 中键入时如何更改 listview-cursoradapter 中搜索文本的背景颜色?