当前位置:  开发笔记 > 编程语言 > 正文

如何在不删除用户在先前数据库中输入的数据的情况下升级数据库?

如何解决《如何在不删除用户在先前数据库中输入的数据的情况下升级数据库?》经验,为你挑选了1个好方法。

我正在创建一个需要数据库的应用程序.我使用sqlite数据库浏览器创建它,这意味着我创建的应用程序,将我创建的数据库导入手机.

我创建的应用程序要求用户将数据输入数据库.升级数据库时,我希望保留用户输入的数据.


我的数据库帮助程序代码如下:

public class DatabaseHelper extends SQLiteOpenHelper {

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

private static String DB_NAME = "TestDatabase";

private static final int DB_VERSION = 1;

private SQLiteDatabase myDatabase; 

private final Context myContext;

/**
 *  # Constructor #
 * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
 * @param context
 */
public DatabaseHelper(Context context) {

    super(context, DB_NAME, null, DB_VERSION);
    this.myContext = context;
}//constructor  

/**
 *  # Create Database #
 * Creates a empty database on the system and rewrites it with your own database.
 */
public void createDatabase() throws IOException {

    boolean dbExist = checkDatabase();

    if(dbExist)
    {
        //do nothing - database already exist
    }//if

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

        try 
        {
            copyDatabase();

        } catch (IOException e) {

            throw new Error("Error copying database");

        }//catch
    }//else

}//createDatabase

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.

    }//catch

    if(checkDB != null) 
    { 
        checkDB.close();

    }//if

    return checkDB != null ? true : false;

}//checkDatabase


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();

}//copyDatabase

// # open database #
public void openDatabase() throws SQLException {

    //Open the database
    String myPath = DB_PATH + DB_NAME;
    myDatabase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);

}//openDatabase

@Override
public synchronized void close() 
{
    if(myDatabase != null)
        myDatabase.close();

    super.close();

}//close

@Override
public void onCreate(SQLiteDatabase db) {

}

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

}

public List selectData
    (String tableName, String [] columns, String selection, String[] selectionArgs,
            String groupBy, String having, String orderBy) {

    List list = new ArrayList();

    Cursor cursor = this.myDatabase.query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy);

    if (cursor.moveToFirst()) 
    {
        do 
        {
            list.add(cursor.getString(0));
        }

        while (cursor.moveToNext());
    }

    if (cursor != null && !cursor.isClosed()) 
    {
        cursor.close();
    }
    return list;

}//selectData

public void insertData (String tableName, String nullColumnHack, ContentValues values) {

    try
    {
        myDatabase.insert(tableName, nullColumnHack, values);
    } catch (Exception e) {
        Log.e("Error :","unable to insert data");
    }//catch

}//insertData

//edit row
public void updateData (String tableName, ContentValues values, String whereClause, String[] whereArgs) {

    try
    {
        myDatabase.update(tableName, values, whereClause, whereArgs);
    } catch (Exception e) {
        Log.e("Error :","unable to update data");
    }//catch
}//updateData

public void deleteRow (String tableName, String whereClause, String[] whereArgs) {

    try
    {
        myDatabase.delete(tableName, whereClause, whereArgs);
    } catch (Exception e) {
        Log.e("Error :","unable to delete row");
    }//catch
}//deleteRow
}

*注意:我的数据库由多个表组成.两个表需要用户输入.其他人没有.

我希望可以给出真正的答案,而不是给出我不具备的确切情况的网站,因为我很容易混淆.



1> Shawn Lauzon..:

您应该在onUpgrade方法中添加一些代码.这样,您可以检查oldVersion和newVersion并执行正确的ALTER TABLE语句.如您所见,当前版本为23,检查代码检查旧版本是什么.如果版本22它只执行v22语句,但是如果版本21它同时执行v21和v22语句.这是Google I/O应用的一部分:

private static final int VER_LAUNCH = 21;
private static final int VER_SESSION_FEEDBACK_URL = 22;
private static final int VER_SESSION_NOTES_URL_SLUG = 23;

private static final int DATABASE_VERSION = VER_SESSION_NOTES_URL_SLUG;

...

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.d(TAG, "onUpgrade() from " + oldVersion + " to " + newVersion);

    // NOTE: This switch statement is designed to handle cascading database
    // updates, starting at the current version and falling through to all
    // future upgrade cases. Only use "break;" when you want to drop and
    // recreate the entire database.
    int version = oldVersion;

    switch (version) {
        case VER_LAUNCH:
            // Version 22 added column for session feedback URL.
            db.execSQL("ALTER TABLE " + Tables.SESSIONS + " ADD COLUMN "
                    + SessionsColumns.SESSION_FEEDBACK_URL + " TEXT");
            version = VER_SESSION_FEEDBACK_URL;

        case VER_SESSION_FEEDBACK_URL:
            // Version 23 added columns for session official notes URL and slug.
            db.execSQL("ALTER TABLE " + Tables.SESSIONS + " ADD COLUMN "
                    + SessionsColumns.SESSION_NOTES_URL + " TEXT");
            db.execSQL("ALTER TABLE " + Tables.SESSIONS + " ADD COLUMN "
                    + SessionsColumns.SESSION_SLUG + " TEXT");
            version = VER_SESSION_NOTES_URL_SLUG;
    }

    Log.d(TAG, "after upgrade logic, at version " + version);
    if (version != DATABASE_VERSION) {
        Log.w(TAG, "Destroying old data during upgrade");

        db.execSQL("DROP TABLE IF EXISTS " + Tables.BLOCKS);

        // ... delete all your tables ...

        onCreate(db);
     }
 }

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有