为离线应用程序创建备份的最佳方法?
Room best ways to create backups for offline application?
所以我要说的是一个非常复杂的数据库,它使用 many to many
数据库设计和 foreign keys
并连接表,它是 Room
数据库。我想为它创建备份系统,因为它是离线应用程序,我需要导出数据库并将其存储到 google 驱动器的应用程序文件夹。最近几天我已经阅读了很多关于它的内容,但仍然有点困惑我看到有一些方法可以将数据库导出为 CSV、JSON、excel 文件或只是 .db
文件,但是这样做的最佳实践是什么以及专业人员如何处理它?
几乎不需要做任何复杂的事情,只需保存 SQLiteDatabase 文件即可。
基本上关闭 Room db 然后保存文件。
例如以下是一个非常基本的示例,它保存到名为 DBsaves 的子目录中的下载目录:-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resetSequenceAction();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
verifyStoragePermissions(this);
}
}
@Override
protected void onStart() {
super.onStart();
mTestDB = Room.databaseBuilder(this,TestDatabase.class,TestDatabase.DBNAME).build();
addSomeData();
addSomeData();
addSomeData();
addSomeData();
mTestDB.close();
File dbfile = this.getDatabasePath(TestDatabase.DBNAME);
File sdir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),"DBsaves");
String sfpath = sdir.getPath() + File.separator + "DBsave" + String.valueOf(System.currentTimeMillis());
if (!sdir.exists()) {
sdir.mkdirs();
}
File savefile = new File(sfpath);
try {
savefile.createNewFile();
int buffersize = 8 * 1024;
byte[] buffer = new byte[buffersize];
int bytes_read = buffersize;
OutputStream savedb = new FileOutputStream(sfpath);
InputStream indb = new FileInputStream(dbfile);
while ((bytes_read = indb.read(buffer,0,buffersize)) > 0) {
savedb.write(buffer,0,bytes_read);
}
savedb.flush();
indb.close();
savedb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void verifyStoragePermissions(Activity activity) {
final int REQUEST_EXTERNAL_STORAGE = 1;
String[] PERMISSIONS_STORAGE = {
//Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
int permission = ActivityCompat.checkSelfPermission(
activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
注意 onCreate 和 verifyStoragePermissions 方法仅用于获取写入外部存储的权限(注意用户权限也在清单中设置)。
- 最重要的是在 Room 之外执行此操作(同样,如果您要从备份中恢复)。
在运行之后:-
然后将文件复制到 PC 并使用 SQLite Manager 打开 :-
这完全符合预期,并且如图所示具有高度可移植性,即您可以将其放入任何 SQLite 工具中(此类工具使用的 SQLite 版本可能是一个限制因素)
所以我要说的是一个非常复杂的数据库,它使用 many to many
数据库设计和 foreign keys
并连接表,它是 Room
数据库。我想为它创建备份系统,因为它是离线应用程序,我需要导出数据库并将其存储到 google 驱动器的应用程序文件夹。最近几天我已经阅读了很多关于它的内容,但仍然有点困惑我看到有一些方法可以将数据库导出为 CSV、JSON、excel 文件或只是 .db
文件,但是这样做的最佳实践是什么以及专业人员如何处理它?
几乎不需要做任何复杂的事情,只需保存 SQLiteDatabase 文件即可。
基本上关闭 Room db 然后保存文件。
例如以下是一个非常基本的示例,它保存到名为 DBsaves 的子目录中的下载目录:-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resetSequenceAction();
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
verifyStoragePermissions(this);
}
}
@Override
protected void onStart() {
super.onStart();
mTestDB = Room.databaseBuilder(this,TestDatabase.class,TestDatabase.DBNAME).build();
addSomeData();
addSomeData();
addSomeData();
addSomeData();
mTestDB.close();
File dbfile = this.getDatabasePath(TestDatabase.DBNAME);
File sdir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),"DBsaves");
String sfpath = sdir.getPath() + File.separator + "DBsave" + String.valueOf(System.currentTimeMillis());
if (!sdir.exists()) {
sdir.mkdirs();
}
File savefile = new File(sfpath);
try {
savefile.createNewFile();
int buffersize = 8 * 1024;
byte[] buffer = new byte[buffersize];
int bytes_read = buffersize;
OutputStream savedb = new FileOutputStream(sfpath);
InputStream indb = new FileInputStream(dbfile);
while ((bytes_read = indb.read(buffer,0,buffersize)) > 0) {
savedb.write(buffer,0,bytes_read);
}
savedb.flush();
indb.close();
savedb.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void verifyStoragePermissions(Activity activity) {
final int REQUEST_EXTERNAL_STORAGE = 1;
String[] PERMISSIONS_STORAGE = {
//Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
int permission = ActivityCompat.checkSelfPermission(
activity,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
PERMISSIONS_STORAGE,
REQUEST_EXTERNAL_STORAGE
);
}
}
注意 onCreate 和 verifyStoragePermissions 方法仅用于获取写入外部存储的权限(注意用户权限也在清单中设置)。
- 最重要的是在 Room 之外执行此操作(同样,如果您要从备份中恢复)。
在运行之后:-
然后将文件复制到 PC 并使用 SQLite Manager 打开 :-
这完全符合预期,并且如图所示具有高度可移植性,即您可以将其放入任何 SQLite 工具中(此类工具使用的 SQLite 版本可能是一个限制因素)