Utworzono bazę SQLite pomyślnie i działa dobrze. Jednak po wywołaniu metody onUpgrade chciałbym to zrobić bez utraty danych. Aplikacja, którą tworzę, to aplikacja do quizów. Po prostu, gdy wywoływana jest metoda onCreate, tworzę i wstępnie wypełniam bazę danych pytaniami, odpowiedziami itp. Ostatnia kolumna określa, czy ustawiono pytanie jako ulubione, czy nie. Chciałbym to zrobić, gdy wywoływana jest metoda onUpgrade, chciałbym tymczasowo zapisać tę jedną kolumnę, upuścić całą bazę danych, odtworzyć ją za pomocą wszelkich zmian wprowadzonych do starych pytań i dodać nowe pytania, a następnie ponownie -od powrotem pytania, które ustawili jako ulubione.Aktualizacja Android SQLite bez utraty danych
Więc jedna opcja Próbowałem był następujący:
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");
Jednak to nie działa ze względu na fakt INSERT INTO tylko dodaje nowe wiersze zamiast zastępując istniejące wiersze. Próbowałem również WYMIENIĆ, INSERT OR REPLACE INTO i
db.execSQL("INSERT INTO quiz (_id, favouries) SELECT _id, favourites FROM temp_quiz");
z czego żaden nie działa.
Obecnie mam to ustawione do pracy poprzez zmianę nazwy tabeli, wywołanie metody onCreate (db), a następnie ustawienie kursora, który odczytuje każdy wiersz i używa metody db.update(), jak pokazano poniżej :
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();
}
Mimo że działa to jest bardzo powolny i będzie tylko gorzej, jak moja liczba pytań wzrasta. Czy istnieje szybki sposób na zrobienie tego wszystkiego?
Dziękujemy! P.S. Idealnie powinien aktualizować tylko wiersz, jeśli wiersz jest obecny. Jeśli więc w aktualizacji zdecyduję się usunąć pytanie, należy wziąć to pod uwagę i nie dodawać nowego wiersza, jeśli wiersz nie zawiera żadnych innych danych. Może być łatwiejsze, aby usunąć wiersze, które nie zawierają danych pytań, zamiast zapobiegać ich dodawaniu.
Myślę, że chodziło o "Update new_quiz", nie old_quiz =) – hiBrianLee
Przepraszam, to co miałem na myśli . Dziękuję: D – AndroidPenguin
@AndroidPenguin, zmodyfikowany zgodnie z Twoim komentarzem. –