Android Can';t获取SimpleCursorAdapter以填充ListView
我正在尝试编写一个简单的内容提供程序,并使用以下引用填充ListView: 我看了这条线,但它似乎不是我的问题: 数据库似乎正常工作,但当我尝试绑定到我的ListView时,它会给出一个缺少列“_id”的错误,但我有它,因为我可以毫无问题地记录数据库的内容。下面是代码片段: 记录数据库(这很有效!): 正在尝试填充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
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;
}