首页 > 解决方案 > 在 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。(除非有一些优化有助于加快速度)

任何输入/评论。

提前致谢。安迪

标签: androidsqlitecloudant

解决方案


您可以使用查询功能来做到这一点。

例如,要让所有 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 选择器的字符串形式作为选择器方法的参数建立你的拉式复制。


推荐阅读