1

私がしたいのは、データベース内のエントリの 1 つに等しい文字列を設定することだけです。私がアクセスしているテーブルには、(ID 列以外に) 1 つの列があります。私はしばらくこれに苦労しており、同様の質問が寄せられていますが、この状況を機能させることができません. SQLite の他のいくつかのコマンドには慣れていますが、まだ初心者です。これが私が持っているものです。このメソッドが機能すると、葯クラスからの呼び出しが正常に機能すると確信しています。

StringCategory_Table と COLUMN_CATEGORIES の両方が文字列として定義されていることに注意してください。

私のデータベースは次のように作成されました(以下の方法を除く他のすべてで正常に機能します):

db.execSQL("CREATE TABLE " + StringCategory_Table + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_CATEGORIES + " TEXT NOT NULL);");

問題のメソッドは次のとおりです (SQLite オープン ヘルパーを使用してデータベース クラスで作成)。

public String getCategory(int catId){
Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES  + " FROM "+ StringCategory_Table +" WHERE " + _ID + " = " + catId, null);

//i no longer use this line:String strCatName = mycursor.toString();


String strCatName = mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES));

        return strCatName;
    }

上記のコードのログキャットは次のとおりです。

09-04 20:05:47.764: E/AndroidRuntime(9232): FATAL EXCEPTION: main
09-04 20:05:47.764: E/AndroidRuntime(9232): java.lang.RuntimeException: Unable to instantiate activity  ComponentInfo{com.mypackage.namespace/com.mypackage.namespace.MyCurrentRestaurants}: java.lang.NullPointerException
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread.access$600(ActivityThread.java:123)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.os.Looper.loop(Looper.java:137)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at java.lang.reflect.Method.invokeNative(Native Method)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at java.lang.reflect.Method.invoke(Method.java:511)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-04 20:05:47.764: E/AndroidRuntime(9232):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)

この質問を削除するのではなく、問題が何であったかを説明します (コメントを掘り下げるのは面倒なので):

  1. 私が行っていたように、クラス文字列を SQLite エントリに割り当てることはできません。代わりに、データベースから読み取る前にデータベースを開く必要があります。データベースから読み取る前にデータベースを開く必要があるため、SQLite データベース クラスのインスタンスを作成する必要があります。
  2. 私はカーソルを使用しているので、何かが機能する前に moveToFirst メソッドを使用する必要があります。

今日私を助けてくれたすべての人に感謝します。私と同じように混乱している人々に誤解を広めたくないので、これらの結論が間違っている場合はお知らせください. アダム

4

4 に答える 4

1

カーソルを最初の結果に移動するのを忘れたようです。代わりにこれを試してください:

public String getCategory(int catId){
    Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES  + " FROM " + StringCategory_Table +" WHERE " + _ID + " = " + catId, null);

    // Check if the row exists, return it if it does
    if(mycursor.moveToFirst())
        return mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES));

    // No rows match id
    return "";
}
于 2012-09-04T19:27:12.427 に答える
1

これを試して、

public String getCategory(int catId){
        Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES  + " FROM "+ StringCategory_Table +" WHERE " + _ID + " = " + catId, null);
      if(mycursor.moveToFirst()){ //Edited based on suggestion from SAM
          String strCatName = mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES));
                  return strCatName;
        } else {
        return null;
         }


        }
于 2012-09-04T19:29:00.460 に答える
0

リンクhttp://codinglookseasy.blogspot.in/2012/08/sqlite-database.htmlのサンプルを操作してみてください

カーソルオブジェクトを文字列に変換する代わりに、フィールドを取得して文字列に保存してみてください

于 2012-09-04T19:22:44.203 に答える
0

selectステートメントがおそらく間違っているようです。整数のように見える「COLUMN_CATEGORIES」ではなく、列名の文字列を渡す必要があります。その後、コメントアウトされた方法で文字列にアクセスする必要があります。

于 2012-09-04T19:23:07.120 に答える