2010-08-31 3 views
2

Je prévois d'écrire une version gratuite et une version complète d'un logiciel. Je souhaite que les informations stockées dans la version gratuite du logiciel soient également accessibles par la version complète (je ne souhaite pas utiliser Content Providers). Et je veux également m'assurer que ces données ne sont pas perdues lorsque le logiciel est mis à jour. Comment puis-je y parvenir?Conserver les informations persistantes sur différentes versions du logiciel

Répondre

2

Vous devez mettre en œuvre une méthode intelligente de mise à niveau pour vos aides sqlite.

Vous devez toujours disposer de la nouvelle requête de création de table et l'utiliser pour la mise à niveau et le transfert des données existantes. Remarque: les méthodes onUpgrade s'exécutent une fois pour votre objet d'assistance sqlite et vous devez gérer toutes les tables qu'il contient.

Alors ce qui est recommandé onUpgrade:

  • beginTransaction
  • exécuter une création de table avec if not exists (nous faisons une mise à niveau, de sorte que le tableau pourrait existe pas encore, il échouera aussi modifier et supprimer)
  • mettre dans une liste les colonnes existantes List<String> columns = DBUtils.GetColumns(db, TableName);
  • table de sauvegarde (ALTER table " + TableName + " RENAME TO 'temp_" + TableName)
  • créer un nouveau tableau (le plus récent tableau de schéma de création)
  • obtenir l'intersection avec les nouvelles colonnes, ces colonnes de temps pris de la table mis à jour (columns.retainAll(DBUtils.GetColumns(db, TableName));)
  • restaurer les données (String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName)); )
  • supprimer table de sauvegarde (DROP table 'temp_" + TableName)
  • setTransactionSuccessful

(Cela ne gère pas downgrade de table, si vous renommez une colonne, vous ne recevez pas les données existantes transférées que les noms ne correspondent pas à la colonne).

.

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

Je vais essayer cela et vous reviendrai @ Pentium10. Merci! –

+0

A travaillé pour moi @ Pentium10 –

Questions connexes