Скопировать файл базы данных в локальное хранилище - PullRequest
2 голосов
/ 22 марта 2019

У меня есть база данных sqlite в папке сборки.

Я хочу скопировать это в локальное хранилище.

Я использую этот код, он копирует базу данных без таблиц.когда я хочу открыть базу данных в sqlliteeditor, я получаю ошибку 14.

  private void copyDataBase2() throws IOException {
    OutputStream os = new FileOutputStream(  "/data/data/pakagename/Learning.db");
    InputStream is = context.getAssets().open("databases/Learning.db");
    byte[] buffer = new byte[1024];
    int length;
    while ((length = is.read(buffer)) > 0) {
        os.write(buffer, 0, length);
    }
    is.close();
    os.flush();
    os.close();
}

Ответы [ 3 ]

0 голосов
/ 22 марта 2019

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

Вы можете сравнить хэш-коды двух файлов БД.Для этого вы можете изменить код для копирования файла во внешнее хранилище вместо каталога данных вашего приложения на данный момент .Затем извлеките файл обратно на ПК через adb и выполните сравнение.

Согласно вашему коду проблем нет, и они должны совпадать.

Скорее всего (либо) сам файл БД поврежден (либо) вы открываете его неправильно.

0 голосов
/ 22 марта 2019

Попробуйте использовать это:

private void copyDB(Context context) throws Exception{
    File destinationDirectory = new File(Environment.getExternalStorageDirectory() + "/Destination/");
    File destinationFile = new File(destinationDirectory + "/myDatabase.db");
    if (!destinationDirectory.isDirectory()) {
        destinationDirectory.mkdir();
        destinationFile.createNewFile();
    }
    File dbFile = context.getDatabasePath("my_database.db");
    if (dbFile.exists()) {
        copyFile(dbFile.getPath(), logFile.getAbsolutePath(), false);
    }
}

private boolean copyFile(String sPath, String dPath, boolean isDeleteSourceDir) {
    FileInputStream fis = null;
    FileOutputStream fos = null;
    try {
        File sourceFile = new File(sPath);
        fis = new FileInputStream(sourceFile);
        File dir = new File(dPath);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File outfile = new File(dPath);
        outfile.delete();
        if (!outfile.exists()) {
            outfile.createNewFile();
        }
        fos = new FileOutputStream(outfile);
        byte[] block = new byte[1000];
        int i;
        while ((i = fis.read(block)) != -1) {
            fos.write(block, 0, i);
        }
        fos.close();
        if (isDeleteSourceDir) {
            deleteDirectory(new File(sPath));
        }
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    } finally {
        fis.close();
        fos.close();
    }
}
0 голосов
/ 22 марта 2019

Попробуйте скопировать файл БД следующим образом:

public class DbHelper extends SQLiteOpenHelper {
    private static String DB_PATH = new File(getFilesDir(), "databases").getPath();
    private static String DB_NAME = "test_db.db";
    private SQLiteDatabase dataBase;
    private final Context fContext;
    public DbHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.fContext = context;
    }
    public void createDataBase() throws IOException {
        boolean dbExist = checkDataBase();
        if (dbExist) {
            //ничего не делаем – файл базы данных уже есть
        } else {
            this.getReadableDatabase();
            try {
                copyDataBase();
            } catch (IOException e) {
                throw new Error("Error copying database");
            }
        }
    }
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
        } catch (SQLiteException e) {
            //файл базы данных отсутствует
        }
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }
    private void copyDataBase() throws IOException {
        InputStream input = fContext.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream output = new FileOutputStream(outFileName);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = input.read(buffer)) > 0) {
            output.write(buffer, 0, length);
        }
        output.flush();
        output.close();
        input.close();
    }
    public void openDataBase() throws SQLException {
        String path = DB_PATH + DB_NAME;
        dataBase = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
    }
    @Override
    public synchronized void close() {
        if (dataBase != null)
            dataBase.close();
        super.close();
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

Если вы используете API 19 или выше:

String db_path = fContext.getDatabasePath(DB_NAME);

Когда я хочу открыть базу данных в sqlliteeditor, я получаю ошибку 14.

Также советую проверить файл БД. Если при открытии в редакторе возникает ошибка, скорее всего, проблема не в алгоритме копирования файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...