2013-03-19 140 views
2

我試圖建立某種形式的備份&在我的應用程序恢復功能。在此之前,我一直在讀了一段時間,瞭解是否有可能實現,但我發現這樣一個問題: Sqlite DB Android Backup/Restore有什麼辦法從SQLite中提取查詢嗎?

唯一的其他辦法,我可以看到這樣做,會讀DB的和實際內容生成含有它可以從恢復SQL文件,這顯然是一個更爲複雜和不提供任何優勢來證明這種複雜性。

這個答案,我認爲是最好的辦法;不分解.db文件,但導出查詢。

你知道;當你從mysql中導出一個SQL數據時,你會得到一個包含所有查詢的文件,這些查詢創建用數據填充結構的結構和查詢。

這就是我試圖模仿;生成一個包含來自.db文件的sql查詢的文件。

你們認爲這是可能的,我的意思是,有沒有內建的方法來實現這一點?

否則,如果它太難處理,你如何設法避免這個用戶(https://stackoverflow.com/a/10842043/1943607)在談論什麼?

因此,我禁用WAL與「PRAGMA journal_mode = DELETE」,然後我能夠在瀏覽器中查看數據庫,並能夠在我的測試設備上恢復它。

以前的部分,我無法理解它。這是你設置爲sqlite的配置嗎?

感謝

+0

你看了鏈接時? – Reinherd 2013-03-19 10:00:22

+0

不想失禮,但我不應該爲複雜性辯護。正如用戶在我之前鏈接的問題中所說的,只是複製不是一種備份和恢復的好方法,因爲即使它的應用程序和sqlite版本相同,sqlite也可能不會讀取數據庫。所以我們必須尋找一種解決方法,導出原始查詢將是一個不錯的嘗試。 – Reinherd 2013-03-19 11:53:40

回答

1

我還沒有實際使用SQLite嘗試過這一點,但使用MySQL,你可以做這樣的事情打造「轉儲」您的數據庫。這些轉儲包含您所描述的內容:一組查詢,當它們一起執行時,重新創建數據庫,包括內容。

根據在http://www.sqlite.org/sqlite.html(特別是「將整個數據庫轉換爲ASCII文本文件」一節)中的「sqlite3」文檔來判斷,您可以對sqlite執行相同的操作。既然你可以在Java應用程序中執行shell命令(通過調用Runtime.getRuntime()。EXEC()方法),你是「所有者」的數據庫(Linux的用戶ID),你應該能夠運行這個「sqlite3的。轉儲「命令,即使在沒有根的設備上。我從未見過沒有安裝sqlite3工具的Android設備,因此該命令應始終可用。

此外,由於轉儲文件只是一個文本文件,因此您應該可以在其中添加任何兼容性所需的PRAGMA(如引用的那個)。

我還沒有測試過這些,但只是想和你一起思考這個有趣的話題。

+0

看起來很酷。我今天會檢查一下。如果你有興趣,將更新你;) – Reinherd 2013-03-19 10:00:58

+0

將此問題標記爲「最愛」;-) – baske 2013-03-19 12:16:21

+0

我在嘗試執行sqlite3時遇到了一些麻煩。 'Process p = Runtime.getRuntime()。exec(new String [] {「sqlite3」});'拋出一個運行exec()的Exception ExceptionError。命令:[sqlite3]工作目錄:null環境:null'。任何想法? – Reinherd 2013-03-19 22:52:09

1

一個sqlite數據庫只是一個文件,所以你可以複製該文件,但我認爲你可能有權限在Android的權限,以防止您訪問數據庫。

更好的解決方案IMO將您的數據同步到外部網站。 將自定義同步適配器和帳戶管理器與具有RESTfull api的網站或Web服務結合使用以接收和發送同步數據將是最可靠的方法。

http://developer.android.com/training/id-auth/identify.html是設置客戶經理的很好的介紹。

而對於自定義同步適配器,這是一個很好的起點。 http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-2/

最後的這一切是如何結合在一起的解釋 https://sites.google.com/site/andsamples/concept-of-syncadapter-androidcontentabstractthreadedsyncadapter 上述方法將使用戶能夠在同一時間更換手機並保持數據和數據將始終是最新的(提供你在適當的時候同步

看起來很多工作,因爲你需要建立一個Web服務,但它是確保數據安全和可靠並且可以恢復和備份的最佳方式在任何點

對於Web服務,您可以使用很多選項,包括Google文檔等雲服務或編寫自己的網站。 Ruby on Rails是開發自己的站點的一個很好的解決方案,因爲你可以獲得一個完整的RESTfull api,並且它很容易僅通過幾行代碼就可以保護/鎖定一個rails站點給授權用戶,用Heroku你可以免費託管。

與往常一樣,Android開發中最簡單的需求實際上最終是最難實現的,但在數據安全至關重要的情況下,值得努力做到這一點。

+0

我不確定這是否是實現此目標的最佳方法。另一個答案看起來「更容易」。還沒有嘗試過,但我會盡快檢查出來。我不認爲我們應該建立這個龐大的系統來控制一個簡單的數據庫應用程序。也許只是提取查詢,並生成一個完整性代碼應該做的伎倆。 – Reinherd 2013-03-19 11:22:52

+0

@SergiCastellsaguéMillán我同意這是一個複雜的解決方案,但它是安全,靈活和可實現的。你沒有說明爲什麼你需要備份和恢復你的數據,所以我不能提供一個判斷,哪一個是最適合你的選擇,只是這是推薦的android設計模式。也許這是矯枉過正。只有你可以判斷:) – jamesc 2013-03-19 12:35:00

0

由於可能適用於db文件內容的更改是開放的,而且無法保證具體的行爲,所以問題太容易回答。

積極的一面源碼項目是一個開源的,並且指定Here

考慮看看那裏以後的數據庫文件的格式,似乎很可能/沒有太複雜的分析任何數據庫文件尋找Data Only並將其寫入/轉儲到另一個功能性數據庫文件。

我相信這是解決這個問題的最快和最乾淨的解決方案。

所以包裹起來:你想將其備份

  • 複製數據庫文件每次。
  • 當你想恢復使用Android API創建一個新的數據庫。
  • 解析備份文件中的數據並將其寫入新創建的數據庫。

P.S: 關於如何使用

PRAGMA journal_mode =刪除

只需使用db.exec("PRAGMA journal_mode = DELETE");創建DB

相關問題