对于测试,我们使用Google提供的LocalDatastoreHelper类启动云数据存储仿真器的本地实例。
令人感兴趣的是,我们可以使用代码插入数据,然后通过执行GQL查询再次查找数据。
SELECT [..] WHERE myfield = true
如果我们在谷歌云( Google )托管的“实时”商店中这样做的话。
但:
当我们对本地运行的仿真器运行相同的代码时,insert工作,但查询不起作用。findAll()工作正常,所以它看起来像插入和读取一般的工作,但是不知怎么的,索引丢失了吗?
在阅读了几个小时的文档后,我没有发现任何提示,为什么会发生这种情况。
有人能帮忙吗?
发布于 2017-04-21 15:26:17
为了不把别人和我原来的问题搞混,我回答自己,因为我们找到了问题的根源。
不幸的是,live和local之间的区别并不是由于数据存储端的行为不同,而是植根于我们的代码中。:-(
据我所见,我们以前关于没有生成索引的所有假设都是错误的。就此而言,当地人的行为就像现场直播一样。
谢谢你的贡献!
发布于 2017-04-21 13:17:24
最有可能的是,你遇到的是-最终的一致性。默认情况下,Datastore仿真程序模拟的一致性为0.9。注意,大多数查询最终都是一致的,除非WHERE子句是键,或者查询是祖先查询。我相信你只是幸运的是,“现场”商店正在返回的结果。如果在一天中的不同时间运行足够次数的测试,则可能不会返回结果(这完全取决于更新索引所需的时间和时间)。
也就是说,Datastore仿真程序有一个选项来指定它应该模拟的一致性级别。这可以通过以下命令来完成:
gcloud beta emulators datastore start --data-dir=/my/data/dir --host-port localhost:9999 --consistency 1.0一致性级别为1.0将保证一致的读取。我不确定是否有选项可以设置与LocalDatastoreHelper的一致性级别。
同样,除了我前面提到的少数例外情况之外,所有情况下“实时”数据存储最终都是一致的。
https://stackoverflow.com/questions/43541959
复制相似问题