6

私のアプリは、選択した作成者に応じて、一連の引用を含むカーソルを返す必要があります。現在、アプリケーションをハード コーディングしているため、1 人の著者の引用のみが返されます。

カーソル アダプターのパラメーターでエラーが発生し、"to" 列を設定すると、この列 "quote" が存在しないことがわかります。

to パラメータを に変更KEY_QUOTEしようとしましたが、実際のデータベース列の名前を変更しようとしましたが、それでもまだ喜びです。

私は何を間違っていますか?

以下は、この操作で使用されるコードのブロックです。

  1. データベース テーブルの作成、Quotes
  2. このテーブルへの入力
  3. 引用符のクエリ
  4. データベース接続を開き、カーソルを作成します(「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
4

3 に答える 3

6

CREATE_QUOTE_TABLE では、「null でない引用テキスト」を使用し、logcat では次のように表示しますCaused by: java.lang.IllegalArgumentException: column 'myQuote' does not exist。の値はKEY_QUOTE? テーブルの列名と一致する必要があります。

このクエリをテストします。

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

あなたの問題は、クエリが存在しない列を取得しようとしたことではないと思います。問題は、作成したカーソルにアダプタが必要とするすべての情報が含まれていないことです (つまり、テーブルではなく列を持たないカーソルです)。

于 2011-05-01T18:11:44.333 に答える
2

100% 確実ではありませんが、CursorAdapter で使用することを目的とした Cursor には、「_id」列への参照を含める必要があるとドキュメントに記載されている可能性があります。

于 2011-05-01T18:37:23.610 に答える
0

「quote()」は関数の名前であるため、「quote」ステートメントは失敗する可能性があります -コア関数を参照してください。

代わりに、たとえば「myQuote」を列名として使用してみてください。

于 2011-05-01T17:29:32.770 に答える