2010-03-09 188 views
26

我正在開發一個Android應用程序,該應用程序需要在用戶可以使用該應用程序之前在該應用程序的數據庫中填充多個條目(一個表格,包含1000-10000行)。我瀏覽過一些教程,並且我不確定這樣做的最佳方式。我應該在每次啓動應用程序時檢查數據庫是否存在,如果不存在,創建它並插入我需要的數千條記錄?還是有更好的方法來處理這個問題?理想情況下,它可以作爲應用程序安裝過程的一部分,但我不確定這是否可行。任何反饋將不勝感激。Android預填充數據庫

+0

http://stackoverflow.com/a/9109728/265167 – 2012-02-15 11:00:58

+1

我不想張貼此作爲一個答案,因爲它不是真的。考慮編寫Java以在Android_上構建數據庫(例如,使用ADB推送的CSV文件)。然後將其壓縮到'/ assets'進行安裝。試圖完全匹配Android在非Android環境中所期望的結果是我成爲一個脆弱的構建步驟。 – Gene 2012-06-06 22:11:24

+0

@ JonDiY212鏈接中的HTML錯誤。 – Noumenon 2013-05-14 16:56:46

回答

17

這個環節有很好的答案Ship an application with a database

+4

以下是在提及的SO問題Andrey中作爲答案呈現的鏈接。這是一篇關於使用Android應用程序發佈預建數據庫的非常棒的文章: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ – 2010-03-09 18:43:03

+0

類似但很簡單:http://www.helloandroid.com/tutorials/how-have-default-database – 2012-04-02 11:16:46

+0

http:// stackoverflow。com/questions/9109438/using-already-created-database-with-android/9109728#9109728 – 2012-07-26 22:42:30

3

我要去這裏的方式是將資源文件夾中預先填充的數據庫。您可以將文件放在那裏並按原樣使用它們。但是,請注意,存在1MB的大小限制,因此您可能需要分割文件或對其進行壓縮。

壓縮非常方便,並由os本身支持。

希望這是有幫助:-)

+1

大小限制爲1 MB。 – 2014-06-30 15:24:51

1

的JavaDoc從SQLiteOpenHelper:

一個輔助類來管理數據庫 創作和版本管理。您 創建實施 的onCreate(SQLiteDatabase)的子類, onUpgrade(SQLiteDatabase,INT,INT) 和可選的OnOpen(SQLiteDatabase), 這個類需要開放 如果存在數據庫的護理,創建它 如果它不不,並且將其升級爲 必要。事務用於 確保數據庫始終處於 明智狀態。

有關示例,請參閱NotePad 示例應用程序中SDK的示例/ 目錄中的 NotePadProvider類。

所以,如果你擴展這個類,你有3種方法將在某些情況下被調用,你可以選擇,做什麼。 那是最好的做法:)

2

下面是如何創建和填充數據庫的例子,你可以做到這一點的應用程序安裝,這將創建一個條目,雖然因此對於您想要做的事情可能效率低下。

private static class settingsDatabaseHelper extends SQLiteOpenHelper{ 

    //SQL String for creating the table required 
    private static final String CREATE_SETTINGS_TABLE 
    = "CREATE TABLE tbl_settings(" + 
      "_ID INTEGER PRIMARY KEY AUTOINCREMENT," + 
      "VOIPUSERNAME TEXT," + 
      "VOIPAUTHID TEXT," + 
      "PASSWORD TEXT," + 
      "VOIPDISPLAYNAME TEXT," + 
      "SIPPROXYSERVER TEXT," + 
      "SIPREGISTRAR TEXT," + 
      "SIPREALM TEXT," + 
      "EXPIRESTIME INTEGER);";  

    //constructor 
    public settingsDatabaseHelper(Context context, String name, 
      CursorFactory factory, int version) { 
     super(context, name, factory, version); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL(CREATE_SETTINGS_TABLE); 
     ContentValues initialValues = new ContentValues(); 
      initialValues.put("VOIPUSERNAME", "xxxxx"); 
      initialValues.put("VOIPAUTHID", "xxxxxxxxxx"); 
      initialValues.put("PASSWORD", "xxxxxx"); 
      initialValues.put("VOIPDISPLAYNAME", "xxxxxxxxx"); 
      initialValues.put("SIPPROXYSERVER", "xxxxxxxxxxxxx"); 
      initialValues.put("SIPREGISTRAR", "xxxxxxxxxxx"); 
      initialValues.put("SIPREALM", "xxxxxxxxxx"); 
      initialValues.put("EXPIRESTIME", xxxxxxxxxxx); 
      Log.d("1.6", "gets to here"); 
      db.insert(SETTINGS_TABLE, null, initialValues); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + 
       newVersion + ", which will destroy all old data"); 

     db.execSQL("DROP TABLE IF EXISTS " + SETTINGS_TABLE); 
     onCreate(db); 

    } 

} 

//end helper class 
} 
+0

請解釋一下投票嗎? – 2012-01-04 13:20:45

+0

如何在應用程序安裝上執行此操作?這部分代碼是否僅在安裝時執行? – 2017-10-01 12:15:22