Sending and retrieving data from datastore with mobile backend starter(使用移动后端启动器从数据存储区发送和检索数据)
问题描述
我正尝试在我的Android应用程序中使用Mobile Backend Starter。为此,我需要在数据存储区中存储一些数据。
我正在使用提供的对象CloudEntity
,但我只能一致地插入和读取String
。
这是我用来发送数据的示例代码:
CloudEntity entity = new CloudEntity(TEST_KIND_NAME);
entity.put(KEY_DATE, new Date(System.currentTimeMillis()));
entity.put(KEY_CALENDAR, Calendar.getInstance());
entity.put(KEY_LONG, Long.valueOf(Long.MAX_VALUE));
entity.put(KEY_INTEGER, Integer.valueOf(Integer.MAX_VALUE));
getCloudBackend().insert(entity, simpleHandler);
我就是这样读回数据的(下一段代码放在CloudBackendHandler
中的onComplete
中:
StringBuffer strBuff = new StringBuffer();
strBuff.append("Inserted:
");
strBuff.append(" Id = " + result.getId() + "
");
Object o;
o = result.get(KEY_DATE);
strBuff.append(" Date was retrieved as : " + ((o == null)? "null" : o.getClass().getName()) + "
");
o = result.get(KEY_CALENDAR);
strBuff.append(" Calendar was retrieved as : " + ((o == null)? "null" : o.getClass().getName()) + "
");
o = result.get(KEY_LONG);
strBuff.append(" Long was retrieved as : " + ((o == null)? "null" : o.getClass().getName()) + "
");
o = result.get(KEY_INTEGER);
strBuff.append(" Integer was retrieved as : " + ((o == null)? "null" : o.getClass().getName()) + "
");
o = result.get(KEY_BOOLEAN);
strBuff.append(" Boolean was retrieved as : " + ((o == null)? "null" : o.getClass().getName()) + "
");
mTvInfo.setText(strBuff);
我得到的结果是:
作为Date
和Calendar
插入的数据返回null
。
作为Integer
插入的数据返回BigDecimal
。
作为Long
插入的数据返回String
。
推荐答案
在试用Android Mobile支持的入门程序一段时间后,我发现一个指向"某种"(非常有限)文档的链接:Mobile Backend Starter。
我发现,如果您发送Integer
(如果我信任de Documentation aFloat
或aDouble
),它将作为数字字段存储在数据存储中。并在您发送查询(通过ClouldQuery
)时作为BigDecimal
返回。
不过,如果您在CloudEntity
中将Long
作为属性传递,它将作为String
存储在数据存储中并按此返回。这很重要,因为String
字段对允许的比较有限制。
如果您发送DateTime
,文档会告诉您将收到String
,但不会告诉您它也将作为String
存储在数据存储中。
String
进行所有比较。它只允许相等(和ne)比较(您不能在查询中对String
属性测试大于过滤的值)。因此,您不能将时间戳存储为Long
(将转换为String
,您将无法对它们进行比较),也不能出于同样的原因将时间戳设置为DateTime
。并且您无法存储Date或Calendar对象。
无论如何,每个CloudEntity
默认有两个DateTime
属性CloudEntity.PROP_CREATED_AT
和CloudEntity.PROP_UPDATED_AT
。您可以使用此字段设置查询过滤。为此,您需要将过滤设置为
CloudQuery myQuery = new CloudQuery(<your kind name>);
myQuery.set<things>...
DateTime dateTime = new DateTime(<the time you want>);
myQuery.setFilter(F.gt(CloudEntity.PROP_UPDATED_AT, dateTime));
您需要使用DateTime
进行比较。如果您很贪婪,则可以not使用Date
代替DateTime
进行此比较。您将收到此错误:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
"code": 400,
"errors": [
{
"domain": "global",
"message": "java.lang.IllegalArgumentException: _updatedAt:java.util.LinkedHashMap is not a supported property type.",
"reason": "badRequest"
}
],
"message": "java.lang.IllegalArgumentException: _updatedAt: java.util.LinkedHashMap is not a supported property type."
...
另外奇怪的是,您不能与dateTime = new DateTime(0)
(即1970-01-01T01:00:00.000+01:00)进行比较,因为后端收到的查询是:
query: (_kindName:"Data") AND ( _updatedAt > "1970-01-01T01:00:00.000+01:00" ), schema: {_kindName=STRING, _updatedAt=STRING}
不会给出任何错误,但不会返回任何list: result: null
。看起来它将比较视为String
。如果您改用DateTime dateTime = new DateTime(1)
,您将以以下方式发送查询:
list: executing query: {filterDto={operator=GT, values=[_updatedAt, 1970-01-01T01:00:00.001+01:00]},
看起来与以前一样,但后端将执行查询,如下所示:
query: (_kindName:"Data") AND ( _updatedAt > 1 ), schema: {_kindName=STRING, _updatedAt=DOUBLE}
正如我看到的DOUBLE
,我尝试提交Double
而不是DateTime
,但不起作用(没有错误,但没有结果)。
但是,每个人都有好消息!我们可以使用Integer
进行比较,如下所示:
Integer anInteger = Integer.valueOf(0);
myQuery.setFilter(F.gt(CloudEntity.PROP_UPDATED_AT, anInteger));
后端看到:
query: (_kindName:"Data") AND ( _updatedAt > 0 ), schema: {_kindName=STRING, _updatedAt=INT32}
我们将得到期望值(1970年1月1日至01T01:00:00.000+01:00以来更新的所有实体)
为我的错误道歉(我的英语不好),我希望这能帮助某人,至少为他节省一些时间。
这篇关于使用移动后端启动器从数据存储区发送和检索数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用移动后端启动器从数据存储区发送和检索数据
基础教程推荐
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01