问题
I am using my existing Database with my android contact app. It works fine for the first time. If I upgrade the Asset folder's Database and reinstall the app the Database doesn't upgrade it show the old one during the app run on emulator.
How the onUpgrade()
method works if I change the DB version on every release of app in case of using existing Database?
Here is my DataBaseHelper.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DataBaseHelper extends SQLiteOpenHelper
{
private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window
//destination path (location) of our database on device
private static String DB_PATH = "";
private static String DB_NAME ="SBLdata.db";// Database name
private static String DATABASE_TABLE ="SBL_Contact";// Database name
private static final int DATABASE_VERSION = 1;
private SQLiteDatabase mDataBase;
private final Context mContext;
private SQLiteDatabase db;
private int oldVersion;
private int newVersion;
public DataBaseHelper(Context context, String dbName)
{
super(context, DB_NAME, null, DATABASE_VERSION );
if(android.os.Build.VERSION.SDK_INT >= 17){
DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
}
else
{
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
}
this.mContext = context;
}
public void createDataBase() throws IOException
{
//If database not exists copy it from the assets
boolean mDataBaseExist = checkDataBase();
if(!mDataBaseExist)
{
this.getReadableDatabase();
this.close();
try
{
//Copy the database from assests
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);
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;
mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
return mDataBase != null;
}
@Override
public synchronized void close()
{
if(mDataBase != null)
mDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < DataBaseHelper.DATABASE_VERSION) {
//drop old table and create and copy the new one
}else{
//do Nothing
}
}
}
回答1:
OnUpgrade is called whenever you increase the version number of your database.
回答2:
what you do inside onUpgrade() is upto you. you can create a new database or upgrade existing in any way you want. that means you have to manually drop the old table and insert these data into a new table. or use ALTER_TABLE.
来源:https://stackoverflow.com/questions/32937039/upgrading-db-when-using-existing-database-with-android-app