SQLiteデータベースを正常に作成しましたが、正常に動作します。ただし、onUpgradeメソッドを呼び出すときは、データを失わずに呼び出したいと思います。私が開発しているアプリはクイズアプリです。簡単に言うと、onCreateメソッドが呼び出されると、データベースを作成して、質問や回答などを事前に入力します。最後の列は、質問をお気に入りとして設定したかどうかです。私がやりたいのは、onUpgradeメソッドが呼び出されたときに、その1つの列を一時的に保存し、データベース全体を削除し、古い質問に対して行った編集で再作成し、新しい質問を追加してから再作成することです。 -彼らがお気に入りとして設定した質問を追加し直します。
だから私が試した1つのオプションは次のとおりでした:
db.execSQL("ALTER TABLE quiz RENAME TO temp_quiz");
onCreate(db);
db.execSQL("INSERT INTO quiz (favouries) SELECT favourites FROM temp_quiz");
db.execSQL("DROP TABLE IF EXISTS temp_quiz");
ただし、INSERT INTOは既存の行を置き換えるのではなく、新しい行を追加するだけなので、これは機能しません。また、REPLACE INTO、INSERT OR REPLACE INTO、および
db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");
そのうちどれも機能しません。
現在、テーブルの名前を変更し、onCreate(db)メソッドを呼び出してから、次のように各行を読み取り、db.update()メソッドを使用するカーソルを設定することで動作するように設定しています。
int place = 1;
int TOTAL_NUMBER_OF_ROWS = 500;
while (place < TOTAL_NUMBER_OF_ROWS) {
String[] columns = new String[] { "_id", ..........., "FAVOURITES" };
// not included all the middle columns
Cursor c = db.query("temp_quiz", columns, "_id=" + place, null, null, null, null);
c.moveToFirst();
String s = c.getString(10);
// gets the value from the FAVOURITES column
ContentValues values = new ContentValues();
values.put(KEY_FLAG, s);
String where = KEY_ROWID + "=" + place;
db.update(DATABASE_TABLE, values, where, null);
place++;
c.close();
}
ただし、これは機能しますが、非常に遅く、質問の数が増えるにつれて悪化するだけです。これをすべて行う簡単な方法はありますか?
ありがとうございました!PS理想的には、行が存在する場合にのみ行を更新する必要があります。したがって、アップグレードで質問を削除することにした場合は、これを考慮に入れて、行に他のデータが含まれていない場合は新しい行を追加しないでください。質問データが追加されないようにするよりも、質問データがない行を削除する方が簡単な場合があります。