0

SQLite データベースで 2 つのテーブルを設定する方法で、誰かがエラーを見ることができるかどうか疑問に思っていましたか? 私がここでやっていることは間違っていますか?sqlite で複数のテーブルを作成したことはありません。

私のlogcatスタックトレースは、エラーがインデックス0が要求され、サイズが0であることを示しています。このエラーの原因として、SQLiteの1つのデータベースに2つのテーブルを設定する方法に関する問題を解消しようとしています。何かアイデアはありますか?

以下に、2 つのテーブルが作成されるコードを示します。

 public class Database {

    public static final String DATABASE_NAME = "allert_database";
    public static final String DATABASE_TABLE = "allert_table";
    public static final String DATABASE_TABLE2 = "allert_table2";
    public static final int DATABASE_VERSION = 1;
    public static final String _ID = "_id";
    public static final String KEY_SENTENCE = "sentance";
    public static final String KEY_DESCRIPTION = "description";

  //create table DATABASE_TABLE (_ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_TABLE =
        "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +  
        KEY_SENTENCE + " TEXT);";

    // create the second table DATABASE_TABLE2
    private static final String SCRIPT_CREATE_TABLE2 =
      "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE2 + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +  
      KEY_DESCRIPTION + " TEXT);";

    SQLiteDatabase sqLiteDatabase;
    SQLiteHelper sqLiteHelper;
    Context context;

    public Database(Context c){
          context = c;
         }


public class SQLiteHelper extends SQLiteOpenHelper {

          public SQLiteHelper(Context context, String name,
            CursorFactory factory, int version) {
           super(context, name, factory, version);
          }

          // onCreate of the SQLiteOpenhelper only called if the database does not already exist
          @Override
          public void onCreate(SQLiteDatabase db) {
           db.execSQL(SCRIPT_CREATE_TABLE);
           db.execSQL(SCRIPT_CREATE_TABLE2);
          }

          @Override
           public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
           db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
           db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE2);
             onCreate(db);
          }

         }

EDIT:ちょうど楽しみのために、スタックトレースがエラーを示しているクエリメソッドをここに追加しました:

              // get sentence from table one
         public String getSentenceFromTableOne(int rowNum){
             String status = " ";
             String[] columns = new String[]{KEY_SENTENCE};
             String selection = _ID + " = '" + rowNum + "';";
             Cursor cursor = sqLiteDatabase.query(DATABASE_TABLE, columns, 
                        selection, null, null, null, null);
             if (cursor != null){
                    cursor.moveToFirst();
             }
             status = cursor.getString(cursor.getColumnIndex(KEY_SENTENCE));
             cursor.close();
            return status;

         }

これは、データベース クラスから上記のデータベース クエリ メソッドを呼び出すメイン アクティビティの以下のメソッドです。

 public String getSentenceTableOne(int enterNum){
    Database db = new Database(context);
    db.openToWrite();
    String returnStr = db.getSentenceFromTableOne(enterNum);
    db.close();
    return returnStr;
}

編集2:さらに調査しますが、完全を期すために、sqliteヘルパークラスのインスタンス化、またはそれがどのように行われたかをここに追加しました

        SQLiteDatabase sqLiteDatabase;
    SQLiteHelper sqLiteHelper;
    Context context;

    public Database(Context c){
          context = c;
         }

    public void openToRead() throws android.database.SQLException {
          sqLiteHelper = new SQLiteHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
          sqLiteDatabase = sqLiteHelper.getReadableDatabase();
         }

    public void openToWrite() throws android.database.SQLException {
          sqLiteHelper = new SQLiteHelper(context, DATABASE_NAME, null, DATABASE_VERSION);
          sqLiteDatabase = sqLiteHelper.getWritableDatabase();
         }

最終編集:データベース内の複数のテーブルの実装に問題があった場合、質問をする元の理由。これは答えられましたが、本当のエラーはメインクラスから間違ったメソッドを呼び出すことにあることがわかりました。メインクラスの挿入メソッドからデータベースクラスの更新メソッドを呼び出していました。そのため、新しい情報がデータベースに挿入されていませんでした。

4

1 に答える 1

0

カーソルが空のようです。.moveToFirst()最初がないのでうまくいきません。

ただの代わりに

if (cursor != null)

試す

if (cursor != null && cursor.getCount > 0)

そこに実際にデータがあることを確認してください。実行しても表示されない場合は、クエリを詳しく調べてください。

また、次のように選択を作成する代わりに:

String selection = _ID + " = '" + rowNum + "';";

次のように変数を使用します。

String selection = _ID + "= ?";
String [] args = new String[] {String.valueOf(rowNum)};
...
Cursor cursor = sqLiteDatabase.query(DATABASE_TABLE, columns, 
                    selection, args, null, null, null);

これにより、文字列連結によるクエリの混乱を防ぐことができます。

編集:また、実際にどこかで sqLiteHelper をインスタンス化していることも確認してください。それがすべてのコードではないと思います。

于 2013-06-11T08:23:02.403 に答える