我正在尝试在我的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: \n");strBuff.append("\tID = " + result.getID() + "\n");Object o;o = result.get(KEY_DATE); strBuff.append("\tDate was retrIEved as : " + ((o == null)? "null" : o.getClass().getname()) + "\n");o = result.get(KEY_CALENDAR);strBuff.append("\tCalendar was retrIEved as : " + ((o == null)? "null" : o.getClass().getname()) + "\n");o = result.get(KEY_LONG);strBuff.append("\tLong was retrIEved as : " + ((o == null)? "null" : o.getClass().getname()) + "\n");o = result.get(KEY_INTEGER);strBuff.append("\tInteger was retrIEved as : " + ((o == null)? "null" : o.getClass().getname()) + "\n");o = result.get(KEY_BOolEAN);strBuff.append("\tBoolean was retrIEved as : " + ((o == null)? "null" : o.getClass().getname()) + "\n");mTvInfo.setText(strBuff);
我得到的结果是:
作为日期和日历插入的数据返回null.
作为Integer插入的数据返回BigDecimal.
数据作为Longreturns插入一个字符串.
我的问题是:我可以发送(并回读)除字符串以外的其他数据吗?如果是这样.怎么样?
解决方法:
经过一段时间的AndroID手机支持入门试验,我找到了一个链接到“一种”(非常有限的)文档:Mobile Backend Starter.
我发现如果你发送一个Integer(如果我信任de文档的float或Double),它将作为数字字段存储在DataStore中.当您发送查询时(通过Clouldquery),它将作为BigDecimal返回.
但是,如果您在CloudEntity中将Long作为属性传递,它将作为String存储在DataStore中并返回.这并非易事,因为String字段对允许的比较有限制.
如果发送DateTime
,文档会告诉您将返回一个String,但不要告诉您它也将作为String存储在DataStore中.
这很重要,因为您无法与字符串进行所有比较.它只允许相等(和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进行比较.如果你很勇敢,你不能使用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}
不会给出任何错误,但不返回任何列表: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-01-01T01:00:00.000 01:00更新)
对不起我的错误(我的英语不好)我希望这可以帮助别人,至少可以节省他一些时间.
总结以上是内存溢出为你收集整理的android – 使用移动后端启动程序从数据存储区发送和撤回数据全部内容,希望文章能够帮你解决android – 使用移动后端启动程序从数据存储区发送和撤回数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)