Kiedy jest uruchamiane sqliteopenhelper onCreate() / onUpgrade ()?

Stworzyłem moje tabele w moim SQLiteOpenHelper onCreate() ale otrzymać

SQLiteException: no such table

Lub

SQLiteException: no such column

Błędy. Dlaczego?

Uwaga:

(to jest połączone podsumowanie dziesiątek podobnych pytań co tydzień. Próba dostarczenia "kanonicznego" pytania/odpowiedzi Społeczności wiki tutaj, aby wszystkie te pytania mogły być skierowane do dobrego odniesienia.)

Author: laalto, 2014-02-19

13 answers

SQLiteOpenHelper onCreate() oraz onUpgrade() wywołania zwrotne są wywoływane, gdy baza danych jest rzeczywiście otwarta, na przykład przez wywołanie do getWritableDatabase(). Baza danych nie jest otwierana podczas tworzenia samego obiektu pomocnika bazy danych.

SQLiteOpenHelper wersje plików baz danych. Numer wersji jest argumentem int przekazanym do konstruktora . W pliku bazy danych Numer wersji jest przechowywany w PRAGMA user_version.

onCreate() jest uruchamiany tylko wtedy, gdy baza danych plik nie istnieje i został utworzony. Jeśli onCreate() zakończy się pomyślnie (nie wyrzuca wyjątku), zakłada się, że baza danych zostanie utworzona z żądanym numerem wersji. Jako implikację, nie powinieneś łapać SQLException s W onCreate() siebie.

onUpgrade() jest wywoływana tylko wtedy, gdy plik bazy danych istnieje, ale zapisany numer wersji jest niższy niż wymagany w konstruktorze. onUpgrade() powinien zaktualizować schemat tabeli do żądanej wersji.

Podczas zmiany schematu tabeli w kodzie (onCreate()), Należy upewnić się, że baza danych jest aktualizowana. Dwa główne podejścia:

  1. Usuń stary plik bazy danych, aby onCreate() został uruchomiony ponownie. Jest to często preferowane w czasie programowania, gdy masz kontrolę nad zainstalowanymi wersjami, a utrata danych nie stanowi problemu. Kilka sposobów na usunięcie pliku bazy danych:

    • Odinstaluj aplikację. Użyj Menedżera aplikacji lub adb uninstall your.package.name z powłoki.

    • Wyczyść dane aplikacji. Użyj aplikacji manager.

  2. Zwiększ wersję bazy danych tak, aby została wywołana onUpgrade(). Jest to nieco bardziej skomplikowane, ponieważ potrzeba więcej kodu.

    • W przypadku aktualizacji schematu czasu rozwoju, gdzie utrata danych nie jest problemem, możesz użyć execSQL("DROP TABLE IF EXISTS <tablename>") in, Aby usunąć istniejące tabele i wywołać onCreate(), aby odtworzyć bazę danych.

    • W przypadku wydanych wersji należy zaimplementować migrację danych w onUpgrade(), aby użytkownicy nie tracili swoich data.

 325
Author: laalto,
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
2014-02-19 13:31:07

Do dalszego dodawania brakujących punktów tutaj, zgodnie z zapytaniem Jaski

Wersja bazy danych jest przechowywana w pliku bazy danych SQLite.

Catch jest konstruktorem

SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

Więc gdy konstruktor pomocnika bazy danych jest wywoływany z name (2nd param), Platforma sprawdza, czy baza danych istnieje, czy nie i jeśli baza danych istnieje, pobiera informacje o wersji z nagłówka pliku bazy danych i uruchamia właściwe wywołanie

Jak już wyjaśniono w starsza odpowiedź, jeśli baza danych o nazwie nie istnieje, uruchamia onCreate.

Poniżej objaśnienie wyjaśnia onUpgrade przypadek z przykładem.

Powiedzmy, że Twoja pierwsza wersja aplikacji miała DatabaseHelper (Extended SQLiteOpenHelper) z konstruktorem przekazującym wersję jako 1, a następnie dostarczyłeś zaktualizowaną aplikację z nowym kodem źródłowym o wersji przekazanej jako 2, a następnie automatycznie po skonstruowaniu DatabaseHelper, Platforma uruchamia {[5] } widząc plik już istnieje, ale nie jest to możliwe. wersja jest niższa niż bieżąca wersja, którą przeszedłeś.

