2012-09-12 39 views
9

Tengo una aplicación en el mercado de Google Play. Por varias razones que no me molestaré en abordar, he cambiado el tipo de algunas de mis preferencias. Por ejemplo, un tipo de preferencia era un Entero y en la versión más reciente es ahora una Cadena. Me imagino que esto no es una buena práctica, pero lamentablemente tuve que hacerlo.¿Cómo borrar las viejas preferencias al actualizar la aplicación de Android?

Mi preocupación es que cuando alguien actualice la nueva versión, su aplicación se bloqueará a medida que los tipos de preferencias cambien. Por este motivo, me gustaría borrar las preferencias cada vez que se actualiza la aplicación (¡me doy cuenta de que no es ideal!)

¿Esto es posible?

Respuesta

14

La clase SharedPreferences.Editor tiene una función clear(), lo que elimina todas las preferencias almacenadas (después de commit()). Se puede crear un indicador booleano que indicará si es necesario de actualizado:

void updatePreferences() { 
    SharedPreferences prefs = ...; 
    if(prefs.getBoolean("update_required", true)) { 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.clear(); 

     /*....make the updates....*/ 

     editor.putBoolean("update_required", false) 
     editor.commit(); 
    } 
} 

Y después de que usted tenga que llamar a esto en su actividad principal (primera partida), antes de acceder a cualquier preferenes.

EDITAR

Para obtener la versión actual (La versionCode declarado en el manifiesto):

int version = 1; 
try { 
    version = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; 
} catch (NameNotFoundException e) { 
    e.printStackTrace(); 
} 

if(version > ...) { 
    //do something 
} 

EDITAR

Si desea hacer alguna operación de actualización, siempre que el la versión cambia, entonces puede hacer algo como esto:

void runUpdatesIfNecessary() { 
    int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; 
    SharedPreferences prefs = ...; 
    if (prefs.getInt("lastUpdate", 0) != versionCode) { 
     try { 
      runUpddates(); 

      // Commiting in the preferences, that the update was successful. 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putInt("lastUpdate", versionCode); 
      editor.commit(); 
     } catch(Throwable t) { 
      // update failed, or cancelled 
     } 
    } 
} 
+0

¿Se puede decir cuándo el usuario decide hacer una actualización en el mercado de Google Play? – Mel

+0

Eso es exactamente lo que hace este código: si la versión será la nueva, sabrá que el usuario decidió hacer una actualización – Phate

+0

No es una manera realmente bonita de hacer las cosas, pero también podría comenzar a almacenar la versión actual en el Preferencias compartidas, y cuando no coincide con la versión real de su aplicación (que se muestra arriba, cómo obtenerla), también puede hacer algo. –

1

También puede añadir el número de versión al obtener SharedPreferences como esto

context.getSharedPreferences("MyKey" + app_version_no, Context.MODE_PRIVATE); 

Así que si se actualiza la aplicación, el número de versión va a cambiar y que tendrá nuevo conjunto de preferencias.

+0

Esto daría como resultado una tienda de datos en constante crecimiento. – baash05

0

tienda código de la versión en SharedPreferences defecto y almacenar sus otras preferencias en la versión especificada de archivos, cuando el cambio de versión se puede encontrar el código de versión antigua y usted puede tener su archivo de preferencias de edad y actualizar la nueva versión de los datos antiguos

int versionCode=0,oldVersion; 
    try 
    { 
     versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode; 
    } 
    catch (PackageManager.NameNotFoundException e) 
    {} 
    SharedPreferences prefs =getSharedPreferences("MyPref" + versionCode, Context.MODE_PRIVATE); 
    SharedPreferences prefsDefault = PreferenceManager.getDefaultSharedPreferences(MainActivity.this); 


    oldVersion=prefsDefault.getInt("OldVersion",0); 


    if (oldVersion!=versionCode) 
    { 
     if (oldVersion>0) 
     { 
      // ToDo Update Preferences 
      String oldPrefsKey="MyPref" + oldVersion; 
      SharedPreferences oldPrefs =context.getSharedPreferences(oldPrefsKey, Context.MODE_PRIVATE); 
      SharedPreferences.Editor pEdit=prefs.edit(); 
      pEdit.putBoolean("clock24",oldPrefs.getBoolean("clock24",false)); 
      pEdit.putBoolean("show_clock",oldPrefs.getBoolean("show_clock",true)); 
      pEdit.commit(); 
      oldPrefs.edit().clear().commit(); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { 
       deleteSharedPreferences(oldPrefsKey); 
      } else { 
       try { 
        File oldFile=new File(getCacheDir().getParent() + "/shared_prefs/"+oldPrefsKey+".xml"); 
        oldFile.delete(); 
       } catch (Exception e) { 

       } 
      } 

     } 
     prefsDefault.edit().putInt("OldVersion",versionCode).commit(); 




    } 
0
final String PREFERENCE_NAME = "my_preference"; 

final String APP_VERSION_CODE = 6; /*change this each time you want to clear 
preference in updated app.*/ 

preferences = getSharedPreferences(PREFERENCE_NAME, MODE_PRIVATE); 

if (preferences.getInt(PREFERENCE_VERSION, 0) != APP_VERSION_CODE) { 
     preferences.edit().clear().apply(); 
     preferences.edit().putInt(PREFERENCE_VERSION, APP_VERSION_CODE).apply(); 
} 
Cuestiones relacionadas