Скопировать базу данных из папки с данными в невращенное устройство

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

private void StoreDatabase() { File DbFile = new File( "data/data/packagename/DBname.sqlite"); if (DbFile.exists()) { System.out.println("file already exist ,No need to Create"); } else { try { DbFile.createNewFile(); System.out.println("File Created successfully"); InputStream is = this.getAssets().open("DBname.sqlite"); FileOutputStream fos = new FileOutputStream(DbFile); byte[] buffer = new byte[1024]; int length = 0; while ((length = is.read(buffer)) > 0) { fos.write(buffer, 0, length); } System.out.println("File succesfully placed on sdcard"); // Close the streams fos.flush(); fos.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } } } 

Solutions Collecting From Web of "Скопировать базу данных из папки с данными в невращенное устройство"

Это будет работать наверняка во всех устройствах и эмуляторе, не нужно корневать.

 /** * Copies your database from your local assets-folder to the just created * empty database in the system folder, from where it can be accessed and * handled. This is done by transfering bytestream. * */ private void copyDataBase(String dbname) throws IOException { // Open your local db as the input stream InputStream myInput = myContext.getAssets().open(dbname); // Path to the just created empty db File outFileName = myContext.getDatabasePath(dbname); // 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(); } 
  /** * Copy database file from assets folder inside the apk to the system database path. * @param context Context * @param databaseName Database file name inside assets folder * @param overwrite True to rewrite on the database if exists * @return True if the database have copied successfully or if the database already exists without overwrite, false otherwise. */ private boolean copyDatabaseFromAssets(Context context, String databaseName , boolean overwrite) { File outputFile = context.getDatabasePath(databaseName); if (outputFile.exists() && !overwrite) { return true; } outputFile = context.getDatabasePath(databaseName + ".temp"); outputFile.getParentFile().mkdirs(); try { InputStream inputStream = context.getAssets().open(databaseName); OutputStream outputStream = new FileOutputStream(outputFile); // transfer bytes from the input stream into the output stream byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } // Close the streams outputStream.flush(); outputStream.close(); inputStream.close(); outputFile.renameTo(context.getDatabasePath(databaseName)); } catch (IOException e) { if (outputFile.exists()) { outputFile.delete(); } return false; } return true; } 

Я не уверен, но это работает на каждом устройстве, на котором я тестировал. Я украл этот метод (откуда-то здесь) и сделал его общим для резервного копирования и восстановления:

 public static void movedb(File srcdb, File destdb) { try { if (Environment.getExternalStorageDirectory().canWrite()) { if (srcdb.exists()) { FileChannel src = new FileInputStream(srcdb).getChannel(); FileChannel dst = new FileOutputStream(destdb).getChannel(); dst.transferFrom(src, 0, src.size()); src.close(); dst.close(); } else { //ERROR: "Database file references are incorrect" } } else { //ERROR: "Cannot write to file" } } catch (Exception e) { //ERROR: e.getMessage() } } 

Затем я просто поддерживаю это, позвонив:

 movedb(this, getDatabasePath(getDbName()), new File(Environment.getExternalStorageDirectory(), getDatabaseBackupPath())); 

Где getDatabasePath() и getDatabaseBackupPath() – это просто строковые значения

 private void copyDataBase(Context context) throws IOException { //Log.i(TAG, "Opening Asset..."); // Open your local db as the input stream InputStream myInput = context.getAssets().open(DBHelper.DATABASE_NAME); // Log.i(TAG, "Getting db path..."); // Path to the just created empty db File dbFile = getDatabasePath(DBHelper.DATABASE_NAME); if (!dbFile.exists()) { SQLiteDatabase checkDB = context.openOrCreateDatabase(DBHelper.DATABASE_NAME, context.MODE_PRIVATE, null); if (checkDB != null) { checkDB.close(); } } //Log.i(TAG, "Getting output stream..."); // Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(dbFile); // Log.i(TAG, "Writing data..."); // 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(); }