首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLiteOpenHelper onUpgrade()混淆安卓

SQLiteOpenHelper onUpgrade()混淆安卓
EN

Stack Overflow用户
提问于 2010-08-18 02:55:00
回答 4查看 36.5K关注 0票数 49

我正在使用数据库做我的第一个应用程序,我在理解onUpgrade函数时遇到了一些问题。我的数据库有一个表,其中包含一个项目和一个收藏夹列,这样用户就可以收藏一个项目。我看到的大多数实现都只是删除表并重新构建它,但我不想这样做。我希望能够向表格中添加更多项目。

当应用程序通过android marketplace升级时,数据库是否知道其版本号?那么,我是否可以在代码中增加版本号,然后将其导出到市场,当用户第一次启动升级版本时,将调用onUpgrade?

如果是这种情况,我的onUpgrade将简单地从文件中拉出并将数据库项添加到。这是一种标准的处理方式,还是在Android中有更好的处理方式。我正试着尽可能地保持标准。

谢谢

EN

回答 4

Stack Overflow用户

发布于 2010-08-18 03:01:21

好吧,在遇到更大的问题之前,您应该知道SQLite在ALTER table命令上是有限的,它只允许addrename不删除/删除,这是通过重新创建表来完成的。

您应该始终手头有新的表创建查询,并使用它来升级和传输任何现有数据。注意: onUpgrade方法为您的sqlite helper对象运行一个,您需要处理其中的所有表。

所以推荐什么: onUpgrade:

使用

  • beginTransaction
  • run创建表(我们正在进行升级,因此表可能还不存在,它将无法更改和删除)
  • 将现有列放置在一个列表中
    • beginTransaction
    • run表和新表(最新的表创建模式)
    • 与新列的交集,这一次,从升级的表(columns.retainAll(DBUtils.GetColumns(db, TableName));)
    • restore data (String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName)); )
    • 中获取的列删除了备份表(DROP table 'temp_" + TableName)
    • setTransactionSuccessful

(这不处理表降级,如果你重命名一个列,你不会得到现有的数据传输,因为列名不匹配)。

代码语言:javascript
复制
public static List<String> GetColumns(SQLiteDatabase db, String tableName) {
    List<String> ar = null;
    Cursor c = null;
    try {
        c = db.rawQuery("select * from " + tableName + " limit 1", null);
        if (c != null) {
            ar = new ArrayList<String>(Arrays.asList(c.getColumnNames()));
        }
    } catch (Exception e) {
        Log.v(tableName, e.getMessage(), e);
        e.printStackTrace();
    } finally {
        if (c != null)
            c.close();
    }
    return ar;
}

public static String join(List<String> list, String delim) {
    StringBuilder buf = new StringBuilder();
    int num = list.size();
    for (int i = 0; i < num; i++) {
        if (i != 0)
            buf.append(delim);
        buf.append((String) list.get(i));
    }
    return buf.toString();
}
票数 108
EN

Stack Overflow用户

发布于 2011-06-12 05:59:15

在Pentium10的优秀答案旁边,有一些来自活动代码的很好的例子:

记事本:com.android.providers.calendar.CalendarDatabaseHelper.java

  • OpenIntents

票数 38
EN

Stack Overflow用户

发布于 2011-12-23 11:28:13

感谢您澄清onUpgrade()不支持Remove/Drop语句@Pentium 10

对于那些想知道onUpgrade()被调用的确切时刻的人来说,它是在调用getReadableDatabase()或getWriteableDatabase()期间进行的。

对于那些不清楚如何确保它获得triggered...the的人来说,答案是:当提供给SqLiteOpenHelper的构造函数的数据库版本更新时,它就会触发。下面是一个例子

代码语言:javascript
复制
public class dbSchemaHelper extends SQLiteOpenHelper {

private String sql;
private final String D_TAG = "FundExpense";
//update this to get onUpgrade() method of sqliteopenhelper class called
static final int DB_VERSION = 2; 
static final String DB_NAME = "fundExpenseManager";

public dbSchemaHelper(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
    // TODO Auto-generated constructor stub
}

现在to...onUpgrade()

代码语言:javascript
复制
@Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
    sql = "ALTER TABLE " + fundExpenseSchema.Expense.TABLE_NAME + " ADD COLUMN " + fundExpenseSchema.Expense.FUNDID + " INTEGER";
    arg0.execSQL(sql);
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3505900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档