Android 保留软件不同版本的永久性信息

Android 保留软件不同版本的永久性信息,android,Android,我计划写一个免费版本和一个完整版本的软件。我希望该软件的免费版本存储的信息也能被完整版本访问(我不想使用内容提供商)。我还想确保软件更新时这些数据不会丢失。如何实现这一点?您需要为您的sqlite助手实现一种智能的onUpgrade方法 您应该随时准备新的表创建查询,并将其用于升级和传输任何现有数据。注意:onUpgrade方法对sqlite助手对象运行一次,您需要处理其中的所有表 那么建议升级什么: 开始换药 如果不存在,则使用运行表创建(我们正在进行升级,因此表可能还不存在,它将失败并删除

我计划写一个免费版本和一个完整版本的软件。我希望该软件的免费版本存储的信息也能被完整版本访问(我不想使用内容提供商)。我还想确保软件更新时这些数据不会丢失。如何实现这一点?

您需要为您的sqlite助手实现一种智能的onUpgrade方法

您应该随时准备新的表创建查询,并将其用于升级和传输任何现有数据。注意:onUpgrade方法对sqlite助手对象运行一次,您需要处理其中的所有表

那么建议升级什么:

  • 开始换药
  • 如果不存在,则使用
    运行表创建(我们正在进行升级,因此表可能还不存在,它将失败并删除)
  • 将现有列放入列表
    list columns=DBUtils.GetColumns(db,TableName)
  • 备份表(
    ALTER table“+TableName+”重命名为'temp_uU8;”+TableName
  • 创建新表(最新的表创建架构)
  • 获取与新列的交集,这次是从升级的表中获取的列(
    columns.retainal(DBUtils.GetColumns(db,TableName));
  • 还原数据(
    stringcols=StringUtils.join(columns,”);
    db.execSQL(String.format(
    “插入到%s(%s)从%s中选择%s”,
    TableName,cols,cols,TableName));
    
  • 删除备份表(
    删除表“temp”+TableName
  • setTransactionSuccessful
(这不会处理表降级,如果重命名列,则不会传输现有数据,因为列名不匹配)

publicstaticlist GetColumns(SQLiteDatabase db,stringtablename){
列表ar=null;
光标c=null;
试一试{
c=db.rawQuery(“从“+tableName+”limit 1”中选择*项,空);
如果(c!=null){
ar=newarraylist(Arrays.asList(c.getColumnNames());
}
}捕获(例外e){
Log.v(tableName,e.getMessage(),e);
e、 printStackTrace();
}最后{
如果(c!=null)
c、 close();
}
返回ar;
}
公共静态字符串联接(列表、字符串delim){
StringBuilder buf=新的StringBuilder();
int num=list.size();
for(int i=0;i
我会试试这个,然后返回给您@Pentium10。塔克斯!
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();
}