0

アプリケーションとコンパイラにエラーを表示させます。何が起こったのかわかりません。クリック後にデータベースからランダムなレコードを取得して表示したい。Android SQLite Database Tutorialと stackoverflov Error のチュートリアルを使用しました:

    10-30 19:19:59.533: E/AndroidRuntime(359): FATAL EXCEPTION: main
10-30 19:19:59.533: E/AndroidRuntime(359): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
10-30 19:19:59.533: E/AndroidRuntime(359):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580)

私のコードは次のとおりです。

public class PrzyslowiaArabskie  {

    private static final String TABLE_NAME = "tabela_przyslowia";
    private static final String DATABASE_NAME = "przyslowiadb";
    private static final int DATABASE_VERSION = 1;
    public static final String KEY_ID = "id";
    public static final String KEY_PRZYSLOWIE = "przyslowie";

    private DbHelper myHelper;
    private final Context myContext;
    private SQLiteDatabase myDatabase;




    private static class DbHelper extends SQLiteOpenHelper {

        public DbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
             db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + 
                       KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
                     KEY_PRZYSLOWIE + " TEXT NOT NULL);" );


        } 

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);
        }

    }
    public PrzyslowiaArabskie(Context c) {
        myContext = c;
    }
    public PrzyslowiaArabskie open() {
        myHelper = new DbHelper(myContext);
        myDatabase = myHelper.getWritableDatabase();
        return this;
    }
    public void close() {
        myHelper.close();
    }


    public String getData() {
        // TODO Auto-generated method stub
        String[] columns = new String[] { KEY_ID, KEY_PRZYSLOWIE };
        Cursor c = myDatabase.query(TABLE_NAME, columns, KEY_ID + "=?", new String[] {String.valueOf(KEY_ID + 1)}, null, null, null);
         if (c != null) {
             c.moveToFirst(); 
             String data = c.getString(1);
             return data;
         }  
        return null;
    }


}

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

私は自分の問題で解決しました。データベースからランダムなレコードを取得する代わりに、3 つのボタン (次のレコード、前のレコード、および表示レコード) を作成します。この手順を使用します データベースから次のレコードを表示 する ご協力ありがとうございます。

4

4 に答える 4

2

カーソルは常に null ではありません。代わりmoveToFirstに、時々失敗します。

試す

if(c.moveToFirst() {
  String data = c.getString(c.getColumnIndexOrThrow(KEY_PRZYSLOWIE ));
}
于 2012-10-30T19:37:08.317 に答える
2

存在しないカーソル行の列に索引付けしようとしています。

if (c != null) {
     c.moveToFirst(); // This needs to check for validity
     String data = c.getString(1); // Before indexing into a non-existent record
     return data;
}

その代わり...

if(c.moveToFirst()){
  String data = c.getString(1);
  return data;
}

もちろん、複数の行を反復する場合は、while ループと使用を検討することをお勧めします。while(c.moveToNext()) ...

編集:コメントに対処するための拡張回答。

while ループを使用して、カーソルを介して利用可能なすべてのレコードを反復処理し、コンシューマー コードでデータを利用するには、単一の文字列ではなく並べ替えのコレクションを返すようにメソッド シグネチャを変更する必要がある可能性があります。

public ArrayList<String> getData() {
    ArrayList<String> data = new ArrayList<String>();
    String[] columns = new String[] { KEY_ID, KEY_PRZYSLOWIE };
    Cursor c = myDatabase.query(TABLE_NAME, columns, KEY_ID + "=?", new String[] {String.valueOf(KEY_ID + 1)}, null, null, null);
    while(null != c && c.moveToNext()) {
      data.add(c.getString(1));
    }
    return data;
}

提供されているコード例は、あなたが望む結果を得るはずですが、オブジェクトのコレクションと while ループの処理についてさらに説明が必要な場合は、データ構造の処理に関するいくつかの情報またはより抽象的なプログラミング情報についてJava ドキュメントを参照することをお勧めします。そして制御フロー。

于 2012-10-30T19:39:09.440 に答える
0

変化する

if (c != null) {

if (c != null && c.moveToFirst()) {

そうしないと、一致する行がなくても、カーソルからデータを取得しようとします。

于 2012-10-30T19:39:59.640 に答える
0

空のカーソルがあるように見えます。null かどうかをチェックする代わりに、チェックしてみてください

if(mCursor.getCount > 0)
{
  //do stuff
}
于 2012-10-30T19:45:11.840 に答える