phone - google backup android




Android備份/恢復:如何備份內部數據庫? (4)

我已經使用提供的FileBackupHelper實現了BackupAgentHelper來備份和恢復我擁有的本地數據庫。 這是您通常與ContentProviders一起使用的數據庫,它位於/data/data/yourpackage/databases/

人們會認為這是一個常見的情況。 但是文檔不清楚該怎麼做: http://developer.android.com/guide/topics/data/backup.html : http://developer.android.com/guide/topics/data/backup.html這些典型的數據庫沒有專門的BackupHelper 因此,我使用FileBackupHelper ,將它指向“ /databases/ ”中的.db文件,在我的ContentProviders引入了任何數據庫操作(例如db.insert )的鎖,甚至嘗試在onRestore()之前創建“ /databases/ ”目錄onRestore()因為它在安裝後不存在。

我以前在其他應用程序中成功實施了類似的SharedPreferences解決方案。 但是,當我在模擬器2.2中測試新的實現時,我看到從日誌執行到LocalTransport的備份以及正在執行的恢復(並onRestore() )。 然而,db文件本身從未被創建。

請注意,這是在安裝之後,以及在首次啟動應用程序之前,在執行還原之後。 除此之外,我的測試策略基於http://developer.android.com/guide/topics/data/backup.html#Testing

另請注意,我不是在談論一些我自己管理的sqlite數據庫,也不是關於備份到SDcard,自己的服務器或其他地方。

我在文檔中看到關於數據庫建議使用自定義BackupAgent但它似乎並不相關:

但是,如果需要,可能需要直接擴展BackupAgent:*備份數據庫中的數據。 如果您在用戶重新安裝應用程序時想要恢復SQLite數據庫,則需要構建自定義的BackupAgent,以在備份操作期間讀取適當的數據,然後創建表並在還原操作期間插入數據。

請澄清一下。

如果我真的需要自己做到SQL級別,那麼我擔心下列主題:

  • 打開數據庫和事務。 我不知道如何從我的應用程序工作流程之外的單一課程中關閉它們。

  • 如何通知用戶備份正在進行並且數據庫已被鎖定。 這可能需要很長時間,所以我可能需要顯示進度條。

  • 如何在還原時執行相同的操作。 據我所知,恢復可能發生在用戶已經開始使用應用程序(並將數據輸入到數據庫)時。 因此,您不能假定僅恢復備份的數據(刪除空白或舊數據)。 你必須以某種方式加入它,對於任何非平凡的數據庫來說,由於id的緣故,這是不可能的。

  • 如何在還原完成後刷新應用程序,而不會讓用戶卡在某些 - 現在無法訪問的點。

  • 我可以確定數據庫在備份或恢復時已經升級了嗎? 否則,預期的模式可能不匹配。


一個更清晰的方法是創建一個自定義的BackupHelper

public class DbBackupHelper extends FileBackupHelper {

    public DbBackupHelper(Context ctx, String dbName) {
        super(ctx, ctx.getDatabasePath(dbName).getAbsolutePath());
    }
}

然後將其添加到BackupAgentHelper

public void onCreate() {
    addHelper(DATABASE, new DbBackupHelper(this, DB.FILE));
}

一種選擇是將其構建在數據庫上方的應用程序邏輯中。 它實際上為我想的這樣的levell尖叫。 不知道你是否已經這樣做了,但大多數人(儘管android內容管理器光標方法)會引入一些ORM映射 - 無論是自定義還是一些orm-lite方法。 而我在這種情況下寧願做的是:

  1. 以確保您的應用程序在應用程序/數據在後台添加時正常工作,並在應用程序啟動時添加/刪除新數據
  2. 製作一些Java-> protobuf甚至是簡單的java序列化映射,並編寫自己的BackupHelper以從流中讀取數據並將其簡單地添加到數據庫中....

所以在這種情況下,而不是在數據庫級別執行它在應用程序級別。


在重新回顧我的問題之後,我看到了ConnectBot如何實現它的功能後就可以開始工作。 感謝Kenny和Jeffrey!

這實際上與添加一樣簡單:

FileBackupHelper hosts = new FileBackupHelper(this,
    "../databases/" + HostDatabase.DB_NAME);
addHelper(HostDatabase.DB_NAME, hosts);

到您的BackupAgentHelper

我缺少的一點是,你必須使用“ ../databases/ ”的相對路徑。

不過,這絕不是一個完美的解決方案。 FileBackupHelper的文檔中提到了例如:“ FileBackupHelper只能用於小配置文件,而不能用於大型二進製文件 ”,後者就是SQLite數據庫的情況。

我希望得到更多的建議,深入了解我們的期望(什麼是適當的解決方案)以及關於如何破解的建議。


從Android M開始,現在有一個全數據備份/恢復API可用於應用程序。 這個新的API在應用清單中包含了一個基於XML的規範,它允許開發人員以直接語義的方式描述備份哪些文件:'備份名為“mydata.db”的數據庫。 這個新的API對於開發者來說更容易使用 - 你不需要明確地跟踪差異或者請求備份傳遞,而且備份哪些文件的XML描述意味著你通常不需要編寫任何代碼在所有。

(例如,即使在全數據備份/恢復操作中,您可以參與恢復時發生的回調,這種方式非常靈活。)

有關如何使用新API的說明,請參閱developer.android.com上的配置應用程序的自動備份部分。





android-backup-service