Jak dodać nową kolumnę do bazy danych Android SQLite?
Mam jeden problem z bazą danych Androida SQLite
.
Mam jedną tabelę, która zawiera jedno pole.StudentFname a ta aplikacja działa dobrze z Androidem 2.3.1 i teraz, jeśli dodam kolejne pole, to moja aplikacja nie działa poprawnie.
Czy ktoś może mi pomóc, kto zna bazę danych bardzo dobrze,
11 answers
Możesz użyć funkcji ALTER TABLE
na swojej metodzie onUpgrade()
, tak:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// If you need to add a column
if (newVersion > oldVersion) {
db.execSQL("ALTER TABLE foo ADD COLUMN new_column INTEGER DEFAULT 0");
}
}
Oczywiście, SQLite będzie się różnić w zależności od definicji kolumny.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 11:20:26
Najprostszym sposobem na to jest dodanie metody SQL to the onUpgrade()
do twojego SQLiteOpenHelper class
. Coś w stylu:
@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");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-28 05:07:26
Natknąłem się na ten wątek, gdy potrzebowałem pomocy w mojej własnej aplikacji, ale widziałem problemy z wieloma odpowiedziami. Polecam wykonanie:
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 się upewnić, że kod będzie działał, gdy użytkownicy uaktualnią więcej niż 1 wersję i że instrukcja update uruchamia tylko jedną wymaganą aktualizację. Aby dowiedzieć się więcej na ten temat, zajrzyj na ten blog.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 22:04:49
Być może nieco bardziej eleganckie podejście przy użyciu przełącznika zamiast if / then, które spowoduje uaktualnienie z dowolnego schematu do najnowszego schematu...
Tutaj jest też porządna 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
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-20 22:22:39
@Aamirkhan.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. albo odpowiedzi tutaj są proste.piszę to, ponieważ może to pomóc każdemu, kto nie zwiększył lub nie zmienił numeru wersji bazy danych podczas zmiany tabeli.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-09 14:28:22
Myślę, że nie powinniśmy sprawdzać takiego stanu
if (newVersion > oldVersion) {
}
Ponieważ jeśli użyjemy tego, oznacza to, że za każdym razem, gdy zwiększymy wersję bazy danych , to onupdrade () wywoła i warunek będzie true, więc powinniśmy sprawdzić w ten sposób
if(oldVersion==1)
{
}
Więc w tym przypadku jeśli stara wersja jest 2 to warunek będzie false i użytkownik ze starą 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 .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 10:47:43
Zrobiłem następujące podejście, to jest resoved dla mnie
If DB version : 6
Ex : There is a table with 5 columns
Po uaktualnieniu do : 7 (dodaję 1 nową kolumnę w 3 tabelach)
1. We need to add the columns when creating a table
2. onUpgrade method:
if (oldVersion < 7)
{
db.execSQL(DATABASE_ALTER_ADD_PAPER_PAID);
db.execSQL(DATABASE_ALTER_LAST_UPLOADED);
db.execSQL(DATABASE_ALTER_PAPER_LABEL);
}
Gdzie:" DATABASE_ALTER_ADD_PAPER_PAID " jest zapytaniem.
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 użytkownika fresh install I użytkownika upgrade aplikacji
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 10:06:48
Aby dodać nową kolumnę do tabeli należy użyć ALTER
. W Androidzie możesz dodać nową kolumnę wewnątrz onUpgrade()
.
Możesz się zastanawiać, jak onUpgrade()
doda nową kolumnę?
Kiedy implementujesz podklasę SQLiteOpenHelper
, musisz wywołać konstruktor klasy superclass: super(context, DB_NAME, null, 1);
w konstruktorze klasy. Tam przeszedłem 1
dla wersji.
Kiedy zmieniłem wersję 1
na powyższą(2
lub większą), onUpgrade()
będzie wywoływana. I wykonać modyfikacje SQL, które zamierzam do zrobienia.
Konstruktor mojej klasy po zmianie wersji:
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, 2);//version changed from 1 to 2
}
SQL modifications sprawdza tak, superclass constructor porównuje wersję przechowywanego pliku SQLite db z wersją, którą przekazałem do super()
. Jeśli te (poprzednie i obecne) numery wersji są inne, zostanie wywołane onUpgrade()
.
Kod powinien wyglądać tak:
@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");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-19 13:36:14
Natknąłem się na link szukając tego samego problemu. Wyjaśnia, jak korzystać z aktualizacji. https://thebhwgroup.com/blog/how-android-sqlite-onupgrade
Wyjaśnia dlaczego używać poniższego kodu
@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);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-08 07:16:23
Najprostszym sposobem na utworzenie nowej kolumny w tabeli jest dodanie SQL do metody onUpgrade() w klasie sqliteopenhelper. Like:
@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");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 11:14:52
Po prostu zmień swój kod
Private final INT DATABASE_VERSION = 1;
Do
Private static final INT DATABASE_VERSION =2;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-29 07:23:40