それを行う適切な方法は何ですか?.sq3ファイルをコピーするだけですか?
サイトにユーザーがいて、コピー中にファイルが書き込まれている場合はどうなりますか?
それを行う適切な方法は何ですか?.sq3ファイルをコピーするだけですか?
サイトにユーザーがいて、コピー中にファイルが書き込まれている場合はどうなりますか?
回答:
sqlite3コマンドラインツールは、.backup
ドットコマンドを備えています。
次の方法でデータベースに接続できます。
sqlite3 my_database.sq3
そして、次のコマンドでbackup dotコマンドを実行します。
.backup backup_file.sq3
データベースへのインタラクティブな接続の代わりに、バックアップを実行し、後で接続を閉じることもできます
sqlite3 my_database.sq3 ".backup 'backup_file.sq3'"
どちらにしても、結果はbackup_file.sq3
データベースの名前が付けられたコピーになりますmy_database.sq3
。
これは、データベースで現在作業しているすべてのユーザーを処理するため、通常のファイルコピーとは異なります。データベースには適切なロックが設定されているため、バックアップは排他的に行われます。
sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
.backupが最善の方法です。
sqlite3 my_database .backup my_database.back
.dumpコマンドを試すこともできます。データベース全体またはテーブル全体をテキストファイルにダンプできます。TABLEが指定されている場合、LIKEパターンTABLEに一致するテーブルのみをダンプします。
sqlite3 my_database .dump > my_database.back
ダンプとストアを使用してアーカイブコピーを作成する良い方法です。後でデータベースを再構築します。
sqlite3 my_database .dump | gzip -c > my_database.dump.gz
zcat my_database.dump.gz | sqlite3 my_database
また、この質問を確認してくださいSQLite3 .backupおよび.dumpコマンドはデータベースをロックしますか?
.backup
上記のように機能しません( ".backupにFILENAME引数がありません")
try {
final String inFileName = "/data/data/your app package/databases/db";
File dbFile = new File(inFileName);
FileInputStream fis = new FileInputStream(dbFile);
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CALC/Backup";
File dir = new File(path);
if (!dir.exists()) dir.mkdirs();
String outFileName = path + "/filename"; // output file name
// Open the empty db as the output stream
OutputStream output = new FileOutputStream(outFileName);
// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
Toast.makeText(getActivity(), "Backup Successfully", 2).show();
// Close the streams
output.flush();
output.close();
fis.close();
}
catch (Exception e) {
e.printStackTrace();
}