私はこのDataBaseHelper.classを使用していますが、私はonUpgrade()メソッドに固執しています。私はデータベースのバージョン番号が何であるか把握する方法を知らない。私はバージョンを1に設定することができました。私が初めてそれを公開したときに、私がアップデートを公開するときには、単にバージョンを2 (myDataBase.setVersion(2);)
に設定することができました。しかし、アプリケーションが実行されている間だけ2になるでしょう。次回に起動すると再び1になります。 private static int DATABASE_VERSION
も同様です。私は余分なテーブルにバージョン番号を格納することについて考えていたが、これは私の見解ではベストプラクティスではないようだ。onUpgradeデータベース - oldVersion - newVersion
バージョン番号がアップグレード後に増加し、それが保持されていることを確認します(private static int DATABASE_VERSION
またはmyDataBase.getVersion();
に割り当てられた値)。
DataBaseHelperクラス:
public class DataBaseHelper extends SQLiteOpenHelper {
//The Android's default system path of your application database.
private static String DB_PATH = "/data/data/com.mydatabase.db/databases/";
private static String DB_NAME = "database.sl3";
private SQLiteDatabase myDataBase;
private final Context myContext;
// Do you need this?
private static int DATABASE_VERSION = 2;
// or is this correct:
// private static int DATABASE_VERSION = myDataBase.getVersion();
/**
* Constructor
* Takes and keeps a reference of the passed context in order to access to
* the application assets and resources.
*
* @param context
*/
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, DATABASE_VERSION);
this.myContext = context;
}
/**
* Creates an empty database on the system and rewrites it with your own
* database.
* */
public void
createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
}
else {
//By calling this method and empty database will be created into the default system path
//of your application so we are gonna be able to overwrite that database with our database.
this.getWritableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
/**
* Check if the database already exist to avoid re-copying the file each
* time you open the application.
*
* @return true if it exists, false if it doesn't
*/
private boolean
checkDataBase() {
SQLiteDatabase checkDB = null;
try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
} catch (SQLiteException e) {
//database does't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}
/**
* Copies your database from your local assets-folder to the just created
* empty database in the
* system folder, from where it can be accessed and handled.
* This is done by transfering bytestream.
* */
private void
copyDataBase() throws IOException {
//Open your local db as the input stream
InputStream myInput = myContext.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
//Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
//Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}
public void
openDataBase() throws SQLException {
//Open the database
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
// Which parameters do I have to pass?
onUpgrade(myDataBase, DATABASE_VERSION, 2);
}
@Override
public synchronized void
close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}
@Override
public void
onCreate(SQLiteDatabase db) {
}
@Override
public void
onUpgrade( SQLiteDatabase db,
int oldVersion,
int newVersion) {
Log.d ("onUpgrade first log", Integer.toString(myDataBase.getVersion()));
if (oldVersion == 1) {
// do something
// And then do this!?
DATABASE_VERSION = 2;
// or do this
myDataBase.setVersion(2);
Log.d ("onUpgrade sedond log", Integer.toString(myDataBase.getVersion()));
}
else {
Log.d("onUpgrade", "else-clause: Already upgraded!");
}
}
こんにちはグラハムボーランドに投稿してください任意の説明が必要な場合は!あなたは正しく資産フォルダから既存のデータベースをインポートして、これがあなたの資産のデータベースファイルに直接適用する必要があると思います!しかし、私はこれをどのようにして行うのですか? – BenjaminButton
私はバージョン番号を意味しました。 – BenjaminButton
私はそれが働いている! createDataBaseクラスでは、行がありませんでした。 'public void createDataBase()throws IOException {boolean dbExist = checkDataBase(); さらに、DataBaseHelperクラスの新しいオブジェクトが作成されたときに、onUpgrade()が呼び出されますが、**データベースが更新された場合にのみ**バージョン番号が一致しません。これは、onUpgradeを "自分で"呼び出す必要はないということです。データベースのアップデートを公開する場合は、バージョンnrを1だけインクリメントし、onUpgrade()メソッドで変更を適用します。誰でも助けることを願っています! – BenjaminButton