1

タブを作成するデータベース値をループしようとしています。Long 値と String 値を受け入れる createTab というメソッドをセットアップしました。静的データで動作していますが、SQLite データベース レコードをループする方法を理解するのに苦労しています。

これが私の失敗した試みです([未満]を未満記号に置き換えます):


for (int i = 0; i [lessthan] mCursor.getCount(); i++)
{
 createTab(
  mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")),
  mCursor.getString(mCursor.getColumnIndexOrThrow("category")));
}

上記のコードで何が間違っていたかを知るために LogCat はおそらく必要ありませんが、念のため...

08-27 21:28:18.268: エラー/AndroidRuntime(232): 原因: android.database.CursorIndexOutOfBoundsException: インデックス -1 が要求され、サイズは 3 です
08-27 21:28:18.268: エラー/AndroidRuntime(232): android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) で
08-27 21:28:18.268: エラー/AndroidRuntime (232): android.database.AbstractWindowedCursor.checkPosition (AbstractWindowedCursor.java:172) で
08-27 21:28:18.268: エラー/AndroidRuntime(232): android.database.AbstractWindowedCursor.getLong (AbstractWindowedCursor.java:99) で
08-27 21:28:18.268: エラー/AndroidRuntime (232): com.toBuy.Main.createTabs (Main.java:51) で
08-27 21:28:18.268: エラー/AndroidRuntime (232): com.toBuy.Main.onCreate (Main.java:38) で
08-27 21:28:18.268: エラー/AndroidRuntime(232): android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1123) で
08-27 21:28:18.268: エラー/AndroidRuntime(232): android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2364) で
08-27 21:28:18.268: エラー/AndroidRuntime(232): ... 11 詳細
08-27 21:28:18.278: 情報/プロセス (54): 信号を送信しています。PID: 232 SIG: 3
08-27 21:28:18.278: INFO/dalvikvm(232): threadid=7: シグナル 3 に反応しています
08-27 21:28:18.338: INFO/dalvikvm(232): スタック トレースを '/data/anr/traces.txt' に書き込みました
08-27 21:28:18.508: INFO/ARMAssembler(54): 生成された scanline__00000077:03515104_00000000_00000000 [27 ipp] (41 ins) [0x285a68:0x285b0c] で 713498 ns
08-27 21:28:18.518: INFO/ARMAssembler(54): 生成された scanline__00000077:03515104_00001001_00000000 [64 ipp] (84 ins) [0x285b10:0x285c60] で 1897448 ns
08-27 21:28:28.086: WARN/ActivityManager(54): 起動タイムアウトの期限が切れたため、ウェイク ロックが放棄されました!
08-27 21:28:28.097: WARN/ActivityManager(54): HistoryRecord {4390bf70 com.toBuy/.Main} のアクティビティ アイドル タイムアウト

ご協力ありがとうございました。

4

3 に答える 3

1

getLongまたはを呼び出す前に、カーソルを配置する必要がありますgetString。クエリを発行した後、Cursorは最初の行の直前に配置されるためmoveToNext、ループで呼び出す必要があります。何かのようなもの:

int size = mCursor.getCount();
for (int i = 0; i < size; i++) {

    // Position the cursor
    mCursor.moveToNext();

    // Fetch your data values
    long id = mCursor.getLong(mCursor.getColumnIndex("_id"));
    String cat = mCursor.getString(mCursor.getColumnIndex("category"));
}
于 2010-08-27T21:59:25.270 に答える
0

次の for ループを使用します。

   for(mCursor.moveToFirst();!mCursor.isAfterLast();mCursor.moveToNext()){
        createTab(
  mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")),
  mCursor.getString(mCursor.getColumnIndexOrThrow("category")));    
        }

ただし、 while ループの方がはるかに簡単です。

while (mCursor.moveToNext()) { createTab(
  mCursor.getLong(mCursor.getColumnIndexOrThrow("_id")),
  mCursor.getString(mCursor.getColumnIndexOrThrow("category")));    

}

どちらの場合も、カーソルの開始位置を手動で設定する必要はありません。

于 2013-04-25T09:56:33.230 に答える