安卓SQLite - 游标和内容值

27

有没有办法从SQLite中获取ContentValues对象?

我们可以将ContentValues插入到数据库中,从那里获取CV会更加有用。

5个回答

61
你可以使用 cursorRowToContentValues(Cursor cursor, ContentValues values) 方法,该方法属于 DatabaseUtils 类。
示例:
Cursor c = db.query(tableName, 
            tableColumn, 
            where, 
            whereArgs,
            groupBy,
            having,
            orderBy);

ArrayList<ContentValues> retVal = new ArrayList<ContentValues>();
ContentValues map;  
if(c.moveToFirst()) {       
   do {
        map = new ContentValues();
        DatabaseUtils.cursorRowToContentValues(c, map);                 
        retVal.add(map);
    } while(c.moveToNext());
}

c.close();  

3

我写了自己的版本 DatabaseUtils.cursorRowToContentValues 方法,以避免 David-mu 提到的 解析布尔值时出现的 bug。该方法要求 Cursor 根据 SQL 数据库中的类型来解析整数和浮点数,而不是在调用 ContentValues 中的方法时再进行解析。

public static ContentValues cursorRowToContentValues(Cursor cursor) {
    ContentValues values = new ContentValues();
    String[] columns = cursor.getColumnNames();
    int length = columns.length;
    for (int i = 0; i < length; i++) {
        switch (cursor.getType(i)) {
            case Cursor.FIELD_TYPE_NULL:
                values.putNull(columns[i]);
                break;
            case Cursor.FIELD_TYPE_INTEGER:
                values.put(columns[i], cursor.getLong(i));
                break;
            case Cursor.FIELD_TYPE_FLOAT:
                values.put(columns[i], cursor.getDouble(i));
                break;
            case Cursor.FIELD_TYPE_STRING:
                values.put(columns[i], cursor.getString(i));
                break;
            case Cursor.FIELD_TYPE_BLOB:
                values.put(columns[i], cursor.getBlob(i));
                break;
        }
    }
    return values;
}

2
你可以去thenewboston,这里有一份SQLite的教程(以及使用ContentValues)从111到124:D。

无论如何,他所讲的关于ContentValues的内容在第117节。

祝你好运:D

附注:但他也使用了Cursor :)


1
不行,你必须使用游标和老式的查询来完成。如果查询能够返回一个CV对象数组,我会很高兴的。

0

不行,你必须使用 Cursor


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接