2014-09-10 121 views
0

我在我的服務器中有一個SQLite數據庫文件,我的Android應用程序不時檢查是否有新的SQLite數據庫文件。如果該屬性爲真,則應用程序將下載該文件並替換舊數據庫。檢查數據庫SQLite的完整性Android

問題是,有些時候新的數據庫文件被破壞,應用程序開始崩潰,並且如果我不手動清除Android設置中的應用程序,則無法恢復。

我的問題是,有一種方法來檢查下載後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

您可以在服務器上創建一個MD5散列,並沿着新數據庫發送它,然後使用您下載的數據庫檢查它。看看[這篇文章](http://stackoverflow.com/q/5404925/3326331)它談論相同的數據庫完整性問題 – 2014-09-10 19:18:33

+0

爲什麼你下載一個腳本,可以修改手機上的數據庫。 IE更改表添加列,更新,插入,刪除等。該腳本也可以用@SagarPilkhwal鏈接指出的查詢已知結果來測試自己。 – danny117 2014-09-10 19:25:38

+0

我知道,我知道,但有時數據庫需要很長時間才能執行許多更改以更新和刪除並插入修改。對服務器來說這樣做要快得多。除了保存到文件中,應用程序會不時檢查更新。 – Bernas 2014-09-10 19:53:36

回答

2

查找到:

pragma integrity_check; 

它會掃描數據庫和檢查它的錯誤和其他事情。 更多信息(多指令)可以在此鏈接中找到:

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

還檢查出的isDatabaseIntegrityOk()的文檔。

+0

我認爲這可以工作,但現在我有另一個問題如何將舊數據庫保存在臨時位置,以防新數據庫損壞我可以恢復我的數據庫? – Bernas 2014-09-10 19:48:27

+0

當您複製新數據庫時,只需重命名舊數據庫,如果新數據庫工作,則刪除重命名的舊數據庫,否則,如果新數據庫不起作用,請刪除新數據庫並將舊數據庫重命名爲其原始名稱 – 2014-09-11 04:43:57

0

您可以嘗試使用PRAGMA integrity_check(或Android的等效isDatabaseIntegrityOk()),但這隻會檢查數據庫結構中是否存在錯誤,並且只能檢測到可以證明結構錯誤的錯誤。

爲了能夠檢測到所有錯誤(特別是在您自己的數據中),您需要計算整個數據庫文件的校驗和。

+0

I認爲可以工作,但現在我有另一個問題如何將舊數據庫保存在臨時位置,以防新數據庫損壞我可以恢復我的數據庫? – Bernas 2014-09-10 19:48:01