2011-11-26 12 views
6

Quiero usar preloaded database en mi aplicación significa tratar de obtener la base de datos en el momento en que está instalado el apk para que pueda usar los datos ya guardados en eso. Copio el archivo "ingredients.db" en la carpeta de activos. Y utilizando un código siguiente, pero este consigue el error "Problema copia de base de datos Desde recurso de archivo"Cómo usar la base de datos SQLite precargada en Android desde Assets

¿Cómo puedo solucionar este problema? favor me sugieren las maneras posibles

Mi Clase auxiliar de base de datos es así

class IngredientHelper extends SQLiteOpenHelper { 
     private static final String DATABASE_PATH = "/data/data/com.example.preloadeddatabase/databases/"; 
     private static final String DATABASE_NAME = "ingredients.db"; 

     private static final String TABLE_NAME = "Ingredients"; 
     private static final String COLUMN_ID = "_id"; 
     private static final String COLUMN_TITLE = "ingredient_name"; 

     private static final int SCHEMA_VERSION = 1; 

     public SQLiteDatabase dbSqlite; 
     private final Context myContext; 

     public IngredientHelper(Context context) { 
      super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
      this.myContext = context; 

     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 

     } 

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

     } 

     public void createDatabase() { 

      createDB(); 
     } 

     public void createDB() { 

      boolean dbExist = DbExists(); 

      if (!dbExist) { 
       this.getReadableDatabase(); 
       copyDataBase(); 

      } 
     } 

     private boolean DbExists() { 
      SQLiteDatabase db = null; 
      try { 
       String databasePath = DATABASE_PATH + DATABASE_NAME; 
       db = SQLiteDatabase.openDatabase(databasePath, null, 
         SQLiteDatabase.OPEN_READWRITE); 

       db.setLocale(Locale.getDefault()); 
       db.setLockingEnabled(true); 
       db.setVersion(1); 

      } 

      catch (SQLiteException e) { 
       Log.e("SqlHelper", "Database Not Found"); 
      } 

      if (db != null) { 
       db.close(); 
      } 

      return db != null ? true : false; 
     } 

     private void copyDataBase() { 
      InputStream iStream = null; 
      OutputStream oStream = null; 
      String outFilePath = DATABASE_PATH + DATABASE_NAME; 
      try { 
       iStream = myContext.getAssets().open(DATABASE_NAME); 
       oStream = new FileOutputStream(outFilePath); 
       byte[] buffer = new byte[2048]; 
       int length; 
       while ((length = iStream.read(buffer)) > 0) { 
        oStream.write(buffer, 0, length); 
       } 
       oStream.flush(); 
       oStream.close(); 
       iStream.close(); 
      } 

      catch (IOException e) { 
       throw new Error("Problem Copying Database From Resource File"); 
      } 
     } 

     public void openDatabase() throws SQLException { 

      String myPath = DATABASE_PATH + DATABASE_NAME; 
      dbSqlite = SQLiteDatabase.openDatabase(myPath, null, 
        SQLiteDatabase.OPEN_READWRITE); 
     } 

     @Override 
     public synchronized void close() { 

      if (dbSqlite != null) { 
       dbSqlite.close(); 
      } 
      super.close(); 

     } 

     public Cursor getCursor() { 
      SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); 
      queryBuilder.setTables(TABLE_NAME); 
      String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE }; 

      Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, 
        null, null, null, null, "ingredient_name ASC"); 

      return mCursor; 
     } 

     public String getName(Cursor c) { 
      return (c.getString(1)); 
     } 

Respuesta

0

el archivo de base de datos debe tener la extensión ".sqlite" en lugar ".db"

+0

@ Jazz-- dónde cambiar la extensión .db en la carpeta assets o en DATABASE_NAME –

+0

no no, cuando está creando un archivo db desde el administrador sqlite, guárdelo como dbname.sqlite (predeterminado). No es necesario modificar – jazz

2

No abra la lectura base de datos hasta después de copiar el archivo de recursos en su directorio de base de datos. Es probable que obtenga la excepción ya que está intentando escribir en un archivo que ya tiene abierto (ya que se abre cuando llama a getReadableDatabase()).

1

Aquí hay un problema de simple solution, pero en este método hay un error. Cuando utiliza un método this.getReadableDatabase() ;, la base de datos está abierta, es decir, debe estar cerca de this.close(); Este error es especialmente importante para dispositivos HTC Desire

Use this solution, allí resuelve el problema al abrir DB.

Cuestiones relacionadas