问题
I hava app, and it has database, after published. I have add some tables to the my database.
How can I easily update new database with old database which was already installed phone before when a customer update this application on market.
Here is my Code. What should I write in onUpgrade
?
public class DataBaseHelper extends SQLiteOpenHelper
{
//destination path (location) of our database on device
private static String DB_PATH = "";
private static String DB_NAME ="sorubankasi.sqlite";// Database name
private SQLiteDatabase mDataBase;
private final Context mContext;
private static final int DATABASE_VERSION = 2;// new versiyon
private static final String tag = "stk";
public DataBaseHelper(Context context)
{
super(context, DB_NAME, null, DATABASE_VERSION);// 1? its old Database Version
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
this.mContext = context;
}
public void createDataBase() throws IOException
{
boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
this.getReadableDatabase();
this.close();
try
{
copyDataBase();
}
catch (IOException mIOException)
{
throw new Error("ErrorCopyingDataBase");
}
}
}
//Check that the database exists here: /data/data/your package/databases/Da Name
private boolean checkDataBase()
{
File dbFile = new File(DB_PATH + DB_NAME);
//Log.v("dbFile", dbFile + " "+ dbFile.exists());
return dbFile.exists();
}
//Copy the database from assets
private void copyDataBase() throws IOException
{
InputStream mInput = mContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream mOutput = new FileOutputStream(outFileName);
byte[] mBuffer = new byte[1024];
int mLength;
while ((mLength = mInput.read(mBuffer))>0)
{
mOutput.write(mBuffer, 0, mLength);
}
mOutput.flush();
mOutput.close();
mInput.close();
}
//Open the database, so we can query it
public boolean openDataBase() throws SQLException
{
String mPath = DB_PATH + DB_NAME;
//Log.v("mPath", mPath);
mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
//mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Log.d(tag, "opendatabase " + mDataBase.getVersion());
return mDataBase != null;
}
@Override
public synchronized void close()
{
if(mDataBase != null)
mDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase arg0) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}}
回答1:
If you're using SqliteOpenHelper
you will need to increment database version to the new version.And then you will get method onUpgrade()
called with the database instance and new version and the version the database is updating from.
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//create upgrades needed between the two versions "oldVersion" to "newVersion"
db.execSQL(newTableQuery);
db.execSQL(dropTableQuery);
}
Otherwise if you are using open database directly with no using of SqliteOpenHelper
, you will have to check the database version by checking "yourDatabaseInstance.getVersion()
" and if the database version is lower than a specific version, make new updates and then your database version to the new version using "yourDatabaseInstance.setVersion()
"
if(yourDatabaseInstance.getVersion() < newDatabaseVersion)
{
//create upgrades needed between the two versions "oldVersion" to "newVersion"
yourDatabaseInstance.setVersion(newDatabaseVersion);
}
回答2:
Well I have solved with my way! just adding some codes in to createDatabase method.
public void createDataBase() throws IOException {
boolean mDataBaseExist = checkDataBase();
if (!mDataBaseExist) {
this.getReadableDatabase();
this.close();
try {
copyDataBase();
} catch (IOException mIOException) {
throw new Error("ErrorCopyingDataBase");
}
}
else{
SQLiteDatabase db = getReadableDatabase();
if(db.getVersion()<DATABASE_VERSION){
this.getReadableDatabase();
this.close();
try {
copyDataBase();
} catch (IOException mIOException) {
throw new Error("ErrorCopyingDataBase");
}
}
}
}
After all, I think best way is for upgrade is changing the database name..
来源:https://stackoverflow.com/questions/22502453/android-what-is-the-easist-way-upgrade-database-for-existing-db