简体   繁体   English

不调用Sqlite数据库onUpgrade()

[英]Sqlite database onUpgrade() does not get called

I am working on an android application where i used existing sqlite database in the asset folder. 我正在开发一个Android应用程序,我在资产文件夹中使用了现有的sqlite数据库。 So i actually copy the database from that folder. 所以我实际上从该文件夹中复制数据库。 User can also save their own data(mark any content as favorite). 用户还可以保存自己的数据(将任何内容标记为收藏)。

I uploaded a version in the market. 我在市场上上传了一个版本。 Now i want to add some new data in the database and uploaded a new version. 现在我想在数据库中添加一些新数据并上传新版本。 If user update the app from the market i want to keep the user data(from previous version) and add the new data as well. 如果用户从市场更新应用程序,我想保留用户数据(从以前的版本)并添加新数据。 I have done some google and found that on upgrade method should do the trick. 我做了一些谷歌,发现升级方法应该做的伎俩。 But I am changing the DATABASE_VERSION from code but the on upgrade method does not get call. 但是我正在从代码中更改DATABASE_VERSION,但是on upgrade方法没有得到调用。 I am wondering i have missed something. 我想知道我错过了什么。 Here is my code: 这是我的代码:

public class DataBaseHelper extends SQLiteOpenHelper {

private static String DB_PATH = "/data/data/riskycoder.login/databases/";
public static String DB_NAME = "datenbank_EN.sqlite";
private SQLiteDatabase myDataBase;
private final Context myContext;
private static final int DATABASE_VERSION = 1;





public DataBaseHelper(Context context) {
    super(context, DB_NAME, null, DATABASE_VERSION);
    this.myContext = context;
}

public void createDataBase() throws IOException {
    boolean dbExist = checkDataBase();
    if (dbExist) {
    } else {
        this.getWritableDatabase();
        try {
            this.close();
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }

}

private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;
    try {
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
    } catch (SQLiteException e) {
    }
    if (checkDB != null)
        checkDB.close();
    return checkDB != null ? true : false;
}

private void copyDataBase() throws IOException {

    InputStream myInput = myContext.getAssets().open(DB_NAME);
    String outFileName = DB_PATH + DB_NAME;
    OutputStream myOutput = new FileOutputStream(outFileName);
    byte[] buffer = new byte[2048];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }
    myOutput.flush();
    myOutput.close();
    myInput.close();

    //myDataBase.setVersion(DATABASE_VERSION);
}

public void openDataBase() throws SQLException {
    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
    Log.d("Test", "Database version: " +myDataBase.getVersion());
}

@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("Test", "in onUpgrade. Old is: " + oldVersion + " New is: " + newVersion);


}

} }

onUpgrade() is only called if a change in the database version number is detected. 仅当检测到数据库版本号的更改时,才会调用onUpgrade() Increment the database version as follows: 按如下方式增加数据库版本:

private static final int DATABASE_VERSION = 2;

Change your onUpgrade to the following 将onUpgrade更改为以下内容

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

            if(newVersion > oldVersion){                    
                    myContext.deleteDatabase(DB_NAME);
            }
        }

And also change your createDataBase() like below, 并且还如下所示更改您的createDataBase(),

public void createDataBase() throws IOException{

            boolean dbExist = checkDataBase();

            if(dbExist){
                // By calling this method here onUpgrade will be called on a
                // writable database, but only if the version number has been increased

                this.getWritableDatabase();
            }

            dbExist = checkDataBase();

            if(!dbExist){

                //By calling this method an empty database will be created into the                     default system path
                   //of the application so we will be able to overwrite that database with our database.
                this.getReadableDatabase();

                try {

                    copyDataBase();

                } catch (IOException e) {

                    throw new Error("Error copying database");

                }
            }

        }

At the end increase your database version and run it again. 最后增加数据库版本并再次运行。 onUpgrade doesn't get called till you call getReadableDatabase() or similar functions. 在调用getReadableDatabase()或类似函数之前,不会调用onUpgrade

Hope this helps 希望这可以帮助

试试这个(增加DATABASE_VERSION)并调用onUpdate():

private static final int DATABASE_VERSION = 2; 

Assuming you did change the DATABASE_VERSION, you still have to put code in the onUpgrade to make it happen. 假设您确实更改了DATABASE_VERSION,您仍然必须将代码放在onUpgrade中以实现它。 It's not magical, you have to tell it what to do. 这不是神奇的,你必须告诉它该怎么做。

In your case you need to: 在您的情况下,您需要:

1) copy the old database (give it a new name) 1)复制旧数据库(给它一个新名字)
2) copy in your new database 2)复制新数据库
3) read the data from the old database 3)从旧数据库中读取数据
4) copy any differences into the new database 4)将任何差异复制到新数据库中
5) delete the old database 5)删除旧数据库

EDIT 编辑

Assuming you ship the DB in the assets folder you would copy it for use like so: 假设您在资产文件夹中运送数据库,您可以将其复制以供使用,如下所示:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // First copy old db
    InputStream bakInput = getActivity().getAssets().open(dbname);
    String bakFileName = getActivity().getAssets() + "YourDB.old";
    OutputStream bakOutput = new FileOutputStream(bakFileName);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = bakInput.read(buffer)) > 0) {
        bakOutput.write(buffer, 0, length);
    }
    myOutput.flush();
    myOutput.close();
    myInput.close();

    // delete the old db
    File delDB = new File(getActivity().getAssets() + "YourDB"); 
    boolean deleted = file.delete(); 

    // Copy in the new db
    InputStream myInput = getActivity().getAssets().open("YourDB");
    String outFileName = MAIN_DB_PATH + dbname;
    OutputStream myOutput = new FileOutputStream(outFileName);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }
    myOutput.flush();
    myOutput.close();
    myInput.close();

    // add code here to get changes user has made to db and move them to updated db

    // delete the old db copy
    File delDB = new File(getActivity().getAssets() + "YourDB.old"); 
    boolean deleted = file.delete(); 
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM