2017-06-23 26 views
1

私のアプリはユーザーの入力からデータを集めてSQLiteデータベースに保存するという奇妙な問題に直面しています。また、サービスを常時実行している(START_STICKY)ので、30分ごとにユーザーからの新しい更新がSQLite DBで確認されます。追加された新しいレコードがある場合は、AsyncTaskを使用してデータをアップロードして自分のサーバーに送信します。すでにアップロードされたレコードを追跡するために、私はSharedPreferencesにint値を格納します。したがって、これは0の値から始まり、アップロードごとに私のSQLite DBの最後のインデックスを取得し、SharedPreferencesに保存します。アプリケーションを起動した後、サーバーに10個のレコードを送信した場合、SharedPreferencesに「10」を保存し、次回の更新で(30分後)、インデックスが10を超えるすべてのレコードを選択します。SharedPreferencesの問題 - 最後に保存された値が失われる

すべて動作しますしかし、おそらくAndroidがおそらくメモリ最適化のために私のサービスを殺してしまい、その後サービスが再起動(START_STICKY)し、アプリが引き続き動作します。このシナリオでのみ、SharedPreferencesで最後に保存された値が失われています。この値を参照として選択してサーバーにアップロードするので、アプリが重複した情報を送信しています... 最終的なものがファイルに直接情報を保存するが問題は解決されないので、SharedPreferencesのint値を "apply()"メソッドから "commit()"に保存する方法。

この問題や他のアプローチに対処する方法については、歓迎します。

マイSharedPreferencesクラスには、次のようになります。

:これは私のサービス内で実行されます私のAsyncTaskの一例である

MySharedPreferences mySharedPref = new MySharedPreferences(context); 

public class MySharedPreferences { 
    private SharedPreferences sharedPref; 

    public MySharedPreferences(Context context) { 
     sharedPref = context.getSharedPreferences("com.mypackage", Context.MODE_PRIVATE); 
    } 

    public void setIndex(int n) { 
     //sharedPref.edit().putInt("index", n).apply(); 
     SharedPreferences.Editor editor = sharedPref.edit(); 
     editor.putInt("index", n); 
     editor.commit(); 
    } 

    public int getIndex() { 
     return sharedPref.getInt("index", 0); 
    } 
} 

マイSharedPreferencesは、サービスのonCreateメソッドにistantiatedされるオブジェクト

private class UpdateData extends AsyncTask<String, Void, Void> { 
    @Override 
    protected Void doInBackground(String... strings) { 
     try { 
      String response = utils.postDataHttps("https://my_url.com", params); 
      if (response.equals("OK")) { 
       // Access SQLite DB and select last index 
       // by using this query: SELECT id FROM my_table ORDER BY id DESC LIMIT 1; 
       int lastIndex = myDb.getLastIndex(); 
       // Set last index on SharedPreferences: 
       mySharedPref.setIndex(lastIndex); 
      } 
     } catch (Exception e) { 
      Log.e(LOG_TAG, "UpdateData.doInBackground() - Exception: " + e.getMessage() + "\n" + Log.getStackTraceString(e)); 
     } 
     return null; 
    } 
} 

ありがとうございます!

答えて

0

私はこのポストを見つけました:User settings saved in SharedPreferences removed or lost between reloads of app他のオプションは私のためには機能しませんでしたので、私はint値を表すレコードを1つだけ持っているテーブルを作成してSQLite DBに参照変数を移動しました。ストアする必要があります。だから、私のアプリケーションの最初の実行では、テーブルにレコードがなく、サーバーに送信された後に、私はINSERTステートメントを使ってテーブルの最初の行に最後のインデックスを格納すると0を返します。 30分ごとに、この行に格納されている値をチェックして、サーバーに送信する必要がある更新を決定し、アップロードされたデータが正常に終了したら、UPDATEステートメントを使用してint変数参照に最後のインデックスを再度格納します。

これは最もスマートな解決策ではないかもしれませんが、魅力的なように機能しています。

1

あなたはondestroyの後にsharedpreferenceデータを消去していませんか?

アクティビティのコンテキストの代わりに、アプリケーションのコンテキストを使用してください。

+0

私は値をクリーニングしていないと確信しています。私はちょうど前回更新された値がまだそこにある、再起動後に最後の更新を失っています、値は決してゼロです。とにかくありがとう! – SkynetAdmin

+0

最後に更新されたのはあなたですか?データベースかSPか? – diegoveloper

+0

SharedPreferencesで最後に更新された内容が失われています。サーバーへの各更新時に、まずSharedPreferencesの値をチェックして、保存した最後のインデックスを確認します。これはサーバーに送信したSQLite DBの最後のレコードを表しているためです。 – SkynetAdmin

0

ApplicationまたはMultiDexApplicationクラスに保存します。あなたのServiceが再作成されたときのように、 'SharedPreference is being reset but I am not 100% sure if that is the issue. But if you keep you value as mentioned above, the value will not set to 0 unintentionally. Since Application or MultiDexApplication`クラスはあなたのアンドロイドアプリがアプリにインストールされている限り生きています。

+0

あなたのご意見ありがとうございますが、私はこれが良い解決策ではないことに敬意を表します。私のSharedPreferenceの値が0にリセットされていない、以前に保存された値がそこにあり、サービスの再起動時に最後の更新が失われるだけです。 – SkynetAdmin

関連する問題