Android 中的光标错误告诉我列不存在
我的应用程序需要返回包含一堆引号的光标,具体取决于所选的作者。现在,我正在对应用程序进行硬编码,因此它只会返回一位作者的引用。
该错误发生在我的光标适配器参数中,设置“to”列时,它告诉我该列“quote”不存在。
我尝试将 to 参数更改为 KEY_QUOTE,甚至尝试更改实际数据库列的名称,但现在仍然很高兴。
我做错了什么?
以下是此操作中使用的代码块。
- 创建数据库表,报价
- 填充此表
- 查询报价
- 打开数据库连接,创建游标(其中我收到实际错误,使用“from”参数)
1.
private static final String CREATE_QUOTE_TABLE =
"create table " + QUOTES_TABLE +
" (_id integer primary key autoincrement, " +
"auth_name text not null, " +
"myQuote text not null, " +
"category text not null);";
2.
public long populateQuotes(){
ContentValues initialValues = new ContentValues();
long[] rowIds = new long[authorName.length];
// Add wilson quotes category: Anthropology
for(int i = 0; i < 3; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[0]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
// Add wilson quotes category: RAW
for(int i = 3; i < 5; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[1]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
// Add wilson quotes category: Philosophy
for(int i = 5; i < 11; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[2]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
// Add wilson quotes category: General Semantics
for(int i = 11; i < 12; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[3]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
// Add wilson quotes category: Humor
for(int i = 11; i < 12; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[4]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
return rowIds[0];
}
3.
public Cursor getQuotes(){
/*
return qmDB.query(QUOTES_TABLE, new String[]{
KEY_QUOTE
},
KEY_AUTHNAME + "=" + "'Robert Anton Wilson'",
null,
null,
null,
null);*/
//String who = authorName[position];
return qmDB.rawQuery("SELECT _id as _id from Quotes WHERE auth_name = ?",
new String[]{"'Robert Anton Wilson'"});
}
4.
// Create DB connection and open.
dbm = new MyDBManager(this);
dbm.open();
// Call for the quotes to be queried, store results in cursor.
myCursor = dbm.getQuotes();
myCursor.moveToFirst();
// Column quote does not exist?
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.quoterow, myCursor, new String[]{"myQuote"}, new int[]{R.id.quote});
this.setListAdapter(mAdapter);
myCursor.close();
为了进一步说明,我已包括错误日志:
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): FATAL EXCEPTION: main
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.QuoteMachine/com.QuoteMachine.Quote}: java.lang.IllegalArgumentException: column 'myQuote' does not exist
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.access$2300(ActivityThread.java:135)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.os.Handler.dispatchMessage(Handler.java:99)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.os.Looper.loop(Looper.java:144)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.main(ActivityThread.java:4937)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at java.lang.reflect.Method.invokeNative(Native Method)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at java.lang.reflect.Method.invoke(Method.java:521)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at dalvik.system.NativeStart.main(Native Method)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): Caused by: java.lang.IllegalArgumentException: column 'myQuote' does not exist
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:87)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at com.QuoteMachine.Quote.onCreate(Quote.java:42)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): ... 11 more
My app is required to return a cursor containing a bunch of quotes, depending on the author chosen. Right now, I am hard coding the application so it will return only one author's quotes.
The error is occurring in my cursor adapter parameters, setting the "to" column, it tells me that this column, "quote", does not exist.
I have tried changing the to parameter to KEY_QUOTE
, and even tried changing the name of the actual database column but still now joy.
What am I doing wrong?
Below are the blocks of code used in this operation.
- Creating the database table, Quotes
- Populating this table
- Querying for the quotes
- Opening the database connection, cursor creation(where I am getting the actual error, with the "from" parameter)
1.
private static final String CREATE_QUOTE_TABLE =
"create table " + QUOTES_TABLE +
" (_id integer primary key autoincrement, " +
"auth_name text not null, " +
"myQuote text not null, " +
"category text not null);";
2.
public long populateQuotes(){
ContentValues initialValues = new ContentValues();
long[] rowIds = new long[authorName.length];
// Add wilson quotes category: Anthropology
for(int i = 0; i < 3; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[0]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
// Add wilson quotes category: RAW
for(int i = 3; i < 5; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[1]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
// Add wilson quotes category: Philosophy
for(int i = 5; i < 11; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[2]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
// Add wilson quotes category: General Semantics
for(int i = 11; i < 12; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[3]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
// Add wilson quotes category: Humor
for(int i = 11; i < 12; i++){
initialValues.put(KEY_AUTHNAME, authorName[3]);
initialValues.put(KEY_QUOTE, quoteRAW[i]);
initialValues.put(KEY_CATEGORY, category[4]);
rowIds[i] = qmDB.insertOrThrow(QUOTES_TABLE, null, initialValues);
}
return rowIds[0];
}
3.
public Cursor getQuotes(){
/*
return qmDB.query(QUOTES_TABLE, new String[]{
KEY_QUOTE
},
KEY_AUTHNAME + "=" + "'Robert Anton Wilson'",
null,
null,
null,
null);*/
//String who = authorName[position];
return qmDB.rawQuery("SELECT _id as _id from Quotes WHERE auth_name = ?",
new String[]{"'Robert Anton Wilson'"});
}
4.
// Create DB connection and open.
dbm = new MyDBManager(this);
dbm.open();
// Call for the quotes to be queried, store results in cursor.
myCursor = dbm.getQuotes();
myCursor.moveToFirst();
// Column quote does not exist?
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.quoterow, myCursor, new String[]{"myQuote"}, new int[]{R.id.quote});
this.setListAdapter(mAdapter);
myCursor.close();
For further clarification I have included the error log:
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): FATAL EXCEPTION: main
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.QuoteMachine/com.QuoteMachine.Quote}: java.lang.IllegalArgumentException: column 'myQuote' does not exist
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2787)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2803)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.access$2300(ActivityThread.java:135)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2136)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.os.Handler.dispatchMessage(Handler.java:99)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.os.Looper.loop(Looper.java:144)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.main(ActivityThread.java:4937)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at java.lang.reflect.Method.invokeNative(Native Method)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at java.lang.reflect.Method.invoke(Method.java:521)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at dalvik.system.NativeStart.main(Native Method)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): Caused by: java.lang.IllegalArgumentException: column 'myQuote' does not exist
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:87)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at com.QuoteMachine.Quote.onCreate(Quote.java:42)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1069)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2751)
05-01 18:38:13.876: ERROR/AndroidRuntime(1455): ... 11 more
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
在 CREATE_QUOTE_TABLE 中,您使用“quote text not null,”,并在 logcat 中显示:
Caused by: java.lang.IllegalArgumentException: column 'myQuote' does not Exist
。KEY_QUOTE
的值是多少?它应该与表中的列名称匹配。测试此查询:
我相信您的问题不是查询尝试检索不存在的列。我认为的问题是您创建的游标没有适配器所需的所有信息(即,游标没有列,而不是表)。
In CREATE_QUOTE_TABLE you use "quote text not null, ", and in the logcat you show:
Caused by: java.lang.IllegalArgumentException: column 'myQuote' does not exist
. What's the value ofKEY_QUOTE
? It should match the column name in the table.Test this query:
I believe your problem was not that the query tried to retrieve a column that was not there. The problem I believe is that the cursor you created does not have all the information needed by your adapter (i.e., it's the cursor that does not have the column, not the table).
我不是 100% 确定,但这可能是因为 文档声明要与 CursorAdapter 一起使用的 Cursor 需要包含“_id”列的引用。
I'm not 100% sure, but it might be because the documentation states that a Cursor intented to be used with the CursorAdapter needs to contain a reference an "_id" column.
您的“quote”语句可能会失败,因为“quote()”是函数的名称 - 请参阅核心函数< /a>.
尝试使用“myQuote”作为列名称。
Your 'quote' statement may fail, because 'quote()' is the name of a function - see core functions.
Try using e.g. 'myQuote' as column name instead.