SimpleCursorAdapter无法在数据库中找到列

时间:2014-01-03 20:28:10

标签: android android-listview simplecursoradapter

我发现了这个问题: App Closes with this error - requesting column name with table name 这是接近我的问题,但不完全是,或者至少我认为我已经解决了该问题中的解决方案(即创建一个_id列而不是使用一个字符串而不是我的数组中的两个字符串),仍然没有运气。 还发现了这个问题:ContactsContract query column 'display_name' does not exist 这更接近我的问题,但我认为它没有应用。也许我不理解那个答案。

这是我遇到问题的功能。

private void fillData() {
    String[] from = new String[] { EventTable.COLUMN_KIDNAME, 
        EventTable.COLUMN_KIDRUNNINGTOTAL};
    int[] to = new int[] { android.R.id.text1, android.R.id.text2 };

    getLoaderManager().initLoader(0, null, this);
    adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2,
        null, from, to, 0);         
    setListAdapter(adapter);
}

在上面我将第三个参数(cursor)设置为null,我也尝试创建一个如下所示的游标并得到相同的错误。

String[] eventProjection = { EventTable.COLUMN_ID, EventTable.COLUMN_TASKITEM,     
    EventTable.COLUMN_KIDNAME,
    EventTable.COLUMN_KIDRUNNINGTOTAL, EventTable.COLUMN_DATEDONE };

Uri fillUri = Uri.parse(MyContentProvider.CONTENT_URI + "/");
Cursor someCursor = getContentResolver().query(fillUri, eventProjection, null, null, null);
adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2,
    someCursor, from, to, 0);

我不认为此功能有任何问题,但它是错误信息的一部分

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    adapter.swapCursor(data);
}

我在没有任何问题的情况下在另一个活动中查询数据库,因此我非常确信列中实际存在的列。这是数据库创建块:

public static final String TABLE_EVENT = "event";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TASKITEM ="taskItem";
public static final String COLUMN_KIDNAME = "kidName";
public static final String COLUMN_KIDRUNNINGTOTAL = "kidRunningTotal";
public static final String COLUMN_DATEDONE = "dateDone";

// Database creation SQL statement
private static final String TABLE_CREATE = "create table " 
    + TABLE_EVENT
    + "(" 
    + COLUMN_ID + " integer primary key autoincrement, " 
    + COLUMN_TASKITEM + " text not null, " 
    + COLUMN_KIDNAME + " text not null,"
    + COLUMN_KIDRUNNINGTOTAL + " float not null,"
    + COLUMN_DATEDONE  + " datetime default current_timestamp"
    + ");";

public static void onCreate(SQLiteDatabase database) {
    database.execSQL(TABLE_CREATE);
}

应用程序会在主要活动开始时立即抛出此错误,这当然会导致应用程序死亡。当我在上面的from字符串数组赋值中替换EventTable.COLUMN_KIDRUNNINGTOTAL的EventTable.COLUMN_ID时,它可以工作,但当然它返回记录ID列,我想要COLUMN_KIDRUNNINGTOTAL列。

我只使用一列EventTable.COLUMN_KIDNAME尝试了代码,当然修改了from和to数组以及布局,它运行正常。我已经单独尝试了所有其他列,但没有一个能够工作,当然除了COLUMN_ID。我很困惑为什么一栏有效,但其余的则没有。

这里是完整的堆栈跟踪错误。对不起,如果这很难看,我无法弄清楚如何正确发布日志。

01-03 14:33:41.580: D/AndroidRuntime(21838): Shutting down VM
01-03 14:33:41.580: W/dalvikvm(21838): threadid=1: thread exiting with uncaught exception (group=0x415c2930)
01-03 14:33:41.666: E/AndroidRuntime(21838): FATAL EXCEPTION: main
01-03 14:33:41.666: E/AndroidRuntime(21838): java.lang.IllegalArgumentException: column 'kidRunningTotal' does not exist
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:333)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at  android.widget.SimpleCursorAdapter.swapCursor(SimpleCursorAdapter.java:345)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at net.example.OverviewActivity.onLoadFinished(OverviewActivity.java:152)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at net.example.OverviewActivity.onLoadFinished(OverviewActivity.java:1)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:483)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:451)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.content.Loader.deliverResult(Loader.java:143)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.content.CursorLoader.deliverResult(CursorLoader.java:113)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.content.CursorLoader.deliverResult(CursorLoader.java:43)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:254)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:91)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.os.AsyncTask.finish(AsyncTask.java:631)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.os.AsyncTask.access$600(AsyncTask.java:177)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.os.Looper.loop(Looper.java:137)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at android.app.ActivityThread.main(ActivityThread.java:5041)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at java.lang.reflect.Method.invokeNative(Native Method)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at java.lang.reflect.Method.invoke(Method.java:511)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-03 14:33:41.666: E/AndroidRuntime(21838):    at dalvik.system.NativeStart.main(Native Method)
01-03 14:33:44.463: I/Process(21838): Sending signal. PID: 21838 SIG: 9

感谢您的帮助。

0 个答案:

没有答案