2013-05-19 2 views
2

извините за такую ​​хромую проблему, но я не могу ее решить в течение 4 часов. Я пытаюсь скопировать базу данных из/папок активов, которые я мог бы использовать с SQLiteOpenHelper, но когда я пытаюсь открыть InputStream это дает мне сообщение об ошибке:Невозможно открыть базу данных из папки с ресурсами [Android]

E/Trace: error opening trace file: No such file or directory (2) 

код:

public static final String DATABASE_PATH = "/data/data/com.mycomp.myapp/databases/"; 
public static final String DATABASE_NAME = "database.db"; 

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     try { 
      copyDatabase(getApplicationContext()); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      Log.d(TAG, "blad" + e.toString()); 
     } 
    } 

    private void copyDatabase(Context context) throws IOException { 
     String outfilename = DATABASE_PATH + DATABASE_NAME; 

     InputStream myinput = context.getAssets().open("database.db"); 

     OutputStream myoutput = new FileOutputStream(outfilename); 

     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myinput.read(buffer)) > 0) { 
      myoutput.write(buffer, 0, length); 
     } 

     myoutput.flush(); 
     myoutput.close(); 
     myinput.close(); 
    } 
+0

Я * действительно * рекомендую вам использовать SQLiteAssetHelper вместо того, чтобы переводить свой собственный код для этого: https://github.com/jgilfelt/android-sqlite-asset-helper – CommonsWare

+0

вы можете опубликовать остальную часть функции «copydDatabase» ? –

+0

уверен. Я только что редактировал свой пост –

ответ

2

вы можете попробовать это код, а затем, пожалуйста, скажите мне результат. убедитесь, что вы проверяете все имена файлов.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    //....... 

    DatabaseHelper dbHelper = new DatabaseHelper(this); 
    dbHelper.createDatabase(); 

    dbHelper.openDatabase(); 
    // do stuff 
    Cursor data =dbHelper.Sample_use_of_helper(); 
    dbHelper.close(); 
} 


class DatabaseHelper extends SQLiteOpenHelper { 

    private static String DB_PATH = "/data/data/com.mycomp.myapp/databases/"; 
    private static String DB_NAME = "database.db"; 
    private SQLiteDatabase myDataBase; 
    private final Context myContext; 

     public DatabaseHelper (Context context) { 
      super(context, DB_NAME, null, 1); 
      this.myContext = context; 
     } 

     public void crateDatabase() throws IOException { 
      boolean vtVarMi = isDatabaseExist(); 

      if (!vtVarMi) { 
       this.getReadableDatabase(); 

       try { 
        copyDataBase(); 
       } catch (IOException e) { 
        throw new Error("Error copying database"); 
       } 
      } 
     } 

     private void copyDataBase() throws IOException { 

      // Open your local db as the input stream 
      InputStream myInput = myContext.getAssets().open(DB_NAME); 

      // Path to the just created empty db 
      String outFileName = DB_PATH + DB_NAME; 

      // Open the empty db as the output stream 
      OutputStream myOutput = new FileOutputStream(outFileName); 

      // transfer bytes from the inputfile to the outputfile 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = myInput.read(buffer)) > 0) { 
       myOutput.write(buffer, 0, length); 
      } 

      // Close the streams 
      myOutput.flush(); 
      myOutput.close(); 
      myInput.close(); 
     } 

     private boolean isDatabaseExist() { 
      SQLiteDatabase kontrol = null; 

      try { 
       String myPath = DB_PATH + DB_NAME; 
       kontrol = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

      } catch (SQLiteException e) { 
       kontrol = null; 
      } 

      if (kontrol != null) { 
       kontrol.close(); 
      } 
      return kontrol != null ? true : false; 
     } 

     public void openDataBase() throws SQLException { 

      // Open the database 
      String myPath = DB_PATH + DB_NAME; 
      myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); 

     } 

     public Cursor Sample_use_of_helper() { 

      return myDataBase.query("TABLE_NAME", null, null, null, null, null, null); 
     } 

     @Override 
     public synchronized void close() { 
      if (myDataBase != null) 
       myDataBase.close(); 
      super.close(); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
     } 

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

Спасибо! Ваш код работает без проблем. Не уверен, что я пропустил, но я попытаюсь разобраться и поделиться. –

+0

@AdamK просто догадываюсь. Возможно, ваш код работает только в первый раз. После этого система не может перезаписать db-файл. –

+1

Наконец понял. Проблема заключалась не в методе copyDatabase, а в моем непонимании роли класса DatabaseHelper и методе getReadableDatabase(). Спасибо за помощь! –

0

удалить .db расширение с обеих DB_NAME и .Open ("database.db")
Это выглядит некрасиво, но в настоящее время то же самое работает для меня ....
И Перед установкой нового APK пожалуйста Очистить данные для ранее установленного APK

И все же, если он не будет работать, пожалуйста, м укажите размер своей базы данных.

Смежные вопросы