13

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

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

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

select id as _id ......

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

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

4

3 回答 3

11

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

@DatabaseField(generatedId = true)
private int _id;

或者

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

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

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

在 CursorAdapter 中使用带有 ORMLite 的 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();
}
于 2012-09-14T13:17:39.973 回答
5

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

谢谢你的建议

于 2012-09-14T13:26:47.347 回答
0

用另一个将您的光标包装"_id"为您的真实主键列的别名的光标。例子:

cursor = new CursorWrapper(cursor) {
                @Override
                public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException {
                    if ("_id".equals(columnName)) columnName = "id";
                    return super.getColumnIndexOrThrow(columnName);
                }
            };
于 2020-02-19T13:15:14.877 回答