检查Database SQLite Android的完整性

时间:2014-09-10 19:12:27

标签: android sqlite

我的服务器中有一个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;
    }

2 个答案:

答案 0 :(得分:2)

查看:

pragma integrity_check;

它将扫描数据库并检查错误和其他事情。 可在此链接中找到更多信息(以及更多命令):

http://www.sqlite.org/pragma.html

另请查看isDatabaseIntegrityOk()的文档。

答案 1 :(得分:0)

您可以尝试使用PRAGMA integrity_check(或Android的等效isDatabaseIntegrityOk()),但这只会检查数据库结构中的错误,并且只能检测到可以证明结构错误的错误。< / p>

为了能够检测所有错误(特别是在您自己的数据中),您需要计算整个数据库文件的校验和。