我的服务器中有一个SQLite数据库文件,我的Android App会不时检查是否有新的SQLite数据库文件。如果为true,则App会下载文件并替换旧数据库。
问题是,有时新数据库文件被破坏,应用程序开始崩溃,如果我不在Android设置中手动清理应用程序,则永远无法恢复。
我的问题是,有一种方法可以在Downloaded之后检查SQLite数据库的完整性吗?
这是我从服务器下载新数据库的代码,此代码放在AssyncTask中:
protected Boolean doInBackground(String... Url) {
try {
URL url = null;
if(Url[0].equals("")){
mSyncDate = mConnectionManager.getSyncDate();
url = new URL(Constants.HF_SERVER_DATABASE+"db_fxbus_"+convertDateToFormatYYYYMMDD(mSyncDate.getServerDate())+".sqlite");
}else{
url = new URL(Url[0]);
}
URLConnection connection = url.openConnection();
connection.connect();
// this will be useful so that you can show a typical 0-100% progress bar
int fileLength = connection.getContentLength();
mDB.getReadableDatabase();
// download the file
InputStream input = new BufferedInputStream(url.openStream());
Log.i(TAG, "Path:"+mContext.getDatabasePath("HorariosDoFunchal").getAbsolutePath());
OutputStream output = new FileOutputStream(mContext.getDatabasePath("HorariosDoFunchal").getAbsolutePath());
startWriting = true;
byte data[] = new byte[1024];
long total = 0;
int count;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
publishProgress((int) (total * 100 / fileLength));
output.write(data, 0, count);
//Log.i(TAG, "Executing ...");
}
//Log.i(TAG, "Finish ...");
output.flush();
output.close();
input.close();
} catch (Exception e) {
Log.e(TAG, e.toString());
return false;
}
return true;
}
答案 0 :(得分:2)
查看:
pragma integrity_check;
它将扫描数据库并检查错误和其他事情。 可在此链接中找到更多信息(以及更多命令):
http://www.sqlite.org/pragma.html
另请查看isDatabaseIntegrityOk()的文档。
答案 1 :(得分:0)
您可以尝试使用PRAGMA integrity_check(或Android的等效isDatabaseIntegrityOk()),但这只会检查数据库结构中的错误,并且只能检测到可以证明结构错误的错误。< / p>
为了能够检测所有错误(特别是在您自己的数据中),您需要计算整个数据库文件的校验和。