Teraz powiedzmy, że planujesz dać trzecią wersję aplikacji z wersją db jako 3 (wersja db jest zwiększana tylko wtedy, gdy schemat bazy danych ma być modyfikowany). W takich przyrostowych aktualizacjach musisz napisać logikę aktualizacji z każdej wersji stopniowo, aby uzyskać lepszy możliwy do utrzymania kod {]}

Przykładowy pseudo kod poniżej:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  switch(oldVersion) {
    case 1:
       //upgrade logic from version 1 to 2
    case 2:
       //upgrade logic from version 2 to 3
    case 3:
       //upgrade logic from version 3 to 4
       break;
    default:
       throw new IllegalStateException(
                "onUpgrade() with unknown oldVersion " + oldVersion);
  }
}

Zwróć uwagę na brakujące break stwierdzenie w przypadku 1 i 2. To jest co mam na myśli przez przyrostowe uaktualnienie.

Jeśli stara wersja to 2, a nowa to 4, to logika zaktualizuje bazę danych z 2 do 3, a następnie do 4 Jeśli stara wersja to 3, a nowa to 4, to po prostu uruchomi logikę aktualizacji dla 3 do 4
 88
Author: Aun,
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-02-14 12:35:36

onCreate()

  1. Kiedy tworzymy bazę danych po raz pierwszy (tzn. Baza Danych nie istnieje) onCreate() tworzymy bazę danych z wersją przekazaną w SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

  2. onCreate() metoda polega na utworzeniu zdefiniowanych tabel i wykonaniu dowolnego innego napisanego kodu. Jednak ta metoda zostanie wywołana tylko wtedy, gdy brakuje pliku SQLITE w katalogu danych aplikacji (/data/data/your.apps.classpath/databases).

  3. Ta metoda nie zostanie wywołana, jeśli zmieniłeś kod i ponownie uruchomiony w emulatorze. Jeśli chcesz uruchomić onCreate(), musisz użyć adb, aby usunąć plik bazy danych SQLite.

onUpgrade()

  1. SQLiteOpenHelper powinien zadzwonić do super konstruktora.
  2. metoda onUpgrade() zostanie wywołana tylko wtedy, gdy liczba całkowita wersji jest większa niż bieżąca wersja uruchomiona w aplikacji.
  3. jeśli chcesz wywołać metodę onUpgrade(), musisz zwiększyć numer wersji w kodzie.
 18
Author: jeet parmar,
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-01-03 14:52:36

Może i jestem za późno, ale chciałbym podzielić się moją krótką i słodką odpowiedzią. Proszę sprawdzić ODPOWIEDŹ za ten sam problem. To na pewno ci pomoże. Koniec z głębokimi specyfikacjami.

Jeśli masz pewność co do składni tworzenia tabeli, może się to zdarzyć, gdy dodasz nową kolumnę do tej samej tabeli...

1) Odinstaluj urządzenie i uruchom je ponownie.

Lub

2) Ustawienia - > app - > ClearData

Lub

3) Zmień DATABASE_VERSION w klasie "DatabaseHandler" (jeśli dodałeś nową kolumnę, zostanie ona automatycznie uaktualniona)

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

Lub

4) Zmiana DATABASE_NAME w klasie " DatabaseHandler "( miałem ten sam problem. Ale udaje mi się zmienić DATABASE_NAME.)

 6
Author: shital,
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-23 12:18:24

Punkty do zapamiętania przy przedłużaniu SQLiteOpenHelper

  1. super(context, DBName, null, DBversion); - to powinno być wywołane w pierwszej linii konstruktora
  2. override onCreate and onUpgrade (if needed)
  3. onCreate zostanie wywołane tylko wtedy, gdy wykonywane jest getWritableDatabase() lub getReadableDatabase(). Zostanie wywołana tylko raz, gdy DBName podany w pierwszym kroku nie jest dostępny. Możesz dodać zapytanie Utwórz tabelę za pomocą metody onCreate
  4. Gdy chcesz dodać nową tabelę po prostu zmień DBversion i wykonaj zapytania w onUpgrade tabeli lub po prostu Odinstaluj, a następnie zainstaluj aplikację.
 3
Author: JibinNajeeb,
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-10-31 19:48:13

