在使用Android App的现有数据库时升级数据库

时间:2015-10-04 18:45:22

标签: android database sqlite

我在我的Android联系人应用程序中使用我现有的数据库。它第一次工作正常。如果我升级资产文件夹的数据库并重新安装应用程序数据库没有升级,则在模拟器上运行应用程序期间显示旧版本。

如果在使用现有数据库的情况下更改每个应用程序版本的数据库版本,onUpgrade()方法如何工作?

这是我的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
        }
    }

}

2 个答案:

答案 0 :(得分:0)

只要增加数据库的版本号,就会调用OnUpgrade。

答案 1 :(得分:0)

你在onUpgrade()中所做的是由你决定的。您可以以任何方式创建新数据库或升级。这意味着您必须手动删除旧表并将这些数据插入到新表中。或使用ALTER_TABLE。