恢复sqlite数据库android

多姆文斯基

我正在尝试在我的应用程序中添加备份功能,但是我有一些问题。

这是我的代码:

    public void importDB() {
        try {
            File sd = Environment.getExternalStorageDirectory();
            File data = Environment.getDataDirectory();

            if (sd.canWrite()) {
                String currentDBPath = "/data/" + "com.example" + "/databases/" + "clinic_database";
                String backupDBPath = "clinic_database";
                File currentDB = new File(data, currentDBPath);
                File backupDB = new File(sd, backupDBPath);

                if (true) {
                    FileChannel src = new FileInputStream(backupDB).getChannel();
                    FileChannel dst = new FileOutputStream(currentDB).getChannel();
                    dst.transferFrom(src, 0, src.size());
                    src.close();
                    dst.close();
                    Toast.makeText(getActivity(), "Database Restored successfully", Toast.LENGTH_SHORT).show();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG)
                    .show();
        }
    }

    private void exportDB() {
        try {
            File sd = Environment.getExternalStorageDirectory();
            File data = Environment.getDataDirectory();

            if (sd.canWrite()) {
                String currentDBPath = "/data/" + "com.example" + "/databases/" + "clinic_database";
                String backupDBPath = "clinic_database";
                File currentDB = new File(data, currentDBPath);
                File backupDB = new File(sd, backupDBPath);

                int permissionCheck = ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE);

                if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(
                            getActivity(),
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            123);
                } else {
                    FileChannel src = new FileInputStream(currentDB).getChannel();
                    FileChannel dst = new FileOutputStream(backupDB).getChannel();
                    dst.transferFrom(src, 0, src.size());
                    src.close();
                    dst.close();
                    Toast.makeText(getActivity(), "DB saved! sdcard/" + backupDBPath, Toast.LENGTH_LONG).show();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getActivity(), "nope", Toast.LENGTH_SHORT).show();
        }
    }

我的数据库中有3位默认患者。首先,我将数据库文件导出到sdcard。在下一步中,我从数据库中删除患者。然后,我单击导入按钮,一切看起来都很好(应用程序数据文件夹中的数据库文件已更新),但是我的数据库中仍然没有任何患者。

也许是因为在我的应用程序中,我有3个数据库文件:clinic_database,climate_database-shm和clinic_database-wal,但我认为shm和wal文件是临时的。

所以,我做错什么了吗?我应该以某种方式“重新加载”我的数据库吗?提前致谢!

迈克

也许是因为在我的应用程序中,我有3个数据库文件:clinic_database,climate_database-shm和clinic_database-wal,但我认为shm和wal文件是临时的。

尽管它们本身是临时的,但-wal文件和-shm文件如果包含任何事务,则很可能会持久存在,因此,如果保留-wal文件,则将应用这些事务。

如果使用WAL,则备份数据库的正确方法是:

  • 备份-wal和-shm文件以及数据库,然后还原所有3个文件。

  • 或确保数据库已完全检查点,然后仅备份数据库文件,并且在还原时,请确保删除-wal和-shm文件(如果存在)。

    • 关闭数据库将完全检查数据库。
    • 或者,您将wal_checkpoint编译指示用于检查点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章