2010-06-10 40 views
6

我的問題是我認爲很簡單,但我不認爲答案會是... 我的應用程序中有相當多的內容使其正常運行,並且我正在考慮將其全部放在數據庫中,並且將其與市場上的應用程序一起分發到嵌入式數據庫中。 唯一的麻煩是我不知道如何做到這一點。 我知道我可以從Eclipse DDMS中提取一個帶有數據庫內容的文件.db,我想我需要把它放在我的應用程序的資產文件夾中,但是如何讓應用程序使用它來重新生成應用程序數據庫? 如果你有任何鏈接到一些代碼或幫助,那會很好。 感謝在分佈式應用程序的.apk中嵌入數據庫[Android]

回答

12

出色地實現你的要求,你可以把.db文件在您的資產/目錄下,並將其複製到地方你第一次啓動您的應用程序.....

final String DB_DESTINATION = "/data/data/YOUR_PACKAGE_NAME/databases/MyDatabaseFile.db"; 

// Check if the database exists before copying 
boolean initialiseDatabase = (new File(DB_DESTINATION)).exists(); 
if (initialiseDatabase == false) { 

    // Open the .db file in your assets directory 
    InputStream is = getContext().getAssets().open("MyDatabaseFile.db"); 

    // Copy the database into the destination 
    OutputStream os = new FileOutputStream(DB_DESTINATION); 
    byte[] buffer = new byte[1024]; 
    int length; 
    while ((length = is.read(buffer)) > 0){ 
     os.write(buffer, 0, length); 
    } 
    os.flush(); 

    os.close(); 
    is.close(); 
} 

其中「initialiseDatabase」是指示應用程序是否已首次啓動的某個標誌。儘管如果您正在尋找存儲大量數據的方法,正如您所提到的那樣:我強烈建議您避免使用它擴大APK文件,並使用Internet連接從託管服務器下載數據庫記錄(在託管服務器上)該應用程序已啓動。通過這種方式,您可以顯示一個進度條,向用戶顯示爲什麼他們等待很長時間才能開始使用該應用程序。使APK特別大,通常會阻止人們將它安裝在第一位。

+0

嗯,我之前使用了一個進度條,但由於我正在下載大量圖片,並且解析了幾個XML ,它需要相當多的時間,特別是當你使用3G網絡而不是wifi時 – Sephy 2010-06-10 11:23:10

+0

只是檢查數據庫是否已經存在而不是使用布爾值是不是更容易? 如何在應用程序關閉時跟蹤布爾值?進入數據庫? – Sephy 2010-06-10 11:27:00

+0

這正是布爾表示的內容,我將其作爲實現練習。我已經更新了示例代碼,介紹瞭如何解決這個問題。 – seanhodges 2010-06-10 11:49:40

1

您可以實施中間道路解決方案:使用上述方法,但不要將db文件分發到服務器上。根據我的經驗,獲取文件只佔處理時間的10%,其餘部分是解析和序列化圖像到db

+0

其實我的目的是爲了避免把它放在服務器上,並在安裝應用程序後直接強制下載... – Sephy 2010-07-29 06:44:17

+0

我明白了。我正在考慮爲我的應用程序,但後來我看着數據庫大小和其他+ 350K。人們對此非常敏感,但如果你有良好的連接,它肯定會比隨後處理的零散下載更快 – Bostone 2010-07-29 20:57:00

相關問題