2010-08-31 117 views
2

我打算編寫一個免費版本和完整版本的軟件。我希望軟件的免費版本存儲的信息也可以通過完整版訪問(我不想使用內容提供商)。而且我還想確保在軟件更新時這些數據不會丟失。我如何實現這一目標?在不同版本的軟件上保留持久信息

回答

2

你需要爲你的sqlite助手實現onUpgrade的智能方式。

您應始終擁有新的表創建查詢,並將其用於升級並傳輸任何現有數據。注意:onUpgrade方法爲sqlite幫助程序對象運行一次,並且需要處理其中的所有表。

所以建議採取什麼onUpgrade:

  • 的BeginTransaction
  • 運行與if not exists表生成(我們正在做的升級,因此該表可能還不存在,它將無法修改和刪除)
  • 放在一個列表中的現有列List<String> columns = DBUtils.GetColumns(db, TableName);
  • 備份表(ALTER table " + TableName + " RENAME TO 'temp_" + TableName
  • 創建新表(最新表創建模式)
  • 獲得與新列的交叉點,從升級後的表採取這一時間列(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
  • setTransactionSuccessful

(這不處理表降級,如果您重命名列,你沒有得到轉移作爲列名不匹配現有的數據)。

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(); 
} 
+0

我會試試這個並返回給你@Pentium10。感謝名單! – 2010-08-31 12:19:57

+0

在@ Pentium10上爲我工作 – 2010-09-08 07:54:31