2016-07-14 48 views
1

我想访问共享首选项静态方式,以避免使用过多的代码,但是当我阅读共享首选项,看起来像没有保存静态方法“setSyncDBIsNeeded()”,我做错了什么?为什么静态共享首选项未保存?

所有MyApplication代码:

public class MyApplication extends Application { 
    private static MyApplication instance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
     RealmConfiguration realmConfiguration = new RealmConfiguration.Builder(this) 
       .name(Realm.DEFAULT_REALM_NAME) 
       .schemaVersion(0) 
       .deleteRealmIfMigrationNeeded() 
       .build(); 
     Realm.setDefaultConfiguration(realmConfiguration); 

    } 

    public static Context getContext() { 
     return instance.getApplicationContext(); 
    } 
} 

我的喜好的活动:

public class PreferenceController { 
    SharedPreferences sharedPreferences; 
    private static String project = "com.example.myproject"; 

    public PreferenceController() { 
     sharedPreferences = MyApplication.getContext().getSharedPreferences(project, Context.MODE_PRIVATE); 
    } 

    public PreferenceController(Context context) { 
     sharedPreferences = context.getSharedPreferences(project, Context.MODE_PRIVATE); 
    } 

    /* getters and setters */ 

    // Static methods 

    public static void setSyncDBIsNeeded(boolean value) { 
     Log.d("PREFCON","Setted DBSyncNeeded : "+value); 
     getSharedPrefferences().edit().putBoolean("DBSyncNeeded", value); 
    } 

    public static boolean getSyncDBIsNeeded() { 
     Log.d("PREFCON","DBSyncNeeded: "+getSharedPrefferences().getBoolean("DBSyncNeeded", false)); 
     return getSharedPrefferences().getBoolean("DBSyncNeeded", false); 
    } 

    private static SharedPreferences getSharedPrefferences() { 
     return MyApplication.getContext().getSharedPreferences(project, Context.MODE_PRIVATE); 
    } 
} 

然后在另一个类我做的:

PreferenceController.setSyncDBIsNeeded(true); 
PreferenceController.getSyncDBIsNeeded(); 

其印在日志:

07-14 14:24:04.665 27658-27658/com.example.myproject D/PREFCON: Setted DBSyncNeeded : true 
07-14 14:24:04.665 27658-27658/com.example.myproject D/PREFCON: DBSyncNeeded: false 
+3

设置该值后,您忘记调用commit()。尝试'getSharedPrefferences()。edit()。putBoolean(“DBSyncNeeded”,value).commit();' – Rashin

+1

调用“commit()”工作;) – MikeOx

回答

2

试试这个:

SharedPreferences.Editor editor = getSharedPrefferences().edit(); 
editor.putBoolean("DBSyncNeeded", value); 
editor.commit(); 

你要记得更新到SharedPreferences所做的更改,所以实际上SharedPreferences保存它。

插入到您的代码:

public static void setSyncDBIsNeeded(boolean value) { 
    Log.d("PREFCON","Setted DBSyncNeeded : "+value); 
    SharedPreferences.Editor editor = getSharedPrefferences().edit(); 
    editor.putBoolean("DBSyncNeeded", value); 
    boolean completed = editor.commit(); 
    Log.e("PREFCON", "Updating SharedPreferences was " + completed + "!"; 
} 

通过添加一个布尔值设置为editor.commit你可以很容易地知道,如果它是成功与否。根据documentation,commit()方法根据是否完成,返回一个布尔值。 True表示编辑成功,而false表示出错。

+0

您的努力延长答案是赞赏,我不知道这访问共享偏好的方式:) – MikeOx

+0

很高兴听到它工作:) – Zoe

2

您需要使用commitapply来实际执行请求。

提交你的喜好改变从这个EditorSharedPreferences对象是编辑。这自动执行 请求的修改,替换当前在 SharedPreferences中的任何内容。

public static void setSyncDBIsNeeded(boolean value) { 
    Log.d("PREFCON","Setted DBSyncNeeded : "+value); 
    getSharedPrefferences().edit().putBoolean("DBSyncNeeded", value).apply(); 
}