アセットまたは生のフォルダから/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);
}
}
@MisterSpuonkはい、それは私の質問の主な焦点でした。私は他のAndroid開発者から、これがプラットフォームに比較的新しいので、これが良い方法かどうかについての情報を得たいと思っていました。 – ewjames