【问题标题】:objectId in Parse is always NULLParse 中的 objectId 始终为 NULL
【发布时间】:2015-12-24 22:31:11
【问题描述】:

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

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

【问题讨论】:

  • 我的本地数据存储中没有数据。你必须从服务器获取数据
  • 有数据。如果我不registerSubclass 我可以得到我的问题中描述的数据。
  • 先更改顺序initializeenableLocalDatastore
  • @kishorejethava:来自文档:要启用数据存储,请在调用 Parse.initialize() 之前在应用程序构造函数中调用 Parse.enableLocalDatastore() 否则会引发异常。
  • 您的 Area 对象是否有另一个 db 对象作为字段?

标签: java android parse-platform


【解决方案1】:

问题是getString("objectId");。您不能实现默认的 Parse Column 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);
    }
}

【讨论】:

    【解决方案2】:

    更新

    您在子类中包含了 objectId 的 getter。这已经可以从父类访问,不应被覆盖。

    旧答案

    问题可能是本地数据存储中的对象没有 objectId 直到它已远程保存到 Parse。只有这样它才会得到一个objectId。

    您需要确保您的对象已远程保存,或者您需要在查询对象之前在本地固定对象。在 pinning 的情况下,您无法访问 objectId,除非它也已远程保存。

    【讨论】:

    • 一开始我在本地数据存储中没有任何数据。当点击同步并从云端请求数据时,objectIdnull。那不应该发生,对吧?我看了 100 遍我的代码,并将其与代码教程进行了比较。但我看不出有什么区别。
    • 为什么要在子类中包含 objectId 的 getter?这已经可以从父类访问,不应被覆盖。
    • 哇。就是这样。由于您是第一个注意到的,您可以更新您的帖子,我会接受它。
    【解决方案3】:

    删除您的空构造函数或在其中调用 super()。

    【讨论】:

    • 试过了。没有区别。
    • 尝试在自定义应用程序中解析初始化,然后重试。从我这边来看,一切都很好。或者您可以发布完整的源代码。
    • 在自定义应用程序中解析初始化。你这是什么意思?
    • 公共类 App 扩展应用程序 { @Override public void onCreate() { super.onCreate(); Parse.enableLocalDatastore(this); ParseObject.registerSubclass(Custom.class); Parse.initialize(this, APPLICATION_ID, CLIENT_KEY); } } 并在 AndroidManifest ...
    • 感谢您的提示。但没有改变任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多