在Android应用中更新数据库的问题

时间:2011-08-08 22:08:09

标签: android sqlite

如果我想使用应用更新来升级数据库,我有点麻烦了解该怎么做,尽管我的情况有点独特。起始数据库(在资源文件夹中)有一些表已经包含记录,因此它只是将整个数据库直接复制到data / data / / databases /文件夹。当我想要进行更新时,我想要一些表来保存他们的数据,但我希望从更新的数据库中删除并添加其他表。

我假设我将代码放在OnUpgrade中,但我不知道该放什么...我可以备份表中的数据,但我不确定如何将其复制回来。

以下是我的代码的一些片段。

public class DataBaseHelper extends SQLiteOpenHelper{

//The Android's default system path of your application database.
private static String DB_PATH = "/data/data/package/databases/";

private static String DB_NAME = "drink.db";
private static final int DATABASE_VERSION = 2;
SQLiteDatabase myDataBase;
private final Context myContext;

public DataBaseHelper(Context context) {

    super(context, DB_NAME, null, DATABASE_VERSION);
    this.myContext = context;
}   

public void createDataBase() throws IOException{

    boolean dbExist = checkDataBase();
    if(dbExist){
            //do nothing database already exists
    }else{
            try {
            copyDataBase();

        } catch (IOException e) {

            throw new RuntimeException(e.getMessage());

        }
    }

}

private boolean checkDataBase(){
    SQLiteDatabase checkDB = null;

    try{
        String myPath = DB_PATH + DB_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

    }catch(SQLiteException e){
        //database does't exist yet.
    }

    if(checkDB != null){

        checkDB.close();

    }

    return checkDB != null ? true : false;
}

private void copyDataBase() throws IOException{

    //Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);

    // Path to the just created empty db
    String outFileName = DB_PATH + DB_NAME;

    //Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    //transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer))>0){
        myOutput.write(buffer, 0, length);
    }

    //Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();
}

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

    if (newVersion > oldVersion) {
            }
}
}

再次感谢!

1 个答案:

答案 0 :(得分:1)

关于将升级代码放在onUpgrade中,你是对的。我可以看到您正在使用广泛使用的解决方案来为您的应用程序提供预先构建的数据库,因此,您需要考虑一些本来不重要的方案。例如,如果您的用户安装了您的应用程序,但从未使用过该应用程序,并突然决定将其更新为新版本,该怎么办?然后您的代码将尝试“更新”不存在的数据库。所以,只是朝这个方向前进:)

在onUpgrade中编写代码时,您正在对提供的SQLiteDatabase对象执行操作,该对象是您的旧数据库。要从assets文件夹中获取新数据库,请在checkDataBase()方法中查看此内容:

checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

要使用新数据库(assets文件夹)获取SQLiteDatabase对象,请使用此函数,将myPath更改为assets文件夹中数据库的路径,它将返回一个SQLiteDatabase对象,您可能希望将open方法更改为可写,取决于您的需求。现在,您可以在两个数据库之间来回执行操作,以满足您的需求。