2012-03-13 65 views
1

我正在使用此博客文章中介紹的方法爲我的Android應用程序創建初始填充數據庫。覆蓋已填充的應用程序數據庫

http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

的博客介紹瞭如何使用存儲在資產文件夾中的數據庫文件,並將其複製到應用程序的數據庫文件夾。儘管我使用了一個變體。我想玩框架並在我的SQLiteOpenHelper實現的onCreate()和onUpdate()函數中調用複製函數。這最初的工作原理:當我從模擬器中提取數據庫文件時,我可以驗證數據庫是否正確地複製到數據庫的標準位置。

現在奇怪的是,我第一次調用SQLiteOpenHelper.getWritableDatabase()後立即還有一個斷點。當我在該斷點處拉取文件時,除標準Android表「android_metadata」外,數據庫爲空。

不知何故,Android會覆蓋該文件,或該文件未正確保存在文件系統中。有沒有人有一個想法,我可以尋找一個解決方案?

+0

檢查你的onCreate做什麼,onUpgrade等可能會覆寫複製數據庫有 – zapl 2012-03-13 18:04:24

+0

我灑我自己的代碼與斷點和經歷它一行一行地。它驗證它發生在onCreate和onUpdate函數之後。 – Todorus 2012-03-13 20:59:48

回答

0

是的,會發生這種情況,因爲在SQLiteOpenHelper的構造函數中調用了oncreateonUpgrade。他們可以在傳入的數據庫對象上進行編輯,但構造函數將繼續修改數據庫(例如添加android_metadata表)。這可能會覆蓋您的複製粘貼文件。

我想曾經有一段時間,我試着按照自己的方式去做,無法擺脫它,最後放棄了整齊的解決方案。最後,我終於實現了:

public SQLiteDatabase getSQLiteDatabase() { 
    SQLiteDatabase database = getReadableDatabase(); 
    if(!isDatabaseCopied) { 
     copyDatabase(); 
     isDatabaseCopied = true; 
     database = getReadableDatabase(); 
    } 

    return database; 
} 

這在SQLiteOpenHelper

+0

這讓鮑里斯真的很驚訝。如果框架會在onCreate()和onUpdate()方法後覆蓋文件,那麼這些方法中的任何更改都會被框架取消。爲什麼框架認爲使用sql語句來準備數據庫但不覆蓋會有一個原因。 – Todorus 2012-03-13 21:06:36

+0

我完全同意你的看法,但事實如此。數據庫是否可以在某個地方創建,然後複製到預期的數據庫?或者可能是所有請求都打包在事務中,並且第一個操作是刪除所有表(特別是在'onUpgrade'情況下不太可能)。 – 2012-03-14 08:28:50

+0

這是其中一種選擇。使用onUpgrade時,可能是sql導出來重新填充數據庫?奇怪的東西。無論如何,我像你一樣解決了這個問題:通過覆蓋onCreate方法之外的數據庫。謝謝你的兩分錢。 – Todorus 2012-03-14 13:46:03

相關問題