Mam jeden problem z SQLite
bazą danych Androida .
Mam jedną tabelę, która zawiera jedno pole.StudentFname i ta aplikacja działa dobrze z Androidem 2.3.1, a teraz, jeśli dodam kolejne pole, moja aplikacja nie działa poprawnie.
Czy może mi pomóc ktoś, kto bardzo dobrze zna bazę danych,
if (newVersion > oldVersion)
warunek jest tutaj niepotrzebny, ponieważonUpgrade
sam jest wywoływany tylko wtedy, gdy ten warunek jest spełniony, tj. nowa wersja jest większa niż stara wersjaNatknąłem się na ten wątek, gdy potrzebowałem pomocy we własnej aplikacji, ale zauważyłem problemy z wieloma odpowiedziami. Poleciłbym wykonanie następujących czynności:
private static final String DATABASE_ALTER_TEAM_1 = "ALTER TABLE " + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " string;"; private static final String DATABASE_ALTER_TEAM_2 = "ALTER TABLE " + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " string;"; @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL(DATABASE_ALTER_TEAM_1); } if (oldVersion < 3) { db.execSQL(DATABASE_ALTER_TEAM_2); } }
Chcesz mieć pewność, że kod będzie działał, gdy użytkownicy zaktualizują więcej niż 1 wersję, a instrukcja aktualizacji uruchamia tylko jedno uaktualnienie, które jest potrzebne. Więcej informacji na ten temat znajdziesz na tym blogu .
źródło
Najłatwiej to zrobić, dodając trochę
SQL to the onUpgrade()
metody do plikuSQLiteOpenHelper class
. Coś jak:@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // If you need to add a new column if (newVersion > oldVersion) { db.execSQL("ALTER TABLE student ADD COLUMN student_rollno INTEGER DEFAULT 0"); } }
źródło
Być może nieco bardziej eleganckie podejście z użyciem przełącznika zamiast opcji if / then, które spowoduje uaktualnienie z dowolnego schematu do najnowszego schematu ...
Oto przyzwoita strona na temat składni do zmiany tabeli: http://alvinalexander.com/android/sqlite-alter-table-syntax-examples
public static final String TABLE_TEAM = "team"; public static final String COLUMN_COACH = "coach"; public static final String COLUMN_STADIUM = "stadium"; private static final String DATABASE_ALTER_TEAM_TO_V2 = "ALTER TABLE " + TABLE_TEAM + " ADD COLUMN " + COLUMN_COACH + " TEXT;"; private static final String DATABASE_ALTER_TEAM_TO_V3 = "ALTER TABLE " + TABLE_TEAM + " ADD COLUMN " + COLUMN_STADIUM + " TEXT;"; @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: //upgrade from version 1 to 2 db.execSQL(DATABASE_ALTER_TEAM_TO_V2); case 2: //upgrade from version 2 to 3 db.execSQL(DATABASE_ALTER_TEAM_TO_V3); //and so on.. do not add breaks so that switch will //start at oldVersion, and run straight through to the latest } }
źródło
Zrobiłem następujące podejście, zostało to rozwiązane dla mnie
jeśli wersja DB: 6
Ex : There is a table with 5 columns
Po uaktualnieniu do: 7 (dodaję 1 nową kolumnę w 3 tabelach)
Gdzie: „DATABASE_ALTER_ADD_PAPER_PAID” to zapytanie.
EX: public static final String DATABASE_ALTER_ADD_PAPER_PAID = "ALTER TABLE " + TableConstants.MY_PAPERS_TABLE + " ADD COLUMN " + COLUMN_PAPER_PAID + " TEXT;";
Po powyższych dwóch operacjach będzie działać dobrze dla nowego użytkownika instalacji i użytkownika aktualizacji aplikacji
źródło
@ Aamirkhan.i myślę, że rozwiązałbyś problem, o którym wspomniałeś w komentarzach dawno temu. Myślę, że nie zwiększyłeś wersji bazy danych. w przeciwnym razie odpowiedzi tutaj są proste. Piszę to, ponieważ może to pomóc każdemu, kto nie zwiększył ani nie zmienił numeru wersji swojej bazy danych, gdy zmieniają tabelę.
źródło
Myślę, że nie powinniśmy tak sprawdzać stanu
bo jeśli z tego skorzystamy, oznacza to, że za każdym razem, gdy zwiększamy wersję bazy danych, to onUpdrade () wywoła i warunek będzie prawdziwy, więc powinniśmy tak sprawdzić
więc w tym przypadku, jeśli stara wersja to 2, to warunek będzie fałszywy i użytkownik ze starszą wersją 2 nie zaktualizuje bazy danych (której użytkownik chce tylko dla wersji 1), ponieważ dla tych użytkowników baza danych była już zaktualizowana.
źródło
Aby dodać nową kolumnę do tabeli, musisz użyć
ALTER
. W systemie Android możesz dodać nową kolumnę w plikuonUpgrade()
.Możesz się zastanawiać, jak
onUpgrade()
dodasz nową kolumnę?Podczas implementowania podklasy programu
SQLiteOpenHelper
, musisz wywołać konstruktor nadklasy:super(context, DB_NAME, null, 1);
w konstruktorze klasy. Tam przekazałem1
wersję.Kiedy zmieniłem wersję
1
na powyższą (2
lub nowszą ),onUpgrade()
zostanie wywołany. I wykonaj modyfikacje SQL, które zamierzam zrobić. Konstruktor mojej klasy po zmianie wersji:Sprawdza modyfikacje SQL w ten sposób, konstruktor nadklasy porównuje wersję przechowywanego pliku bazy SQLite z wersją, do której przekazałem
super()
. Jeśli te (poprzednie i obecne) numery wersji są różne,onUpgrade()
zostanie wywołany.Kod powinien wyglądać następująco:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // add new columns to migrate to version 2 if (oldVersion < 2) { db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN school VARCHAR(250)"); } // add new columns to migrate to version 3 if (oldVersion < 3) { db.execSQL("ALTER TABLE " + TABLE_NAME + "ADD COLUMN age INTEGER"); } }
źródło
Po prostu zmień swój kod
do
źródło
Podczas wyszukiwania tego samego problemu natrafiłem na link. Wyjaśnia, jak używać aktualizacji. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade
wyjaśnia, dlaczego używać poniższego kodu
źródło
Najłatwiejszym sposobem utworzenia nowej kolumny w tabeli jest dodanie kodu SQL do metody onUpgrade () w klasie SQLiteOpenHelper. Lubić:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 1: db.execSQL(SQL_MY_TABLE); case 2: db.execSQL("ALTER TABLE myTable ADD COLUMN myNewColumn TEXT"); } }
źródło
najpierw zwiększ numer wersji bazy danych. a następnie w
onUpgrade
metodzie możesz sprawdzić, czy kolumna już istnieje, jeśli nie, to tylko dodaj kolumnę@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(!existsColumnInTable(db, TABLE_NAME, COLUMN_NAME)){ db.execSQL("ALTER TABLE foo ADD COLUMN COLUMN_NAME INTEGER DEFAULT 0"); } } private boolean existsColumnInTable(SQLiteDatabase inDatabase, String inTable, String columnToCheck) { Cursor cursor = null; try { // Query 1 row cursor = inDatabase.rawQuery("SELECT * FROM " + inTable + " LIMIT 0", null); // getColumnIndex() gives us the index (0 to ...) of the column - otherwise we get a -1 if (cursor.getColumnIndex(columnToCheck) != -1) return true; else return false; } catch (Exception Exp) { return false; } finally { if (cursor != null) cursor.close(); } }
ta metoda jest wyodrębniona z tego łącza Sprawdzanie, czy kolumna istnieje w bazie danych aplikacji w systemie Android
źródło