Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Can';t获取SimpleCursorAdapter以填充ListView_Android_Android Layout_Listview_Simplecursoradapter - Fatal编程技术网

Android Can';t获取SimpleCursorAdapter以填充ListView

Android Can';t获取SimpleCursorAdapter以填充ListView,android,android-layout,listview,simplecursoradapter,Android,Android Layout,Listview,Simplecursoradapter,我正在尝试编写一个简单的内容提供程序,并使用以下引用填充ListView: 我看了这条线,但它似乎不是我的问题: 数据库似乎正常工作,但当我尝试绑定到我的ListView时,它会给出一个缺少列“_id”的错误,但我有它,因为我可以毫无问题地记录数据库的内容。下面是代码片段: 记录数据库(这很有效!): 正在尝试填充listview(缺少列?为什么) 输出日志: D/GMO_CONTENT_PROVIDER: 9 : Joe D/GMO_CONTENT_PROVIDER: 10 : Mary

我正在尝试编写一个简单的内容提供程序,并使用以下引用填充ListView:

我看了这条线,但它似乎不是我的问题:

数据库似乎正常工作,但当我尝试绑定到我的ListView时,它会给出一个缺少列“_id”的错误,但我有它,因为我可以毫无问题地记录数据库的内容。下面是代码片段:

记录数据库(这很有效!):

正在尝试填充listview(缺少列?为什么)

输出日志:

D/GMO_CONTENT_PROVIDER: 9 : Joe
D/GMO_CONTENT_PROVIDER: 10 : Mary
E/GMO_CONTENT_PROVIDER: java.lang.IllegalArgumentException: column '_id' does not exist
以下是数据库创建:

private SQLiteDatabase sqlDB;
static final String DATABASE_NAME = "myPatients";
static final String TABLE_NAME = "patients";
static final String CREATE_DB_TABLE = "CREATE TABLE " + TABLE_NAME +
        "(id INTEGER PRIMARY KEY AUTOINCREMENT, " + " name TEXT NOT NULL);";

    // bunch of code

    @Override
    public void onCreate(SQLiteDatabase sqlDB) {
        try {
            sqlDB.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            sqlDB.execSQL(CREATE_DB_TABLE);
        } catch (Exception e) {
            Log.e(TEST_CONTENT_PROVIDER, e.toString());
        }
    }
和查询覆盖,这是有效的

@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(TABLE_NAME);
    switch (uriMatcher.match(uri)) {
        case uriCode:
            queryBuilder.setProjectionMap(values);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
    }
    Cursor cursor = queryBuilder.query(sqlDB, projection, selection, selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
}
非常感谢您的帮助

正确答案:


SimpleCursorAdapter要求游标的结果集必须包含一个名为“_id”的列。

what is
startManagingCursor(游标)正在做什么?请确保在使用后关闭光标。@MuraliPrajapati当然,在将光标与
CursorAdapter
@pskink一起使用时,您不能
close()方法。能否尝试将数据库合同和投影中的列名从“id”更改为“_id”?@Srichakradhar这是正确的。谢谢
private SQLiteDatabase sqlDB;
static final String DATABASE_NAME = "myPatients";
static final String TABLE_NAME = "patients";
static final String CREATE_DB_TABLE = "CREATE TABLE " + TABLE_NAME +
        "(id INTEGER PRIMARY KEY AUTOINCREMENT, " + " name TEXT NOT NULL);";

    // bunch of code

    @Override
    public void onCreate(SQLiteDatabase sqlDB) {
        try {
            sqlDB.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            sqlDB.execSQL(CREATE_DB_TABLE);
        } catch (Exception e) {
            Log.e(TEST_CONTENT_PROVIDER, e.toString());
        }
    }
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
    SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
    queryBuilder.setTables(TABLE_NAME);
    switch (uriMatcher.match(uri)) {
        case uriCode:
            queryBuilder.setProjectionMap(values);
            break;
        default:
            throw new IllegalArgumentException("Unknown URI " + uri);
    }
    Cursor cursor = queryBuilder.query(sqlDB, projection, selection, selectionArgs, null, null, sortOrder);
    cursor.setNotificationUri(getContext().getContentResolver(), uri);
    return cursor;
}