2010-08-02 16 views
55

He creado una base de datos para mi aplicación Android que contiene datos estáticos y no requiere funcionalidad de actualización/eliminación. Cuando la aplicación se inicia, quiero verificar si el archivo db existe y si no, ejecutar mi clase dbAdapter. Sé que es una simple declaración if, pero me preguntaba cuál es la forma más eficiente de consultar si existe el db.¡Pregunta si existe la base de datos de Android!

Saludos

+0

Este enlace es muy útil: http://sree.cc/google/android/checking-if-a-database-or-table-exists-in-an-android- sqlite –

Respuesta

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

donde DB_FULL_PATH es la ruta de acceso al archivo de base de datos.

Y la razón por la que no estoy comprobando si existe un archivo es porque no dice si (a) es un archivo sqlite db, (b) el archivo no está dañado y puede leerse, es decir, debido a parcial descargar o como sea que se haya creado.

+4

Intenté usar esto para ver si tenía que copiar la base de datos "inicial" del paquete o simplemente continuar y cargar lo que estaba allí. así que traté de usar esto. pero para mí esto volvió verdadero todo el tiempo, incluso si no había una base de datos presente. –

+3

-1 para usar try/catch para realizar una operación normal no excepcional – eddi

+2

Es horrible usar un try/catch solo para ver si algo es nulo ...... ¿Por qué no? CheckDB = SQLiteDatabase.openDatabase (DB_FULL_PATH, null , SQLiteDatabase.OPEN_READONLY); if (checkDB == null) {// la base de datos aún no existe.} '. Supongo que no es tu culpa, parece que Java está plagado de este tipo de tonterías ... – Kevin

4

al inicializar la clase más abajo con:

mOpenHelper = new DatabaseHelper(getContext()); 

que creará automáticamente la base de datos si no está presente. También le permite actualizar la base de datos cambiando el DB_VER a un número más alto.

A continuación, por lo que son capaces de consultar la base de datos de uso:

SQLiteDatabase db = mOpenHelper.getWritableDatabase(); 

lo anterior le consigue db.query() & db.insert) etc (métodos.

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 simple: Abra su base de datos en bloque try con la ruta de da DATABSE como:

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

si se produce una excepción a continuación, la base de datos no sale tan crearlo:

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

eso es todo lo que has hecho :)

139

Prefiero comprobar la existencia del archivo directamente:

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

¡Limpio y breve! Quiéralo. Gracias. –

+0

¿qué debo enviar como contexto? – madprops

+1

Cualquier contexto debería hacer, incluso el contexto de la aplicación – rds

0

Cree un objeto de clase de ayuda de base de datos global en su actividad principal. En la función de MainActivity onCreate() intente esto:

//global database helper variable 

DatabaseHelper dbh; 

//in the onCreate() 

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

else 
//create db 
+1

Esto no responde la pregunta. Lo haría con el código de DatabaseHelper. – rds

0

probé la versión de la manera prevista por Mathias Conradt pero he encontrado que simplemente comprobar si DB = null no es suficiente!. He modificado para esto:

  /** 
     * 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; 
     } 
Cuestiones relacionadas