我使用Parse.com将10个不同的布尔存储到云中,我遇到的问题是,如果用户更改了一个布尔值并保存,则所有其余的都没有设置保存之前未使用新的objectID定义。我只是想更新Object的一个值,而不是重写并使用新的objectID等创建一个全新的行。
我想到的工作流程是: 1.用户更改了一些设置,为"设置"中的布尔值提供了一些新值。的parseObject:
prefs.put("audio", true);
prefs.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
preferences.putBoolean("audioLocal", true);
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
preferences.flush();
setScreen(new MainScreen(main));
}
});
} else {
utils.toast_error("Failed, something went wrong.");
}
}
});
如上所示,它保存在背景中。
在我的主要课程的创建方法中,我获取所有数据并将其应用于本地首选项。
prefs = new ParseObject("Preferences");
if(ParseUser.getCurrentUser() != null){
prefs.setACL(new ParseACL(ParseUser.getCurrentUser()));
}
query.getInBackground(prefs.getObjectId(), new GetCallback<ParseObject>() {
@Override
public void done(ParseObject parseObject, ParseException e) {
if(e == null){
if(parseObject.getBoolean("audio")){
preferences.putBoolean("audioLocal", true);
}
preferences.flush();
}else{
utils.toast_error("Check your internet connection");
}
}
});
我注意到这个问题是当我卸载我的应用程序时导致所有本地首选项消失,包括持有objectID的那个。突然,我的testuser上传的所有照片,设置都浪费了。所有设置都恢复为默认值,无论我放在哪里,我的查询都无法识别objectID。
答案 0 :(得分:1)
根据我收集的内容,您尝试在ParseUser对象中存储用户首选项,以跟踪用户为其应用设置选择保存的内容。
您有多种选择:
JSON是一种以键/值格式存储数据的简单方法。让我们通过一个对象轻松跟踪一个地方的所有设置。然后,您可以将对象存储为ParseUser的字段,并在用户进行更改时保存/更新它。
初始化首选项的示例:
JSONObject newUserPrefs = new JSONObject();
newUserPrefs.put("audio", true);
newUserPrefs.put("anotherBoolean", false);
ParseUser user = ParseUser.getCurrentUser();
user.put("prefs", newUserPrefs);
user.saveInBackground(); //Not shown here but I suggest using SaveCallback
获取首选项的示例:
ParseUser user = ParseUser.getCurrentUser();
JSONObject userPrefs = user.getJSONObject("prefs");
if(userPrefs.optBoolean("audio", false)){
preferences.putBoolean("audioLocal", true);
}
//do more stuff here with other values!
此处的优点是您只需查询数据库中的ParseUser即可立即访问用户的首选项!无需额外查询。
稍后,您的偏好可能会变得更复杂(ParseFiles,其他ParseObjects等等),因此这可能是更高级的首选项的另一种选择。这里代替JSONObject,而是存储对ParseObject的引用。这将需要每次您需要访问它时查询,但提供更多的权力(而不仅仅是简单的类型!)。我建议继承这个对象并将其创建为一个简单的POJO:
@ParseClassName("UserPreferences")
public class UserPreferences extends ParseObject {
public ParseFile getBackground(){
return getParseFile("background.jpg");
}
public boolean getAudioStatus(){
return getBoolean("audio");
}
public void setAudioStatus(boolean status){
put("audio", status);
}
...
...
}
现在,当您创建此新对象类型的实例时:
UserPreferences userPrefs = new UserPreferences();
userPrefs.setAudioStatus(true);
//do more setters/getters maybe
ParseUser user = ParseUser.getCurrentUser();
user.put("prefs", userPrefs);
//may or may not be necessary, the user's save in background might capture this, but to be safe we save this object as well!
userPrefs.saveInBackground()
user.saveInBackground(); //again, use SaveCallback
检索它:
ParseUser user = ParseUser.getCurrentUser();
UserPreferences userPrefs = user.getParseObject("prefs");
userPrefs.fetchInBackground() //again, use a callback to ensure it's successful fetch
//do stuff with the userPrefs now that you fetched it, like setting local preferences!
注意:请参阅如何将ParseObject for User prefs存储为ParseUser的字段,并保存ParseUser。这会更新数据库以使对象存储所有用户首选项,类似于我们对JSONObject的处理方式。还要注意,当我们为UserPreferences获取ParseObject时,我们必须在引用它之后获取该对象。这是因为该对象仍然具有尚未被网络检索的数据,因为它不仅仅是一个简单的对象。
您面临的问题是您在本地首选项中存储首选项的objectID,这会破坏您尝试完成的目的!您希望存储对云上首选项对象的引用,以便每次从设备擦除应用程序或擦除数据时,您都可以恢复首选项,这意味着您需要将其存储在Parse云上。同时,您希望使用关联的ParseUser存储对首选项的引用,因此使用我提供的上述示例将其作为该解析用户的字段。我建议从一个简单的JSONObject开始,然后从那里开始