2010-08-02 3 views
55

Ich habe eine Datenbank für meine Android-App erstellt, die statische Daten enthält und keine Aktualisierungs-/Löschfunktion erfordert. Daher muss beim Start der App überprüft werden, ob die Datenbank existiert und wenn nicht, dann führe meine dbAdapter-Klasse aus. Ich weiß, es ist eine einfache if-Anweisung, aber ich habe mich nur gefragt, die effizienteste Möglichkeit zu fragen, ob die db existiert.Abfrage, ob eine Android-Datenbank existiert!

Prost

+0

Dieser Link ist hilfreich: http://sree.cc/google/android/checking-if-a-database-or-table-exists-in-an-android- sqlite –

Antwort

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; 
} 

wo DB_FULL_PATH der Pfad zu Ihrer Datenbank-Datei ist. Der Grund, warum ich nicht nur überprüfe, ob eine Datei existiert, ist, weil sie nicht sagen würde, ob (a) sie eine SQL-DB-Datei ist, (b) die Datei nicht korrupt ist und tatsächlich gelesen werden kann, dh aufgrund von Teil herunterladen oder wie auch immer es erstellt wurde.

+4

Ich habe versucht, dies zu verwenden, um zu sehen, ob ich die "Starter" -Datenbank aus dem Bundle kopieren oder einfach weitermachen und laden musste, was da war. also habe ich es versucht. aber für mich war das immer wieder wahr, auch wenn keine Datenbank vorhanden war. –

+3

-1 für die Verwendung von try/catch, um eine normale un-Ausnahmeoperation auszuführen – eddi

+2

Es ist schrecklich, einen try/catch zu verwenden, nur um zu sehen, ob etwas null ist ... Warum nicht 'checkDB = SQLiteDatabase.openDatabase (DB_FULL_PATH, null , SQLiteDatenbank.OPEN_READONLY); if (checkDB == null) {// Datenbank existiert noch nicht.} '. Ich denke, es ist nicht deine Schuld, es scheint, dass Java mit dieser Art von Unsinn geplagt wird ... – Kevin

4

Wenn Sie initialisieren die unter Klasse mit:

mOpenHelper = new DatabaseHelper(getContext()); 

, dass die Datenbank automatisch erstellen, wenn es nicht vorhanden ist. Sie können auch die Datenbank aktualisieren, indem Sie den DB_VER in eine höhere Zahl ändern.

Dann, so dass Sie in der Lage, die Datenbanknutzung abfragen:

SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

die oben bekommt man db.query() & db.insert() etc Methoden.

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

es ist ganz einfach: wie Sie Ihre Datenbank in try-Block mit Pfad von da databse öffnen:

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

wenn eine Ausnahme auftritt, dann wird Datenbank nicht beendet es so erstellen:

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(); 
} 

das ist es, du bist fertig :)

139

Ich würde lieber die Existenz überprüfen der Datei direkt:

+4

Sauber und kurz! Liebe es. Danke. –

+0

Was soll ich als Kontext senden? – madprops

+1

Jeder Kontext sollte tun, auch der Anwendungskontext – rds

0

Erstellen Sie ein globales Datenbank Helper-Klassenobjekt in Ihrer Hauptaktivität. In der Funktion MainActivity des onCreate() versuchen Sie dies:

//global database helper variable 

DatabaseHelper dbh; 

//in the onCreate() 

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

else 
//create db 
+1

Dies beantwortet die Frage nicht. Es wäre mit dem Code des DatabaseHelper. – rds

0

habe ich versucht, die Version wie von Mathias Conradt zur Verfügung gestellt, aber ich fand, dass einfach zu überprüfen, ob DB = null unzureichend ist!. Ich habe dies geändert:

  /** 
     * 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; 
     } 
Verwandte Themen