2013-01-22 10 views
6

Jak upuścić i ponownie utworzyć tabelę ze zaktualizowanymi informacjami?SQLite Drop and Recreate Table

Na przykład; Mam tabelę w mojej aplikacji z 5 rekordami.

ID  Entry 
1  a 
2  b 
3  c 
4  d 
5  e 

Teraz, gdy usunę rekordu powiedzmy, ID 3 tabela staje

ID  Entry 
1  a 
2  b 
4  d 
5  e 

Jak mogę upuścić go i odtworzyć go stać to:

ID  Entry 
1  a 
2  b 
3  d 
4  e 

rzeczywistości usuwanie jest kontrolowane przez użytkownika, więc każdy rekord może zostać usunięty w dowolnym momencie.

+0

Dlaczego chcesz to osiągnąć? Powinieneś odtworzyć bazę danych za każdym razem, gdy jakiś użytkownik zmieni coś w niej. – Leandros

+1

dlaczego tego potrzebujesz? zamiast znaleźć uciążliwy sposób odpowiadania na twoje pytanie, wolę znaleźć sposób, aby tego nie potrzebować. – njzk2

+0

nie. Chcę odtworzyć tabelę, a nie bazę danych.Jest kilka powodów; na przykład: po usunięciu rekordu proces usuwania jest wykonywany przez aktualnie wybrany wiersz, ponieważ mogę wybrać tylko do wiersza 4, identyfikatora 5 nigdy nie można usunąć. – Pztar

Odpowiedz

13

Można zrobić co następuje: usunąć wiersz, który chcesz usunąć:

 public boolean deleteRow(int id) 
     { 
     return db.delete(YOUR_TABLE, ROW_ID + "=" + _id, null) > 0; 
     } 

przeczytać pozostałe wpisy (tylko wpisy, nie ID) w ArrayList, upuścić tabeli:

 db.execSQL("DROP TABLE IF EXISTS " + YOUR_TABLE); 

i odtwórz swój stół. Następnie numery identyfikacyjne będą ponownie od 1 do XX w zamówieniu

+1

to prawie to, co mam. Jednak kiedy upuszczę stół, a następnie przejdę do jego odtworzenia, wróci on jako NullPointer. Nie wiem, myślę, że będę musiał trochę więcej z nim poradzić. – Pztar

+0

, czy mógłbyś pokazać kod, w którym to zrobiłeś? Na przykład, jeśli zrobisz to w złej kolejności, możliwe jest, że usuniesz swoją tabelę przed zapisaniem jej w tablicy. To może być powód, dla którego otrzymujesz nullpointer. W Niemczech mówimy, czasami nie można było zobaczyć lasu z powodu tak wielu drzew :) – Opiatefuchs

+0

Trzeba dodać spację po EXISTS – Matthew

1

Wiem, że to stary post, ale pomyślałem, że wyjaśnię inne osoby, które mogą robić to samo, co Ty na podstawie Twojego komentarza:

Kiedy zapis zostanie usunięty proces usuwania jest wykonywana przez aktualnie wybranego wiersza ponieważ mogę tylko wybrać do rzędzie 4, ID 5 nigdy nie może być usunięte.

Naprawdę nie powinieneś odtwarzać swoich identyfikatorów. Nienaruszają rzeczy, jeśli są używane jako klucze w innej tabeli, a jeśli masz dużą bazę danych, ich odtworzenie może po prostu marnować czas, kiedy naprawdę nie ma takiej potrzeby.

Co należy zrobić, to zapisać tablicę identyfikatorów wraz z tablicą wpisów, aby wiedzieć, który identyfikator należy usunąć w zależności od wybranego wiersza (lub w inny sposób łączenia identyfikatorów i wartości, aby można było pobrać później).

W powyższym przykładzie, po tym jak ktoś usuwa wiersz z id 3, swoje macierze będzie wyglądać następująco:

entries = { "a","b","d","e" } 
ids = { 1,2,4,5 } 

jeśli ktoś wybiera „e”, która jest czwartą pozycję, po prostu usunąć z tabela, gdzie id jest równy czwartej wartości w tablicy ids, w tym przypadku 5.

W ten sposób, jeśli elementy są ciągle dodawane i usuwane, twoja baza danych może zakończyć się identyfikatorami 2, 34, 56 i 435. Nie ma to znaczenia, ponieważ twój kod będzie śledzić i będzie wiedział, który identyfikator usunąć.

0

Innym podejściem

public boolean deleteTable(int id) { 
    SQLiteDatabase database = dbHelper.getReadableDatabase(); 
    final String whereClause = DBHelper.COLUMN_ID + "=?"; 
    final String whereArgs[] = {String.valueOf(id)}; 
    int affectedRows = database.delete(DBHelper.TABLE_NAME_OGR, whereClause, whereArgs); 
    return affectedRows > 0; 
}