2010-08-02 22 views
55

Utworzyłem bazę danych dla mojej aplikacji na Androida, która zawiera dane statyczne i nie wymaga funkcji aktualizacji/usuwania, a zatem po uruchomieniu aplikacji chcę sprawdzić, czy istnieje db, a jeśli nie, to wykonaj moją klasę dbAdapter. Wiem, że jest to proste, ale oświadczenie, ale właśnie zastanawiałem się, najefektywniejszym sposobem sprawdzenia, czy istnieje db.Zapytanie, czy baza danych Androida istnieje!

Cheers

+0

Ten link jest pomocne: http://sree.cc/google/android/checking-if-a-database-or-table-exists-in-an-android- sqlite –

Odpowiedz

73
/** 
* Check if the database exist and can be read. 
* 
* @return true if it exists and can be read, false if it doesn't 
*/ 
private boolean checkDataBase() { 
    SQLiteDatabase checkDB = null; 
    try { 
     checkDB = SQLiteDatabase.openDatabase(DB_FULL_PATH, null, 
       SQLiteDatabase.OPEN_READONLY); 
     checkDB.close(); 
    } catch (SQLiteException e) { 
     // database doesn't exist yet. 
    } 
    return checkDB != null; 
} 

gdzie DB_FULL_PATH jest ścieżką do pliku bazy danych.

Powodem, dla którego nie sprawdzam tylko, czy plik istnieje, jest to, że nie określi, czy (a) jest to plik sqlite db, (b) plik nie jest uszkodzony i może zostać odczytany, tj. Z powodu częściowego pobierz lub został utworzony.

+4

Próbowałem tego użyć, aby sprawdzić, czy muszę skopiować bazę danych "starter" z pakietu lub po prostu załadować to, co tam było. więc próbowałem tego używać. ale dla mnie to się powtarzał cały czas, nawet jeśli nie było żadnej bazy danych. –

+3

-1 za używanie try/catch do wykonywania normalnej nietypowej operacji – eddi

+2

To jest okropne, aby użyć polecenia try/catch, aby sprawdzić, czy coś jest puste ...... Dlaczego nie 'checkDB = SQLiteDatabase.openDatabase (DB_FULL_PATH, null , SQLiteDatabase.OPEN_READONLY); if (checkDB == null) {// baza danych jeszcze nie istnieje.} '. Domyślam się, że to nie twoja wina, wydaje się, że java jest nękana tego rodzaju nonsensem ... – Kevin

4

Podczas inicjalizacji poniżej klasy z:

mOpenHelper = new DatabaseHelper(getContext()); 

który automatycznie utworzyć bazę danych, jeśli nie jest obecny. Umożliwia także aktualizację bazy danych poprzez zmianę DB_VER na wyższy numer.

Następnie, dzięki czemu są w stanie kwerendy wykorzystanie bazy danych:

SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

wyżej dostaje db.query() & db.insert() etc metod.

private static class DatabaseHelper extends SQLiteOpenHelper { 

    private static final String DB_NAME = "db_name.db"; 
    private static final int DB_VER = 1; 

    public DatabaseHelper(Context context) { 
     super(context, DB_NAME, null, DB_VER); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL("CREATE TABLE table_name (" + "_id INTEGER PRIMARY KEY, " 
       + " column_name_2 TEXT);"); 


       .execSQL("INSERT INTO table_name " 
         + "(column_name_2) " 
         + "VALUES " + "('hello world');"); 


    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

     Log.w(TAG + "Upgrading database from version " + oldVersion + " to " 
       + newVersion + ", which will destroy all old data"); 
     try { 
      db.execSQL("DROP TABLE IF EXISTS table_name"); 
      onCreate(db); 

     } catch (SQLException e) { 
      Log.e(TAG + "getting exception " 
        + e.getLocalizedMessage().toString()); 
     } 
    } 

} 
2

to proste: Otwórz bazę danych w bloku try ze ścieżki da databse jak:

try{ 
    SQLiteDatabase dbe = SQLiteDatabase.openDatabase("/data/data/bangla.rana.fahim/databases/dictionary", null,0); 
      Log.d("opendb","EXIST"); 
      dbe.close(); 
      } 

jeśli wystąpi wyjątek następnie baza danych nie zostanie wysunięty tak go utworzyć:

catch(SQLiteException e){ 
       Log.d("opendb","NOT EXIST"); 

      SQLiteDatabase db = openOrCreateDatabase("dictionary", MODE_PRIVATE, null); 
        db.execSQL("CREATE TABLE IF NOT EXISTS LIST(wlist varchar);"); 

        db.execSQL("INSERT INTO LIST VALUES('খবর');"); 
        db.execSQL("INSERT INTO LIST VALUES('কবর');"); //whatever you want 
       db.close(); 
} 

to wszystko, co musisz zrobić :)

139

Wolałbym sprawdzić istnienie pliku bezpośrednio:

private static boolean doesDatabaseExist(Context context, String dbName) { 
    File dbFile = context.getDatabasePath(dbName); 
    return dbFile.exists(); 
} 
+4

Czysto i zwięźle! Kocham to. Dzięki. –

+0

co powinienem wysłać jako kontekst? – madprops

+1

Każdy kontekst powinien zrobić, nawet kontekst aplikacji – rds

0

Utwórz globalny obiekt klasy pomocniczej bazy danych w głównej aktywności. W funkcji główną działalność za onCreate() Spróbuj:

//global database helper variable 

DatabaseHelper dbh; 

//in the onCreate() 

if(dbh.getReadableDatabase()!=null) 
//view the list 

else 
//create db 
+1

To nie odpowiada na pytanie. Byłoby to z kodem DatabaseHelper. – rds

0

Próbowałem wersję przewidziane przez Mathias Conradt ale uważam, że po prostu sprawdzić, czy DB = null jest niewystarczające!. Mam zmienione to:

  /** 
     * Check if the database exist and can be read. 
     * 
     * @return true if it exists and can be read, false if it doesn't 
     */ 
     private boolean checkDataBase(String InDBFile) { 
      SQLiteDatabase checkDB = null; 
      boolean res = false; 
      try { 
       checkDB = SQLiteDatabase.openDatabase(InDBFile, null, 
         SQLiteDatabase.OPEN_READONLY); 
       res = (checkDB.getVersion() > 0); 
       checkDB.close(); 
      } catch (SQLiteException e) { 
       // database doesn't exist yet. 
       Log.e("checkDataBase", "Selected file could not be opened as DB."); 

       res = false; 
      } 
      return res; 
     } 
Powiązane problemy