代码之家  ›  专栏  ›  技术社区  ›  Stelios Papamichail

应用程序更新从内部存储中删除旧的共享首选项数据

  •  1
  • Stelios Papamichail  · 技术社区  · 6 年前

    我注意到,当我对我的应用程序进行更新并由用户安装时,所有的数据都会丢失。我尝试通过使用共享prefs保存应用程序的当前版本代码来检索它,然后将其与当前版本代码进行比较,以便知道它何时是应用程序更新,然后调用Read&写数据方法来检索旧数据,但是运气不好。 关于我应该如何处理这个问题有什么想法吗?

    序列化glb.java:

    public class SerializeGLBData {
    
    /**
     * Writes the Global User Box's cardList to the user's internal storage using the Gson
     * library so that the user doesn't lose his/her data.
     * @param cardList The list to write to the internal storage
     * @param context Getting the app's current context
     */
    public static void Write(ArrayList<Card> cardList, Context context) {
    
        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = appPrefs.edit();
        Gson gson = new Gson();
        String cardsGLBJson = gson.toJson(cardList);
        editor.putString("cardsGLB",cardsGLBJson);
        editor.apply();
        editor.commit();
        Log.d("WriteData","Data written successfully!");
    }
    
    /**
     * Reads the cards list that gets saved when the app closes
     * @param context Get the app's current context
     * @return Returns an ArrayList of Card Objects containing the card info
     */
    public static ArrayList<Card> ReadCards(Context context) {
        SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(context);
        Gson gson = new Gson();
        String cardsGLBJson = appPrefs.getString("cardsGLB","");
        Type type = new TypeToken<ArrayList<Card>>(){}.getType();
        return gson.fromJson(cardsGLBJson,type);
    }
    

    }

     private void checkForFirstRun() {
    
        final String PREF_VERSION_CODE_KEY = "version_code";
        final int DOESNT_EXIST = -1;
    
        // Get current version code
        int currentVersionCode = BuildConfig.VERSION_CODE;
    
        // Get saved version code
        SharedPreferences prefs = getSharedPreferences(PREFS_NAME,MODE_PRIVATE);
        int savedVersionCode = prefs.getInt(PREF_VERSION_CODE_KEY, DOESNT_EXIST);
    
        // Check for first run or upgrade
        if(currentVersionCode == savedVersionCode) {
            // This is just a normal run
            Log.d("RUN_TYPE:" , "Normal Run");
        } else if(savedVersionCode == DOESNT_EXIST) { // This is a new install(or the user cleared the shared prefs)
            CallWriteDataMethods(this);
            Log.d("RUN_TYPE:", "New Install");
            // Showing the tutorial page when the app starts for the first time
            Intent tutorialIntent = new Intent(this, Tutorial.class);
            startActivity(tutorialIntent);
            UsernameDialog dialog = new UsernameDialog();
            dialog.setCancelable(false);
            dialog.show(getFragmentManager(),"USERNAME_DIALOG");
        } else if(currentVersionCode > savedVersionCode) { // This is an upgrade
            CallWriteDataMethods(this);
            Log.d("RUN_TYPE:","Update");
        }
    
        // Update the shared prefs with the current version code
        prefs.edit().putInt(PREF_VERSION_CODE_KEY,currentVersionCode).apply();
        return;
    }
    
     public static void CallWriteDataMethods(Context context) {
        // Write all the -empty- data from GlobalDataHolder to the internal memory to avoid a first time read error
        SerializeGLBData.Write(GlobalDataHolder.cards,context);
        // Write all the -empty- data from JPDataHolder to the internal memory to avoid a first time read error
        SerializeJPData.Write(JPDataHolder.cards,context);
    }
    
     /**
     * Calls every available Read method to retrieve all available data from the GLB database
     */
    public static void callReadDataMethodsGLB(Context context) {
        GlobalDataHolder.cards = SerializeGLBData.ReadCards(context);
        Log.i("Read Methods[GLB]", "ReadMethods called!");
    }
    
    /**
     * Calls every available Read method to retrieve all available data from the JP database
     */
    public static void callReadDataMethodsJP(Context context) {
        JPDataHolder.cards = SerializeJPData.ReadCards(context);
        Log.i("Read Methods[JP]", "ReadMethods called!");
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Macmist    6 年前

    SerializeGLBData.Write函数是如何工作的?因为通过阅读您的代码,当您进行升级时,您仅直接调用CallWriteDataMethods,并根据其中的注释:

    您正在用空数据写入内存。写函数在将空数据放入数据之前是否检查数据是否存在?

    比如说

    if(!prefs.contains("your_data_key")) {
       // your code to add data
    }