parse.com数据存储区不会固定多个未保存的对象

Tom*_*Tom 9 android parse-platform

在一个任务中,没有任何互联网连接,我正在创建一个ParseObject并引用另一个ParseObject和当前用户.然后我将其固定到本地数据存储区,以便稍后保存(这些类和数据存储区已正确初始化).

    final Rating rating = new Rating(substationObjectId, data);

    // inside constructor
    put(KEY_OTHER_OBJECT, OtherObject.createWithoutData(OtherObject.class, substationObjectId));
    put(KEY_USER, ParseUser.getCurrentUser());

    rating.pin("unsent");
Run Code Online (Sandbox Code Playgroud)

我通过快速查询来跟进此操作,以从该引脚获取所有评级.

final ParseQuery<Rating> queryUnsent = ParseQuery.getQuery(Rating.class);
queryUnsent.whereEqualTo(Rating.KEY_USER, ParseUser.getCurrentUser());
queryUnsent.fromPin("unsent");
final List<Rating> unsentRatings = queryUnsent.find();

Logger.d(LOG_TAG, "queryUnsent count = %d", unsentRatings.size());
for (Rating unsentRating: unsentRatings) {
    Logger.d(LOG_TAG, "\tdatastore for %s with objectId='%s'", unsentRating().getName(), unsentRating.getObjectId());
}
Run Code Online (Sandbox Code Playgroud)

问题:只有一个评级似乎固定.即使解析报告成功,也不会存储第二个评级.

对于'Albury'的评级的第一个固定(null objectId是正确的和预期的)在针对该引脚的后续get-all查询中产生这些:

queryUnsent count = 1
datastore for Albury with objectId='null'
Run Code Online (Sandbox Code Playgroud)

第二个'Arapuni':

queryUnsent count = 1
datastore for Albany with objectId='null'
Run Code Online (Sandbox Code Playgroud)

其他事情尝试过:

  • pinEventually( "未发送")
  • pin()没有标签
  • 之后立即保存()并丢弃连接异常
  • 从任何地方删除user = current user子句
  • 对数据存储区的一般查询作为一个整体确认根本没有存储其他对象

在上线并保存评级(给它一个objectId)后,新的离线评级将被正确固定,但问题会以第二个离线评级重复.

我觉得这是parse.com的Android SDK库的一个错误.看起来数据存储区正在对objectId强制执行唯一约束,但未保存的对象还没有objectId.

有没有其他人遇到这个问题,或者可以建议一个解决方案?

cYr*_*ten 3

这确实很奇怪。

正如我在评论中所写,我的问题主要涉及取消未保存的对象,因此我开始创建一个项目,该项目类似于我的应用程序中的某些行为,并可重现问题的演示。

Android Studio 项目可以在这里找到:https://www.dropbox.com/sh/6whcw0qa1wdmnl2/AAAeELECIxgDjfa5ICULn2Zya ?dl=0

关于该项目

我一直试图实现的想法是将任务(ParseObject)与日志条目(另一个 ParseObject)和 JSONArray 绑定在一个名为 TaskSummaryHolder 的对象中。

将这 3 个实体在本地绑定在一起,我可以将大量信息推送到 JSONArray 中,并且仅定期将信息从 JSONArray 推送到日志条目。

将它们绑定在一起的摘要对象永远不会在线存储。

该方案应该可以应用于一系列不同的任务,以便一个 TaskSummaryHolder 实例可以存储一段时间内发生的事件,而另一个实例则保留 GPS 条目等。

目前,我的内容与实时应用程序中的项目中显示的内容有些相似,但由于取消固定问题,我目前正在清除摘要而不是取消固定(删除列和固定)。

问题1取消固定

我的第一个观察是

ParseObject.unpinAllInBackground(TaskSummaryHolder.PIN)
Run Code Online (Sandbox Code Playgroud)

并不总是有效,而

ParseObject.unpinAllInBackground(TaskSummaryHolder.PIN, summaries)
Run Code Online (Sandbox Code Playgroud)

看起来更可靠。如果目标是从数据存储中清除 pin,则必须在取消固定之前进行查询,这有点奇怪。

问题2固定

令我惊讶的是,我遇到了你所描述的问题。在测试项目中,我在线获取两个任务并向每个任务添加一个 TaskSummaryHolder 实例。只有第一个实例被固定在本地。

受到您对问题的描述的启发,我尝试让它固定然后保存(参见 TaskSummaryHolder 第 114 行)。

在此之后,它起作用了,但从那时起就无法重现该问题了。即使在卸载和/或重新启动手机后,固定和取消固定都按预期运行。

如果您尝试运行该项目并看看它的行为方式,这可能会很有趣。