【问题标题】:ORMLite with CursorAdapter in AndroidAndroid 中带有 CursorAdapter 的 ORMLite
【发布时间】:2012-09-07 04:08:44
【问题描述】:

我正在修改我的 Android 应用程序以使用 ORMLite,它目前使用许多 CursorAdapter,我非常想保留它们以尽量减少编码。

我不是 100% 确定,但似乎当 ORMLite 在数据库中创建一个 id 字段时,它总是使用id,而 CursorAdapter 需要_id

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

select id as _id ......

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

这行得通,但是有没有更好的方法呢?拥有两个独立的数据库连接似乎有点过头了,而且以后可能会存储麻烦。

【问题讨论】:

  • 对不起,这个问题似乎是虚假的。我错了,可以用 ORMLite 命名列 _id,所以我建议删除这个问题以避免混淆,除非有人很快有任何进一步的补充..
  • 与其删除它,我建议您回答它是如何修复它的——有人可能会觉得这很有帮助,尤其是关于您如何创建光标以使用 ORM 的代码示例
  • 在下面做了。你是对的 - 删除没有用,我只是担心人们会偶然发现这种类型的错误信息,这会让人们失去嗅觉,但答案是仔细阅读!

标签: android ormlite android-cursoradapter


【解决方案1】:

用另一个将"_id" 视为真正主键列的别名的光标包裹您的光标。示例:

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

【讨论】:

    【解决方案2】:

    您的 cmets 表明您已经回答了您的问题。您当然可以使用ORMLite 创建一个名为“_id”的列:

    @DatabaseField(generatedId = true)
    private int _id;
    

    @DatabaseField(generatedId = true, columnName = "_id")
    private int id;
    

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

    这里有更多关于 ORMLite 和Cursors 的信息:

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

    【讨论】:

    • 我刚刚发现在使用游标时不能关闭迭代器(我猜是这样)。你怎么处理?保留它并在onDestroy() 中关闭它?
    • 如果是 Eager fetched 集合,则不需要关闭。如果它是一个惰性集合,那么与数据库的连接将保持打开状态,您将需要关闭它。如果您在 Android CursorAdapter @Sebastian 中,不知道该怎么做。
    • 对不起一个新手问题:默认情况下集合是惰性的吗?我遇到了与@Sebastian 相同的问题,在使用游标时关闭迭代器导致崩溃。现在,我将光标从 Datamanager 类传递给列表片段和自定义 cursorAdapter。它可以工作,但我不确定何时何地释放迭代器。
    【解决方案3】:

    事实证明,毕竟我确实需要一个带有 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);
        }
    }
    

    感谢您的建议

    【讨论】:

    • 仅供参考:我们在 4.22 版中向 ORMLite 添加了左连接功能。它刚刚发布。
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2016-01-29
    相关资源
    最近更新 更多