android - 在 cloudant DB (Android) 中按特定 ID(正则表达式)搜索
问题描述
我正在构建一个在内部将数据存储在 sqlite 数据库中的 Android 应用程序。我们在代码中使用 Cloudant 库。
我的数据库中有不同类型的数据 - 都有不同的 ID。例如:可以有 GUID 以 A、B、C、D 开头的数据。这意味着我们可以有 GUID,如 A_、B_ 等。
现在,我想获取 GUID 以 A_ 开头的所有数据库条目,并将它们本地存储在应用程序本身中以供进一步处理。但是,我只看到一个从数据库中获取所有 ID 的函数。所以,我正在做的是:
List<String> allID = db.getIds();
for (int i=0;i<allID.size();i++)
{
String guid = allID.get(i);
if (guid.startsWith("A_"))
{
//store and process this guid.
}
}
变量 db 是 cloudant 库中 DatabaseImpl.java 类的一个对象。
这绝对是好的,因为我们只获取和处理我们需要的数据库条目。但是,我不喜欢这种方法的是,我们实际上是在获取数据库中的所有 GUID,然后检查它们中的每一个。
我希望我们有一个功能可以让我们通过正则表达式搜索 ID。例如:像 -
List<String> aID = db.getIds("A_");
更重要的是,这会提高性能吗?我也怀疑在数据库内部,我们仍然需要读取所有 ID,然后获取我们想要的 ID。(除非有一些优化有助于加快速度)
任何输入/评论。
提前致谢。安迪
解决方案
您可以使用查询功能来做到这一点。
例如,要让所有 ID 开始,A_
您可以使用如下选择器:
{"selector":{"$and":[{"_id": {"$gte": "A_"}},{"_id": {"$lt": "A_\uffff"}}]}}
在 Cloudant 的 sync-android 中,这是:
Map<String, Object> idGt = Collections.singletonMap("_id", Collections.singletonMap("$gt", "A_"));
Map<String, Object> idLte = Collections.singletonMap("_id", Collections.singletonMap("$lte", "A_\uffff"));
Map<String, Object> query = Collections.singletonMap("$and", Arrays.asList(idGt, idLte));
QueryResult result = q.find(query);
for (DocumentRevision doc : result) {
// do something with doc
}
从哪里q
获得Query
对象DocumentStore.query()
从您的描述中我不太确定,但另外,如果您只想将具有特定前缀的文档子集复制到设备,您可以使用上面显示的 JSON 选择器的字符串形式作为选择器方法的参数建立你的拉式复制。
推荐阅读
- django - 显示来自多对多字段的所有数据
- elasticsearch - 计算每个桶的嵌套聚合百分比
- firebase - 无法将 NodeMCU 与 Firebase 连接,因为控制台显示设置/编号失败:每次
- c# - C#中的伪朋友类
- java - Groovy 如何使用正则表达式在地图中查找值
- python-3.x - Python - 使用 ON DUPLICATE KEY UPDATE 时出现“未知编码:utf8mb4”
- r - 制作一个矩阵,计算 1996 年评级为 i、1997 年评级为 j 和 1998 年评级为 k 的公司数量
- bash - 是否可以将不同的内容回显到在 bash 范围内创建的不同文件中 for 循环?
- c# - CancellationToken 甚至为空
- c++14 - 构建段树时的垃圾值