2012-01-10 14 views
2

アセットまたは生のフォルダから/data/data/APP/databasesフォルダにデータベースファイルをコピーする際に多くの投稿を読みましたが、貴重なスペースを占有する。データベースのSQL作成テキストファイルを生のフォルダに格納し、標準のon_create/on_updateプロセスをDBhelperクラスに使用することで、より小さなフットプリントでソリューションを構築し、より柔軟なスキーマ管理が可能になると考えています。しかし、データベースをコピーする例がon_create and on_updateメソッドをバイパスするので、私は少し混乱しています。AndroidでSQLiteデータベースを作成するためのベストプラクティス

コード内の文字列からデータベースを構築しない場合は、これをお勧めしますか?

私のソリューションは、スクリプトを1つのファイルにまとめて実行することで、実行中のスクリプトをコードメソッドからシミュレートします。私がこのようにDBを構築しようとしている理由は、アプリケーションが完了した時点で私のDBが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文がロードされているテキストファイルを使用してゼロからDBを作成することができたら、答えは「はい」です。

だけでなく、ネットワーク上の場所から 'スキーマ'ファイルをダウンロードすることもできるので、APK内にあらかじめ構築されたDBを配布するよりも柔軟です。これにより、中心点でスキーマを動的に更新することができます。

+0

@MisterSpuonkはい、それは私の質問の主な焦点でした。私は他のAndroid開発者から、これがプラットフォームに比較的新しいので、これが良い方法かどうかについての情報を得たいと思っていました。 – ewjames

6

私はそれが良い習慣のように思えます。コードで完全にデータベースを作成してもそれほど悪くはありません。それはかなり大きなデータベース作成部分を持っているIOのスケジュールのGoogleのアプリをチェックアウトする。それはあなたに道を導くかもしれない。

Here私はリファレンスとして、それは=芸術作品のようなものですすべての時間をこのアプリケーションを使用hereは、データベースの一部

で、プロジェクトのホームページです)


編集: Googleはアプリを更新して、古いデータベースリンクが機能しないようにしました。

+0

+1 IOSchedのアプリを提案するために、私はまたこれを参照として常に使用します:) –

+0

Thanks C.d.私はそれを見ていきます。 – ewjames

+0

正しいデータベースパス、https://github.com/google/iosched/blob/master/android/src/main/java/com/google/samples/apps/iosched/provider/ScheduleDatabase.java –

関連する問題