2012-01-18 75 views
2

我一直在收集本網站和其他人關於在Android中包含預填充sqlite數據庫的最佳方式的信息。我只想確認我明白了爲什麼應該是微不足道的原因......事實並非如此。Android中的預填充數據庫:試圖將這些部分放在一起

所以可能有人請告訴我,如果我下面的結論是正確的還是錯誤的?:

  • 的主要原因許多人建議從資產文件夾複製預填充的數據庫文件「/數據/數據/ YOUR_PACKAGE/databases /「是因爲沒有辦法來訪問assets文件夾中的數據庫文件,或者這樣做會過於複雜(?)。 (有人可以澄清這兩個答案中的哪一個是正確的嗎?)
  • 資產文件夾中的數據庫文件必須複製到其他位置的另一個重要原因是因爲該位置中的文件無法更新。然後,即使資產文件夾中的數據庫可以打開,只有在不必修改此類數據庫的情況下,該功能纔有用。 更新:我推出了一個專注於此問題的新線程:Opening a read only database directly in the assets folder
  • 資產文件夾中的文件可能只有1 Mb大小(除非它們具有某些文件擴展名,例如mp3)。請注意,如果您的數據庫小於1 Mb,或者您不介意將數據庫劃分爲1 Mb塊並將它們放在運行時放在一起,或者您不介意以mp3擴展名分發數據庫文件,則此限制不相關。
  • 如果將數據庫文件從資產文件夾複製到「/ data/data/YOUR_PACKAGE/databases /」,則無法刪除assets文件夾中的原始數據庫文件以避免產生重複文件。這也是因爲資產文件夾中的文件無法修改。

製作拼圖稍微複雜一些:Ship an application with a database 是複製從資產文件夾中的數據庫,其實其他位置不上運行2.3的一些設備的工作:我在評論這個問題的接受的答案發現+。這是否準確?如果這是真的,那麼最好的選擇是在第一次運行時從網上下載數據庫文件?

感謝您的任何澄清。

+1

閱讀此配對http://www.mail-archive.com/[email protected]/msg28194.html這裏也有資產/原始文件夾的大小限制。 – 2012-01-18 01:50:43

+1

資產文件夾中的所有內容都是靜態的,無法修改,因此您必須進行復制。 – 2012-01-18 02:40:27

+0

assets,xml drawables和其他類似資源是apk的一部分,因此它們不能以編程方式更新。並且需要根權限才能查看數據是「數據/數據」 – 2012-01-18 03:26:24

回答

1

你基本上把apks與設備上的實際文件夾搞混了。

將apk視爲安裝包 - 與Windows世界的msi無異。此安裝包的整個目標是安全地驗證並向您的設備傳遞代碼和資源。在一個天真的實現中,你會將上述代碼解壓到一個只讀位置,這個資源在某個地方是可讀寫的,並且是你的快樂之路。

爲了節省空間,Android是一個更聰明一點 - 代碼和資源從不離開簽署存檔,所以你總是知道這是你把的那些,你不通過存儲兩倍的代碼浪費空間。在類加載器中有一些真正的魔法,它也允許它在飛行中解壓縮類,但除此之外。

因此,本質上,這個壓縮的安裝包中的所有內容都是隻讀的(由於也被簽名)。您的工作是成爲「安裝者」,並將您需要的資源移至可讀寫的位置。當然,你不能觸碰apk,因爲這會允許惡意軟件並且破壞簽名的整個目的。

希望這可以消除混淆。

+0

+1謝謝@Delyan,你的回答澄清了爲什麼apk中的所有內容都是隻讀的。但假設我的數據庫是隻讀的:有沒有辦法從apk中的原始位置(資產文件夾)打開它,而不必先將它複製到其他位置? – Sergio 2012-01-18 13:28:55

+0

我還沒試過,但'file:/// android_asset/db.sqlite'可能會起作用(注意三個斜槓)。但是,如果沒有,那麼要繞過這個限制需要一些廣泛的嘲弄。 – Delyan 2012-01-18 13:44:22

+0

我剛剛爲我的問題的那部分打開了一個單獨的線程:(http://stackoverflow.com/questions/8914673/opening-read-only-databases-in-the-assets-folder)。 從我最初提出的問題來看,仍然不清楚最後一點:如果將數據庫文件複製到另一個位置的方法仍然有效,因爲顯然它已經報告過,它在運行2.3+的某些設備中失敗(如上所述我的問題的鏈接)。你知道關於@Delyan的一些事嗎?無論如何,你回答了我的疑惑,所以我接受你的答案。 – Sergio 2012-01-18 18:03:27