2010-08-02 3 views
55

J'ai créé une base de données pour mon application Android qui contient des données statiques et ne nécessite pas de fonctionnalité de mise à jour/suppression, donc quand l'application démarre, je veux vérifier si la base de données existe. Je sais que c'est une simple déclaration si mais je me demandais juste la manière la plus efficace de demander si la base de données existe.Interrogez si la base de données Android existe!

Vive

+0

Ce lien est utile: http://sree.cc/google/android/checking-if-a-database-or-table-exists-in-an-android- sqlite –

Répondre

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

où DB_FULL_PATH est le chemin vers votre fichier de base de données. Et la raison pour laquelle je ne vérifie pas si un fichier existe est parce qu'il ne dirait pas si (a) il s'agit d'un fichier sqlite db, (b) le fichier n'est pas corrompu et peut être lu, c'est-à-dire télécharger ou cependant il a été créé.

+4

J'ai essayé d'utiliser ceci pour voir si je devais copier la base de données de "démarreur" du paquet ou juste aller de l'avant et charger ce qui était là. donc j'ai essayé d'utiliser ça. mais pour moi, cela est vrai tout le temps, même s'il n'y avait pas de base de données présente. –

+3

-1 pour utiliser try/catch pour effectuer une opération normale non-exceptionnelle – eddi

+2

Il est horrible d'utiliser un try/catch juste pour voir si quelque chose est nul ...... Pourquoi pas 'checkDB = SQLiteDatabase.openDatabase (DB_FULL_PATH, null , SQLiteDatabase.OPEN_READONLY); if (checkDB == null) {// la base de données n'existe pas encore.} '. Je suppose que ce n'est pas votre faute, il semble que java est en proie à ce genre de non-sens ... – Kevin

4

Lorsque vous initialisez la classe ci-dessous avec:

mOpenHelper = new DatabaseHelper(getContext()); 

Cela crée automatiquement la base de données si elle n'est pas présent. Il vous permet également de mettre à niveau la base de données en changeant DB_VER à un nombre plus élevé.

Ensuite, donc vous êtes en mesure d'interroger l'utilisation de base de données:

SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

vous la passe au-dessus db.query() & db.insert() méthodes etc.

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

c'est simple: Ouvrez votre base de données dans le bloc d'essai avec le chemin de da databse comme:

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

si une exception se produit alors la base de données ne crée pas de quitter il:

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

c'est tout ce que vous avez fait :)

139

Je préfère vérifier l'existence du fichier directement:

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

Propre et bref! Aimer. THX. –

+0

que dois-je envoyer en contexte? – madprops

+1

Tout contexte devrait faire, même le contexte de l'application – rds

0

Créez un objet de classe d'assistance de base de données globale dans votre activité principale. Dans la fonction onCreate de MainActivity() essayez ceci:

//global database helper variable 

DatabaseHelper dbh; 

//in the onCreate() 

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

else 
//create db 
+1

Cela ne répond pas à la question. Ce serait avec le code de DatabaseHelper. – rds

0

J'ai essayé la version telle que fournie par Mathias Conradt mais je trouve simplement vérifier si DB = null est insuffisant!. Je l'ai modifié à ceci:

  /** 
     * 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; 
     } 
Questions connexes