我正在使用数据库做我的第一个应用程序,我在理解onUpgrade函数时遇到了一些问题。我的数据库有一个表,其中包含一个项目和一个收藏夹列,这样用户就可以收藏一个项目。我看到的大多数实现都只是删除表并重新构建它,但我不想这样做。我希望能够向表格中添加更多项目。
当应用程序通过android marketplace升级时,数据库是否知道其版本号?那么,我是否可以在代码中增加版本号,然后将其导出到市场,当用户第一次启动升级版本时,将调用onUpgrade?
如果是这种情况,我的onUpgrade将简单地从文件中拉出并将数据库项添加到。这是一种标准的处理方式,还是在Android中有更好的处理方式。我正试着尽可能地保持标准。
谢谢
发布于 2010-08-18 03:01:21
好吧,在遇到更大的问题之前,您应该知道SQLite在ALTER table命令上是有限的,它只允许add和rename不删除/删除,这是通过重新创建表来完成的。
您应该始终手头有新的表创建查询,并使用它来升级和传输任何现有数据。注意: onUpgrade方法为您的sqlite helper对象运行一个,您需要处理其中的所有表。
所以推荐什么: onUpgrade:
使用
columns.retainAll(DBUtils.GetColumns(db, TableName));)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)(这不处理表降级,如果你重命名一个列,你不会得到现有的数据传输,因为列名不匹配)。
。
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();
}发布于 2011-06-12 05:59:15
在Pentium10的优秀答案旁边,有一些来自活动代码的很好的例子:
记事本:com.android.providers.calendar.CalendarDatabaseHelper.java
发布于 2011-12-23 11:28:13
感谢您澄清onUpgrade()不支持Remove/Drop语句@Pentium 10
对于那些想知道onUpgrade()被调用的确切时刻的人来说,它是在调用getReadableDatabase()或getWriteableDatabase()期间进行的。
对于那些不清楚如何确保它获得triggered...the的人来说,答案是:当提供给SqLiteOpenHelper的构造函数的数据库版本更新时,它就会触发。下面是一个例子
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()
@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);
}https://stackoverflow.com/questions/3505900
复制相似问题