ORMlite数据库更新

3
根据我之前提出的问题(参见这里),如果我在分发应用程序后进行更改并添加新数据,则删除和重新创建表将无法很好地工作,因为用户将失去所有数据。针对此问题有没有推荐的处理策略?或者你是否有一些示例可以给出,告诉我如何解决这个问题?
谢谢。 编辑: 大概会像这样:
@Override
    public void onUpgrade (SQLiteDatabase db, ConnectionSource connectionSource, int oldVersion, int newVersion){
        // TODO Auto-generated method stub
            //This is why I'm currently trying
        while(oldVersion < newVersion){
            switch(oldVersion){
            case 2:
                //add new datas from version 2 here
                break;
            case 3:
                //add new datas from version 3 here
                break;
            default:
                break;
            }
            oldVersion++;
        }
            /*
        try {
            Log.i(DatabaseHelper.class.getName(), "onUpgrade");
            TableUtils.dropTable(connectionSource, Category.class, true);
            TableUtils.dropTable(connectionSource, Level.class, true);
            TableUtils.dropTable(connectionSource, Hint.class, true);
            TableUtils.dropTable(connectionSource, HintCount.class, true);
            TableUtils.dropTable(connectionSource, Question.class, true);
            // after we drop the old databases, we create the new ones
            onCreate(db, connectionSource);
        } catch (SQLException e) {
            Log.e(DatabaseHelper.class.getName(), "Can't drop databases", e);
            throw new RuntimeException(e);
        }
            */
    }

当我向对象添加新字段时,我会手动向数据库中添加新列。这似乎就像是我在执行ORM的工作,但我没有找到其他方法。我会检查当前的架构,并添加相应的列,以便ORM可以识别它们。 - Mikita Belahlazau
是的,但我面临的问题是如何优雅地插入新条目到数据库中,并保留已经输入的条目。 - Alexis C.
你能提供一下你想做的例子吗?更改数据库通常意味着更改模式,添加/删除列和表。例如,如果您添加了新列,可以在onUpgrade中为该列中的现有对象设置一些默认值。我必须承认这不会非常优雅。 - Mikita Belahlazau
问题已编辑。这并不是很好看,因为我真的不知道该如何解决这个问题... 我正在考虑以下几点:1)如果用户尚未下载应用程序,则将调用onCreate方法并创建所有数据。2)如果用户正在升级应用程序,我希望我的程序仅插入新条目并保留旧条目(但我该如何做到这一点呢?) - Alexis C.
1个回答

2
如果你只关心新数据而不是模式修改,你可以尝试在ORM lite中使用createIfNotExists方法。所以基本上在每次升级时,你会尝试插入所有数据。但只有新数据会被插入。
编辑: 另一种方法可能是: 将所有对象分成组,如:初始对象、第一个升级对象、第二个升级对象等等。
onCreate中,你将创建所有对象,迭代所有组。在onUpgrade中,你将根据当前版本使用组。

所以你是告诉我,在onUpgrade方法中必须调用创建数据的方法,并在dao上调用createIfNotExists方法。但我的对象具有自动递增的id,因此如果我调用创建数据的方法,则会重复创建它们。对吧? - Alexis C.
我曾尝试过这种方法。使用开关并在旧版数据库不等于当前版本时进行迭代。但这会使过程变得复杂。你认为有更好的想法吗? - Alexis C.
好的,我用了旧方法,使用了一个switch和一个迭代。我接受你的答案,因为目前我没有找到更好的解决方案:(谢谢 - Alexis C.
@ZouZou,你有没有找到解决这个问题的好方法?我目前也遇到了这个问题,数据库更新方面运气不佳。 - Taslim A. Khan
@Pro.metal 我使用了 switch。请参考 https://dev59.com/1WYr5IYBdhLWcg3wTYi4 - Alexis C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接