Upgrading DB when using existing Database with Android App

核能气质少年 提交于 2020-01-17 04:31:26

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!