2013-12-11 1 views
0

Я получаю следующую ошибку, выгружая данные файла с именем instalacionesdep.db. Самое забавное, что все загружено правильно, но в logcat я получаю следующую ошибку.Не удалось выгрузить данные из файла с расширением. Db

12-11 13:05:54.284: E/SqliteDatabaseCpp(17232): sqlite3_open_v2("data/data/com.mipaquete.instalacionesdep/databases/instalacionesdep.db", &handle, 1, NULL) failed 
12-11 13:05:54.354: E/SQLiteDatabase(17232): Failed to open the database. closing it. 
12-11 13:05:54.354: E/SQLiteDatabase(17232): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file 
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1013) 
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:986) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:962) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at com.mipaquete.instalacionesdep.db.DataBaseHelper.checkDataBase(DataBaseHelper.java:99) 
12-11 13:05:54.354: E/SQLiteDatabase(17232): at com.mipaquete.instalacionesdep.db.DataBaseHelper.createDataBase(DataBaseHelper.java:72) 
12-11 13:05:54.354: E/SQLiteDatabase(17232): at com.mipaquete.instalacionesdep.db.TodasLasInstalacionesActivity.onClick(TodasLasInstalacionesActivity.java:71) 
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.view.View.performClick(View.java:3511) 
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.view.View$PerformClick.run(View.java:14105) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at android.os.Handler.handleCallback(Handler.java:605) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at android.os.Handler.dispatchMessage(Handler.java:92) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at android.os.Looper.loop(Looper.java:137) 
12-11 13:05:54.354: E/SQLiteDatabase(17232): at android.app.ActivityThread.main(ActivityThread.java:4424) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at java.lang.reflect.Method.invoke(Method.java:511) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
12-11 13:05:54.354: E/SQLiteDatabase(17232): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
12-11 13:05:54.354: E/SQLiteDatabase(17232):  at dalvik.system.NativeStart.main(Native Method) 

Я думаю, что закрытие myDbhelper когда-нибудь, но я думаю, что я делаю все шаги и не может найти неисправность. Это сводка моего класса, которая расширяет код SQLiteOpenHelper DataBAseHelper.

public class DataBaseHelper extends SQLiteOpenHelper { 

    //Variables ausiliares 
    private static String DB_PATH="data/data/com.mipaquete.instalacionesdep/databases/"; 
    private static final String DB_NAME="instalacionesdep.db"; 
    //private static final int DATABASE_VERSION =1; 


    private SQLiteDatabase myDatabase; 
    private final Context myContext; 


    public DataBaseHelper(Context context) { 
     super(context, DB_NAME, null, 1); 
     // TODO Auto-generated constructor stub 
     this.myContext = context; 
    } 


    public void createDataBase() throws IOException{ 
     //para chequear que existe la BD 
     boolean dbExist = checkDataBase(); 

     SQLiteDatabase db_read = null; 

     if(dbExist){ 

     }else{ 
      //agarramos la BD para leerla y despues la cerramos. 
      db_read = this.getReadableDatabase(); 
      db_read.close(); 

      try { 
       copyDataBase(); 
      } catch (Exception e) { 
       // TODO: handle exception 
       throw new Error("Error copying database (createDataBase)"); 
      } 
     } 

    } 

    public boolean checkDataBase(){ 
     SQLiteDatabase checkDB = null; 
     SQLiteDatabase db_read = null; 

     try{ 
      String myPath = DB_PATH+DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
     }catch (SQLException e) { 
      // TODO: handle exception 
      File dbFile = new File(DB_PATH+DB_NAME); 
      return dbFile.exists(); 
     } 
     if(checkDB != null){ 
      checkDB.close(); 

     } 

     //regresa un true o un false dependidendo si se cumple la condicion. Los : sustituyen al else 
     return checkDB != null ? true : false; 
    } 

    //vamos a volcar 
    public void copyDataBase() throws IOException{ 

     InputStream myInput = myContext.getAssets().open(DB_NAME); 
     String outFileName = DB_PATH+DB_NAME; 

     OutputStream myOutPut = new FileOutputStream(outFileName); 

     Log.e("LocAndroid", "ESTOY EN copyDataBase"); 

     //Para trasnferir el fichero en tamaños de 1024 bytes 
     byte[] buffer = new byte[1024]; 
     int lenght; 

     //while para que nos mande el archivo. 
     while((lenght = myInput.read(buffer))!=-1){ 
      if(lenght > 0){ 
       myOutPut.write(buffer, 0, lenght); 
      //con esto hemos copiado la base de datos. Basicamente, El volcado del archivo 

      } 

     } 
     myOutPut.flush(); 
     myOutPut.close(); 
     myInput.close(); 
    } 

    //Para abrir la base de datos 
    public void openDataBase() throws SQLException{ 

     //myDatabase = this.getWritableDatabase(); 
     String myPath = DB_PATH+DB_NAME; 
     myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 
    } 

    //Para cerrar la base de datos 
    public synchronized void close(){ 

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

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 

    } 


} 

спасибо!

ответ

0

Ошибка была checkdatabase(). В частности, в строках:

String myPath = DB_PATH+DB_NAME; 
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

Первый запуск всегда дает ошибку. Потому что базы данных не существует. checkdatabase должен содержать только этот код:

File dbFile = new File(DB_PATH+DB_NAME); return dbFile.exists();