2012-01-10 101 views
2

我已經閱讀了大量關於將數據庫文件從資產或原始文件夾複製到/data/data/APP/databases文件夾的帖子,但這會在設備上留下兩個數據庫副本佔用寶貴的空間。我正在考慮構建一個稍微小一點的解決方案,並允許更靈活的模式管理,方法是將數據庫SQL創建文本文件存儲在原始文件夾中,並使用DBhelper類中的標準on_create/on_update進程。不過,我有點困惑,因爲複製數據庫的示例繞過on_create and on_update方法。在Android上創建SQLite數據庫的最佳做法

這是推薦的方式,如果你不是從代碼中的字符串構建數據庫?

我的解決方案將通過將腳本全部放在一個文件中來模擬代碼方法中的運行腳本。我以這種方式構建數據庫的原因是,當應用程序完成時,我的數據庫將有近100個表,因此我需要該模式可以管理。

歡迎任何指導,因爲我仍然在學習Android的最佳實踐和模式。

這裏是我的代碼示例:

public class DatabaseHelper extends SQLiteOpenHelper { 
    private final String DATABASE_NAME = "mydb"; 
    private final int DATABASE_VERSION = 1; 
    private final Context myCtx; 
    private String DATABASE_CREATE_SCRIPT = null; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     DATABASE_CREATE_SCRIPT = getLoadFile(); 

     // Create all tables and populate the lookup tables 
     db.execSQL(DATABASE_CREATE_SCRIPT); 
     db.execSQL(VIEW_CREATE_V_PERSON); 
    } 

    private String getLoadFile(){ 
     InputStream inputStream = myCtx.getResources().openRawResource(resIdofmyfile); 

     InputStreamReader inputreader = new InputStreamReader(inputStream); 
     BufferedReader buffreader = new BufferedReader(inputreader); 
     String line; 
     StringBuilder text = new StringBuilder(); 

     try { 
     while ((line = buffreader.readLine()) != null) { 
      text.append(line); 
      text.append('\n'); 
     } 
     } catch (IOException e) { 
      // We have an error to look up 
      return null; 
     } 
     return text.toString(); 
    } 

    /** 
    * onUpgrade will check the version of the database and update the database 
    * if a newer version is available. 
    */ 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Will set conditional upgrade checks 
     //Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which may destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS CONTEXT_LOAD"); 
      db.execSQL("DROP TABLE IF EXISTS ISSUES"); 
      db.execSQL("DROP TABLE IF EXISTS GOALS"); 
      db.execSQL("DROP TABLE IF EXISTS PERSON"); 

      db.execSQL("DROP VIEW IF EXISTS V_PERSON"); 
     onCreate(db); 
    } 


} 

回答

1

我真的不知道你的問題是什麼。

如果您問是否可以使用包含SQL CREATE語句負載的文本文件從頭開始創建數據庫,那麼答案是「是」。

不僅如此,它比在您的APK中分發預構建數據庫更靈活,因爲您甚至可以從網絡位置下載「模式」文件或文件。這使您可以在中心點動態更新模式。

+0

@MisterSpuonk是的,這是我的問題的主要焦點;我想從其他Android開發人員那裏瞭解一下這是否是一個好方法,因爲我對這個平臺比較陌生。 – ewjames 2012-01-11 11:34:21

6

我想這看起來很不錯。即使您完全使用代碼創建數據庫也不是很糟糕。查看谷歌的應用程序的IO時間表,它有一個相當大的數據庫創建部分。它可能會引導你。

Here是項目主頁,here是數據庫的一部分

我使用這個應用程序作爲參考的所有它就像一件藝術品的時候=)


編輯:谷歌更新了應用程序,所以舊的數據庫鏈接不起作用。

+0

+1提示IOSched應​​用程序,我也用這個作爲參考所有的時間:) – 2012-01-10 21:27:22

+0

謝謝C.d.我會查看它。 – ewjames 2012-01-11 11:35:46

+0

正確的數據庫路徑,https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/provider/ScheduleDatabase.java – 2014-08-11 03:47:35

相關問題