1

カーソルを使用して、アプリにあるsqliteデータベースにアクセスしています。

データベースで.getInt()を使用するのに問題があります。私のデータベースは事前に作成されており、情報とやり取りするためのクエリを実行するカーソルがいくつかあります。表の1つの列のいくつかは、INTEGER型として設定されています。sqliteには、列が実際にINTであることを確認するためのチェックが組み込まれていないことに気付きました。ただし、データを取得するときは、.getString()関数を問題なく使用できますが、.getInt()を呼び出すとアプリがクラッシュします。以下は関連するコードです。足りないものがあればお知らせください。追加します。

どんな助けでも大歓迎です。どうもありがとうございます。

カーソル:

public Cursor getSkitStats(int module, int skit) {
    Cursor mCursor = myDataBase.rawQuery("SELECT * FROM score WHERE mod="+module+" AND skit="+skit+"", null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }
    return mCursor;
}

単純なToast呼び出しを使用して、クエリの結果を出力しています。

Toast.makeText(getApplicationContext(), scoreContent.getInt(0), Toast.LENGTH_SHORT).show();

変数scoreContentはカーソルです。

そして、これがクラッシュ出力です:

07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.access$1500(ActivityThread.java:121)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.os.Looper.loop(Looper.java:130)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.main(ActivityThread.java:3701)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at java.lang.reflect.Method.invokeNative(Native Method)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at java.lang.reflect.Method.invoke(Method.java:507)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at dalvik.system.NativeStart.main(Native Method)
07-08 23:53:31.726: E/AndroidRuntime(15685): Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x2
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.content.res.Resources.getText(Resources.java:205)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.widget.Toast.makeText(Toast.java:258)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at jp.atomicideas.ne.Summary.onCreate(Summary.java:90)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-08 23:53:31.726: E/AndroidRuntime(15685):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
07-08 23:53:31.726: E/AndroidRuntime(15685):    ... 11 more
4

4 に答える 4

2

にintを送信する場合Toast.makeText、それはリソースIDであると見なされます。ここを参照してください:

http://developer.android.com/reference/android/widget/Toast.html#makeText(android.content.Context、int、int

数値を出力するだけの場合は、を使用toString()して数値を文字列に変換します。(またはInteger.toString()など)

于 2012-07-08T15:23:52.737 に答える
1
  1. 「.getString()関数は問題なく使用できます。」

    これはメソッドであり、関数ではありません。:)

  2. の使用を避けるようにしてくださいrawQuery...SQLインジェクションから保護せず、私の経験では信頼性が低くなります(まれですが、そうしようとすると、一部のデバイスで奇妙な動作や奇妙なエラーが発生します)。

    SQLiteDatabase.query()代わりにメソッドを使用する必要があります。例えば、

    String table = "score";
    String[] proj = null;
    String selection = "mod=? AND skit=?";
    String[] selectionArgs = new String { "module", "skit" };
    
    myDatabase.query(table, proj, selection, selectionArgs, null);
    
  3. あなたが使うscoreContent.getInt(0)

    整数列インデックスが事前に作成されている場合でも、ハードコーディングしないでください。代わりに、実行時Cursor.getColumnIndex(column_name)にインデックス値を取得するために使用します。

  4. あなたが使うToast.makeText(context, scoreContent.getInt(0), Toast.LENGTH_SHORT).show();

    2番目の引数をString...のようなものに変換してみてください

    ""+scoreContent.getInt(cursor.getColumnIndex(col_name))
    
于 2012-07-08T15:26:38.177 に答える
0

すべての列の名前を保存し、getColumnIndex()を使用してインデックスを取得する必要があります。次に、インデックスを使用してデータを取得します。列の形式がわかれば、どの方法を使用すべきかがわかります。

編集済み

トーストを呼び出すと、データベース内の番号がわかります。2番目のパラメーターには、文字列リソースのIDまたは文字列が必要です。データベースの値は明らかに正しくありません。

于 2012-07-08T15:30:49.993 に答える
0

scoreContent.getInt(0)正常に動作し、inetegerを返します。インデックスが0の場合、カーソルにineterタイプの値が含まれていると想定しています。

scoreContent.getInt(0)はinetegerを返し、その値をToastの 2番目の引数として使用しているため、Toastにはここで文字列が必要です。

于 2012-07-08T15:34:14.590 に答える