【发布时间】:2021-06-20 19:00:58
【问题描述】:
我目前正在 Android Studio 中开发一个实现 AWS S3 的项目。 S3 的用途是在其上上传/存储我的本地 SQLite 数据库文件,以便我可以下载并在命令中使用它。我意识到这绝不是在 S3 中使用数据库的最佳方式。
我可以在我的 S3 存储桶中上传和下载文件。但是由于某种原因,根据 logcat,数据库文件已损坏。 SQLite 数据库文件在下载时存储在设备的数据库文件夹中。
这是实现的代码:
public void uploadFile(String fileName) {
File exampleFile = new File(getApplicationContext().getDatabasePath("Login.db").getPath());
try {
BufferedWriter writer = new BufferedWriter(new FileWriter(exampleFile));
writer.append("Example file contents");
writer.close();
} catch (Exception exception) {
Log.e("MyAmplifyApp", "Upload failed", exception);
}
Amplify.Storage.uploadFile(
fileName,
exampleFile,
result -> Log.i("MyAmplifyApp", "Successfully uploaded: " + result.getKey()),
storageFailure -> Log.e("MyAmplifyApp", "Upload failed", storageFailure)
);
}
public void downloadFile() {
Amplify.Storage.downloadFile(
"Login.db",
new File(getApplicationContext().getDatabasePath("Login.db") + ""),
result -> Log.i("MyAmplifyApp", "Successfully downloaded: " + result.getFile().getName()),
error -> Log.e("MyAmplifyApp", "Download Failure", error)
);
}
我正在寻找有关此问题的一些见解。我只是不确定是什么导致了文件损坏。我在想它可能是文件路径,但我相信导航正确。
【问题讨论】:
-
S3 不是数据库。为什么不使用适当的数据库,例如 DynamoDB?
-
为什么要在上传文件前写入数据?
-
您使用的是什么记录模式? WAL 还是期刊?如果 WAL 确保数据库已完全设置检查点(关闭数据库)?如果不是并且 WAL 文件
Login.db-wal不为空,那么您需要复制Login.db-wal和可能的Login.db-shm文件以及Login.db。见sqlite.org/wal.html。由于 Android 9 WAL 是默认模式,请参阅source.android.com/devices/tech/perf/compatibility-wal -
@Marcin 我 100% 同意你的看法。这个项目是一个类项目,我们已经开始使用 SQLite。使用这种方式是完全低效的,但在建议 DynamoDB 或 aurora 时遇到了摩擦。
-
我相信它正在使用 Journal Pragma。我检查了 logcat,它吐出了错误:
E/SQLiteLog: (26) file is not a database in "PRAGMA journal_mode" E/SQLiteDatabase: Database corruption detected in open() android.database.sqlite.SQLiteDatabaseCorruptException: file is not a database (code 26 SQLITE_NOTADB): , while compiling: PRAGMA journal_mode
标签: amazon-web-services android-studio amazon-s3 android-sqlite android-device-monitor