Android中的游标错误告诉我列不存在

时间:2011-05-01 17:18:55

标签: android sqlite cursor

我的应用程序需要返回包含一堆引号的游标,具体取决于所选的作者。现在,我正在对应用程序进行硬编码,因此它只会返回一个作者的引号。

错误发生在我的游标适配器参数中,设置“to”列,它告诉我该列“quote”不存在。

我尝试将to参数更改为KEY_QUOTE,甚至尝试更改实际数据库列的名称,但现在仍然很高兴。

我做错了什么?

以下是此操作中使用的代码块。

  1. 创建数据库表,报价
  2. 填充此表
  3. 查询报价
  4. 打开数据库连接,创建游标(我收到实际错误,使用“from”参数)
  5. 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
    

3 个答案:

答案 0 :(得分:6)

在CREATE_QUOTE_TABLE中,您使用“quote text not null”,并在logcat中显示:Caused by: java.lang.IllegalArgumentException: column 'myQuote' does not existKEY_QUOTE的价值是多少?它应该与表中的列名匹配。

测试此查询:

return qmDB.rawQuery("SELECT _id, myQuote, auth_name, category FROM Quotes WHERE auth_name=?", 
    new String[]{"'Robert Anton Wilson'"});

我相信你的问题不是查询试图检索不存在的列。我认为问题是你创建的光标没有你的适配器所需的所有信息(即,它是没有列的光标,而不是表格)。

答案 1 :(得分:2)

我不是百分百肯定,但可能是因为documentation声明要与CursorAdapter一起使用的Cursor需要包含一个引用“_id”列。

答案 2 :(得分:0)

您的'quote'语句可能会失败,因为'quote()'是函数的名称 - 请参阅core functions

尝试使用例如相反,'myQuote'作为列名。

相关问题