android onUpgrade将旧数据库中的一些记录移动到新数据库

时间:2015-01-20 15:37:40

标签: java android sqlite

我想要实现的是,我的应用程序将附带从我的网络面板导出的现有sqlite数据库,其中包含一些记录(新闻,产品,类别等),稍后它会将自己的一些记录插入到它(假设它会插入收到的通知),它将被复制到数据库文件夹,直到这里没有问题但是我担心的是当用户通过我想要的市场升级他们的应用程序时用旧的数据库替换新数据库,但保留那些应用程序生成的记录(已收到的通知)并将它们插入新数据库中。到目前为止,这是我的代码:(如有必要,请加强)

public class Helper_Db extends SQLiteOpenHelper{

    public static final String DB_NAME = "Test.sqlite";
    public static final int DB_VERSION = 3;
    private static String DB_PATH = "";
    private SQLiteDatabase _db;
    private final Context _ctx;

    public Helper_Db(Context context) {
        super(context, null, null, 1);
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
        _ctx = context;
}

    @Override
    public void onCreate(SQLiteDatabase db) {
        try
        {
            copyDatabase();
            Log.e("DATABASE", "Database created");
        }
        catch(IOException io)
        {
            Log.e("DATABASE", io.toString());
        }

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //take out the notifications from old db
        //insert them into the new db
        //delete the old db
        //copy the new db

    }       

    private void copyDatabase() throws IOException
    {
        InputStream input = _ctx.getAssets().open(DB_NAME);
        String outFileName = DB_PATH + DB_NAME;
        OutputStream output = new FileOutputStream(outFileName);
        byte [] buffer = new byte [1024];
        int length;
        while((length = input.read(buffer)) > 0)
        {
            output.write(buffer, 0, length);
        }
        output.flush();
        output.close();
        input.close();
    }

    public boolean openDatabase() throws SQLException
    {
        String path = DB_PATH + DB_NAME;
        _db = SQLiteDatabase.openDatabase(path, null, 
                SQLiteDatabase.CREATE_IF_NECESSARY);
        return _db != null;
    }

    @Override
    public void close()
    {
        if(_db != null)
        {
            _db.close();
        }
        super.close();
    }

}

提前致谢。

1 个答案:

答案 0 :(得分:0)

我做了类似的事情。我在数据库中有默认内容,我随附的应用程序随时更改。但是,我有一个例程,用于同步数据库以便在用户和备份之间进行同步,每次升级数据库时,我都会使用包含的数据库并将其与现有用户的数据库同步。

这可能对您的需求太多了,但这让我知道数据是否是用户数据,这似乎是真正的问题。您需要确定哪些数据是用户数据。然后,您需要做的就是复制该数据。

所以,我的建议是在每个数据库表中创建一个整数列,称为" IncludedContent"并在发货数据库中包含的所有数据上将其设置为1,并将默认值设置为0,这是所有用户内容将具有的。然后你只需要使用Attach command这样的东西来附加数据库:

db.execSQL("ATTACH DATABASE ? AS Old_DB", new String[]{fullPathToOldDB});

然后执行此类插入以仅复制用户内容:

db.execSQL("INSERT INTO New_DB.TABLE SELECT * FROM Old_DB.TABLE WHERE IncludedContent = 0");