使用移动后端启动器从数据存储区发送和检索数据

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);

我得到的结果是:

作为DateCalendar插入的数据返回null

作为Integer插入的数据返回BigDecimal

作为Long插入的数据返回String

我的问题是:我是否可以发送(和读回)除`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_ATCloudEntity.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以来更新的所有实体)

为我的错误道歉(我的英语不好),我希望这能帮助某人,至少为他节省一些时间。

这篇关于使用移动后端启动器从数据存储区发送和检索数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:使用移动后端启动器从数据存储区发送和检索数据

基础教程推荐