【问题标题】:Update SQLite table without losing previous data in android更新 SQLite 表而不丢失 android 中以前的数据
【发布时间】:2018-08-23 19:46:58
【问题描述】:

我正在尝试在旧的 sqlite 数据库表中添加一个新列。表格是动态的。我的意思是当应用程序用户在应用程序中添加特定数据时创建它们。

表名有类似的后缀。前缀取决于用户输入。现在,在 android 中,如何在这些表中添加新列而不丢失以前的数据?

【问题讨论】:

    标签: java android sqlite sqliteopenhelper


    【解决方案1】:

    我希望您已经知道onUpgrade 方法的工作原理。 onUpgrade 的实现非常简单,它会检测数据库版本是否更改,并将更改对较新版本的数据库生效。这是一个示例实现。

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        // The last case will contain the break statement only. As the migration will take place one by one.
        // Here's a nice explanation - http://stackoverflow.com/a/26916986/3145960
        switch (oldVersion) {
            case 1:
                doSomeChangesInDBForVersion1();
            case 2:
                doSomeChangesInDBForVersion2();
                break;
        }
    }
    

    现在让我们来谈谈您提出的具体问题。据我了解,数据库中的表是基于用户输入的动态表。您想在数据库表中添加基于用户输入创建的列。

    在这种情况下,您需要先找出现有表,然后对每个表运行 alter 命令。要查找数据库中的现有表,您可以执行以下操作。

    Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
    List<String> tableList = new ArrayList<>();
    
    if (c.moveToFirst()) {
        while (!c.isAfterLast()) {
            tableList.add(c.getString(0));
            c.moveToNext();
        }
    }
    

    现在将表名存储在一个数组中,然后在每个表上运行 alter 命令以在每个表中添加一个新列。

    for (String tableName : tableList) {
        db.execSQL("alter table " + tableName +"  add column new_col TEXT default null");
    }
    

    在您的 onUpgrade 函数中运行这些执行。我没有测试过这段代码。请根据您的要求进行修改。

    【讨论】:

    • 可能值得一提的是,指定 DEFAULT 值将应用该值。
    • 谢谢@MikeT。我已经编辑了答案。如果还有其他问题,请告诉我。
    • 谢谢。正确答案。
    • 很高兴知道我可以提供帮助。来自达卡的问候。
    【解决方案2】:

    试试这个逻辑

    @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
            int upgradeTo = oldVersion + 1;
            while (upgradeTo <= newVersion)
            {
                switch (upgradeTo)
                {
                    case 2:
                        db.execSQL("ALTER TABLE " + TABLE_REGISTER +"  ADD COLUMN user_mobile TEXT");
                        break;
                    case 3:
                        db.execSQL("ALTER TABLE " + TABLE_REGISTER +"  ADD COLUMN user_mobile_new TEXT");
                        break;
    
                }
                upgradeTo++;
            }
        }
    

    每次添加新列或新表时,只需添加另一个案例并增加数据库版本。您的最后一个案例是您的数据库版本。在我的情况下 dbVersion = 3

    【讨论】:

    • 这不是问题的确切答案。这只是增加了一个关于升级的新列。此处应更改表名。
    • 好的,你的问题标题是“更新 SQLite 表而不丢失 android 中以前的数据”所以。我会回复你的
    • 顺便说一句,这不是我的问题。 :P
    【解决方案3】:

    您为我遇到了这个问题,我从这个网站中受益,它将向您展示关注该主题的最佳方式

    enter link description here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2012-10-14
      • 2016-02-27
      • 2011-08-10
      • 2020-10-01
      • 1970-01-01
      相关资源
      最近更新 更多