Odinstaluj aplikację z emulatora lub urządzenia. Uruchom aplikację ponownie. (OnCreate () nie jest wykonywane, gdy baza danych już istnieje)

 0
Author: Nand gopal,
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-03-11 11:32:27

Żadna taka tabela nie znajduje się głównie wtedy, gdy nie otworzyłeś klasy SQLiteOpenHelper z getwritabledata() i wcześniej musisz również wywołać konstruktor make z nazwą & wersją bazy danych. I OnUpgrade jest wywoływana, gdy w numerze wersji podanym w klasie SQLiteOpenHelper znajduje się wartość upgrade.

Poniżej znajduje się fragment kodu (Nie znaleziono takiej kolumny z powodu zaklęcia w nazwie kolumny):

public class database_db {
    entry_data endb;
    String file_name="Record.db";
    SQLiteDatabase sq;
    public database_db(Context c)
    {
        endb=new entry_data(c, file_name, null, 8);
    }
    public database_db open()
    {
        sq=endb.getWritableDatabase();
        return this;
    }
    public Cursor getdata(String table)
    {
        return sq.query(table, null, null, null, null, null, null);
    }
    public long insert_data(String table,ContentValues value)
    {
        return sq.insert(table, null, value);
    }
    public void close()
    {
        sq.close();
    }
    public void delete(String table)
    {
        sq.delete(table,null,null);
    }
}
class entry_data extends SQLiteOpenHelper
{

    public entry_data(Context context, String name, SQLiteDatabase.CursorFactory factory,
                      int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase sqdb) {
        // TODO Auto-generated method stub

        sqdb.execSQL("CREATE TABLE IF NOT EXISTS 'YOUR_TABLE_NAME'(Column_1 text not null,Column_2 text not null);");

    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
          onCreate(db);
    }

}
 0
Author: Bharat Lalwani,
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-04 10:39:21

Możesz utworzyć bazę danych i tabelę jak

public class DbHelper extends SQLiteOpenHelper {
private static final String DBNAME = "testdatbase.db";
private static final int VERSION = 1;

public DbHelper(Context context) {
    super(context, DBNAME, null, VERSION);
    // TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL("create table BookDb(id integer primary key autoincrement,BookName text,Author text,IssuedOn text,DueDate text,Fine text,Totalfine text");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS BookDb");
    onCreate(db);
  }
}

Uwaga: Jeśli chcesz utworzyć inną tabelę lub dodać kolumny lub nie ma takiej tabeli, po prostu zwiększ wersję

 0
Author: Enamul Haque,
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-04 18:51:09

Nazwa bazy danych musi kończyć się na.db również twoje ciągi zapytań muszą mieć terminator (;)

 0
Author: Omer Haqqani,
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-08-01 08:08:06

Jeśli zapomnisz podać ciąg" name "jako drugi argument konstruktora, tworzy on bazę danych "In-memory", która jest usuwana po zamknięciu aplikacji.

 0
Author: phreakhead,
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-28 04:52:48

OnCreate jest wywoływane po raz pierwszy, gdy potrzebne jest tworzenie tabel. Musimy nadpisać tę metodę, gdzie piszemy skrypt do tworzenia tabeli, który jest wykonywany przez SQLiteDatabase. metoda execSQL. Po pierwszym uruchomieniu metoda ta nie zostanie wywołana dalej.

onUpgrade Metoda ta jest wywoływana podczas aktualizacji wersji bazy danych. Załóżmy, że po pierwszym wdrożeniu, wersja bazy danych była 1, a w drugim wdrożeniu było zmiana struktury bazy danych np. dodanie dodatkowej kolumny w tabeli. Załóżmy, że wersja bazy danych jest teraz 2.

 0
Author: Faxriddin Abdullayev,
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-01-15 07:49:56

Sprawdź ponownie swoje zapytanie w klasie ur DatabaseHandler / DatabaseManager (którą kiedykolwiek wziąłeś)

 0
Author: venu,
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-10-04 07:30:18

Metoda Sqliteopenhelper ma metody create I upgrade, create jest używana, gdy tabela jest tworzona po raz pierwszy, a metoda upgrade będzie wywoływana za każdym razem, gdy liczba kolumn tabeli zostanie zmieniona.

 -2
Author: Vishwa Pratap,
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-12-30 16:54:01