在我的活动中,我初始化Parse service:
Parse.enableLocalDatastore(getApplicationContext());
ParseObject.registerSubclass(Person.class);
ParseObject.registerSubclass(Area.class);
Parse.initialize(this, "MY_APP_ID", "MY_CLIENT_KEY");
ParseUser.enableAutomaticUser();
ParseACL defaultACL = new ParseACL();
defaultACL.setPublicReadAccess(true);
ParseACL.setDefaultACL(defaultACL, true);
我有这个班级
@ParseClassName("Area")
public class Area extends ParseObject {
public static ParseQuery<Area> getQuery() {
return ParseQuery.getQuery(Area.class);
}
public String getObjectId() {
return getString("objectId");
}
public String getName() {
return getString("name");
}
public void setName(String name) {
put("name", name);
}
}
首先,我想从Parse服务中检索数据,如下所示
ParseQuery<Area> areaQuery = Area.getQuery();
areaQuery.findInBackground(new FindCallback<Area>() {
public void done(List<Area> areas, ParseException e) {
if (e == null) {
ParseObject.pinAllInBackground(areas,
new SaveCallback() {
public void done(ParseException e) {
//output errors
}
});
} else {
//output errors
}
}
});
但是ParseObjects没有objectId
后来我想从我的本地数据存储中检索数据
ParseQuery<Area> query = Area.getQuery();
query.orderByAscending("name");
query.fromLocalDatastore();
query.findInBackground(new FindCallback<Area>() {
public void done(List<Area> areaList, ParseException e) {
if (e != null) {
Log.d("area", "Error retrieving areas");
return;
}
for (Area a : areaList)
areaResults.add(a);
}
});
总是抛出ParseException
:
com.parse.ParseException:java.lang.IllegalStateException:ParseObject没有'objectId'的数据。调用fetchIfNeeded()来获取数据。
好吧,因为ParseObjects实际上没有objectId
。无论是在我的本地数据存储区还是直接从Parse查询。
这里出了什么问题?我从各种示例中获取了代码,它应该可以工作。
答案 0 :(得分:3)
问题是getString("objectId");
。您不得实现默认的解析列getters/setters
。
您可以使用已在ParseObject中实现的getObjectId()
来获取它。另外,要获得updatedAt
,createdAt
和其他一些默认的Parse列,您必须使用自己的Getters
,例如getUpdatedAt()
和getCreatedAt()
。
在下面,我删除了objectId
getter实现。您应该只实现自己的列字段。
@ParseClassName("Area")
public class Area extends ParseObject {
public static ParseQuery<Area> getQuery() {
return ParseQuery.getQuery(Area.class);
}
public String getName() {
return getString("name");
}
public void setName(String name) {
put("name", name);
}
}
答案 1 :(得分:2)
<强>更新强>
您已在子类中包含了objectId的getter。这已经可以从父类访问,不应该被覆盖。
旧答案
问题可能是本地数据存储区中的对象没有objectId ,直到它已远程保存到Parse。只有这样才能获得objectId。
您需要确保远程保存对象,或者在查询对象之前需要在本地固定对象。在固定的情况下,除非已远程保存,否则无法访问objectId。
答案 2 :(得分:0)
删除空构造函数或在其中调用super()。