Parse中的objectId始终为NULL

时间:2015-12-24 22:31:11

标签: java android parse-platform

在我的活动中,我初始化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查询。

这里出了什么问题?我从各种示例中获取了代码,它应该可以工作。

3 个答案:

答案 0 :(得分:3)

问题是getString("objectId");。您不得实现默认的解析列getters/setters

您可以使用已在ParseObject中实现的getObjectId()来获取它。另外,要获得updatedAtcreatedAt和其他一些默认的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()。