Atualização do Android SQLite sem perder dados
Eu criei um banco de dados SQLite com sucesso e funciona bem. No entanto, quando o método onUpgrade é chamado, gostaria de fazê-lo sem perder dados. O aplicativo que estou desenvolvendo é um aplicativo de teste. Simplesmente, quando o método onCreate é chamado, eu crio e pre povo um banco de dados com perguntas, respostas, etc. A última coluna é se eles definiram a pergunta como favorita ou não. O que eu gostaria de fazer é que, quando o método onUpgrade for chamado, eu gostaria de salvar temporariamente essa coluna, soltar todo o banco de dados, recriá-lo com qualquer edição que eu tenha feito para perguntas antigas e adicionar novas perguntas. -Adicione as perguntas que eles definem como favoritos.
Então, uma opção que tentei foi a seguinte:
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");
No entanto, isso não funciona devido ao fato de INSERT INTO apenas adicionar novas linhas em vez de substituir as linhas existentes. Eu também tentei SUBSTITUIR, INSERIR OU SUBSTITUIR
db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");
dos quais nenhum trabalho.
Atualmente eu tenho configurado para funcionar alterando o nome da tabela, chamando o método onCreate (db) e então configurando um cursor que lê cada linha e usa o método db.update () como mostrado abaixo:
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();
}
No entanto, enquanto isso funciona, é extremamente lento e só vai piorar à medida que o meu número de perguntas aumenta. Existe uma maneira rápida de fazer tudo isso?
Obrigado! P.S. Idealmente, só deve atualizar a linha se a linha estiver presente. Portanto, se em uma atualização eu decidir remover uma pergunta, ela deve levar isso em conta e não adicionar uma nova linha se a linha não contiver nenhum outro dado. Pode ser mais fácil obtê-lo para remover linhas que não têm dados de pergunta, em vez de impedi-las de serem adicionadas.