Android:如何创建自己的光标类?

| 我在Android中使用Sqlite,并且要从数据库中获取值,请使用以下方法:
Cursor cursor = sqliteDatabase.rawQuery(\"select title,category from table\", null);

int columnIndexTitle = cursor.getColumnIndex(\"title\");
iny columnIndexCategory = cursor.getColumnIndex(\"category\");

cursor.moveToFirst();
while (cursor.moveToNext()) {
    String title = cursor.getString(columnIndexTitle);  
    String category = cursor.getString(columnIndexCategory);    
}
cursor.close();
我想创建自己的Cursor,以便可以用一种方法来做
getColumnIndex()
getString()
。像这样:
String title = cursor.getString(\"title\");
我想创建自己的类来扩展从
sqliteDatabase.rawQuery
获得的游标,但是我不确定如何实现此目的。我应该扩展SQLiteCursor还是应该怎么做?可能吗,这是个好主意吗?     
已邀请:
创建自己的getString会导致每个调用的映射查找,而不仅仅是getColumnIndex。 这是SQLiteCursor.getColumnIndex和AbstractCursor.getColumnIndex的代码。如果您有很多行,减少对该函数的调用将防止不必要的字符串处理和映射查找。     
我遇到了这个问题,正在寻找创建自定义
Cursor
SQLiteDatabase
一起使用的最佳方法。在我的情况下,我需要向Cursor提供一个额外的属性,以携带更多的信息,所以我的用例与问题的内容并不完全相同。发表我的发现,希望对您有所帮助。 对我来说,最棘手的部分是SQLiteDatabase查询方法返回一个Cursor,我需要将自定义子类传递给Cursor。 我在Android API中找到了解决方案:使用CursorWrapper类。似乎正是为此目的而设计的。 班级:
public class MyCustomCursor extends CursorWrapper {

    public MyCustomCursor(Cursor cursor) {
        super(cursor);
    }

    private int myAddedAttribute;

    public int getMyAddedAttribute() {
        return myAddedAttribute;
    }

    public void setMyAddedAttribute(int myAddedAttribute) {
        this.myAddedAttribute = myAddedAttribute;
    }

}
用法:
public MyCustomCursor getCursor(...) {
    SQLiteDatabase DB = ...;
    Cursor rawCursor = DB.query(...);
    MyCustomCursor myCursor = new MyCustomCursor(rawCursor);
    myCursor.setMyAddedAttribute(...);
    return myCursor;
}
    
我不会扩展它,我会做一个助手:
class MartinCursor {
    private Cursor cursor;

    MartinCursor(Cursor cursor) {
        this.cursor = cursor;
    }

    String getString(String column) {
        ....
    }
}
要么
class MartinCursorHelper {
    static String getString(Cursor cursor, String column) {
        ....
    }
}
就个人而言,我愿意做后者,除非您讨厌一直不愿提供这种额外的论点。 编辑:我忘了提pydave的要点:如果您在循环中调用它,您将为明显的性能影响做好准备。首选方法是一次查找索引,将其缓存,然后使用该索引。     
您应该使用Android SDK中已经存在的DatabaseUtils.stringForQuery()静态方法轻松地检索值,此示例适用于
String
bot,还有适用于
Long
的方法
stringForQuery(SQLiteDatabase db, String query, String[] selectionArgs)
在数据库上运行查询并在第一行的第一列中返回值的实用程序方法。 就像是
String myString=DatabaseUtils.stringForQuery(getDB(),query,selectionArgs);
    
遇到了这个问题,寻找了不同的解决方案,但是我想添加一下,因为我认为答案并不令人满意。 您可以轻松创建自己的游标类。为了允许需要Cursor的函数接受它,它必须扩展AbstractCursor。为了克服系统不使用您的类的问题,您只需将您的类包装。 这里有一个很好的例子。 https://android.googlesource.com/platform/packages/apps/Contacts/+/8df53636fe956713cc3c13d9051aeb1982074286/src/com/android/contacts/calllog/ExtendedCursor.java
public class ExtendedCursor extends AbstractCursor {
/** The cursor to wrap. */
private final Cursor mCursor;
/** The name of the additional column. */
private final String mColumnName;
/** The value to be assigned to the additional column. */
private final Object mValue;
/**
 * Creates a new cursor which extends the given cursor by adding a column with a constant value.
 *
 * @param cursor the cursor to extend
 * @param columnName the name of the additional column
 * @param value the value to be assigned to the additional column
 */
public ExtendedCursor(Cursor cursor, String columnName, Object value) {
    mCursor = cursor;
    mColumnName = columnName;
    mValue = value;
}
@Override
public int getCount() {
    return mCursor.getCount();
}
@Override
public String[] getColumnNames() {
    String[] columnNames = mCursor.getColumnNames();
    int length = columnNames.length;
    String[] extendedColumnNames = new String[length + 1];
    System.arraycopy(columnNames, 0, extendedColumnNames, 0, length);
    extendedColumnNames[length] = mColumnName;
    return extendedColumnNames;
}
这就是它如何工作的总体思路。 现在要解决问题了。为了防止性能下降,请创建一个散列来保存列索引。这将用作缓存。调用getString时,请检查列索引的哈希值。如果它不存在,则使用getColumnIndex获取它并缓存它。 抱歉,我目前无法添加任何代码,但是我在移动设备上,因此以后会尝试添加一些代码。     

要回复问题请先登录注册