我正在构建一个Android应用程序,该应用程序在sqlite数据库中内部存储数据。我们在代码中使用了 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。(除非有一些优化有助于加快速度(
任何输入/评论。
提前谢谢。 安 迪
您可以使用查询功能执行此操作。
例如,要获取所有 IDA_
您可以使用如下选择器:
{"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
是从DocumentStore.query()
获得的Query
对象
我不太确定您的描述,但此外,如果您只想将具有特定前缀的文档子集复制到设备,则可以在构建拉取复制时使用上面显示的 JSON 选择器的字符串形式作为选择器方法的参数。