私のアプリはユーザーの入力からデータを集めて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;
}
}
ありがとうございます!
私は値をクリーニングしていないと確信しています。私はちょうど前回更新された値がまだそこにある、再起動後に最後の更新を失っています、値は決してゼロです。とにかくありがとう! – SkynetAdmin
最後に更新されたのはあなたですか?データベースかSPか? – diegoveloper
SharedPreferencesで最後に更新された内容が失われています。サーバーへの各更新時に、まずSharedPreferencesの値をチェックして、保存した最後のインデックスを確認します。これはサーバーに送信したSQLite DBの最後のレコードを表しているためです。 – SkynetAdmin