Поиск по заданному c ID (регулярное выражение) в облачной БД (Android) - PullRequest
0 голосов
/ 17 января 2020

Я создаю Android приложение, которое внутренне хранит данные в sqlite DB. Мы используем библиотеку Cloudant в нашем коде.

У меня есть разные типы данных в нашей БД - все с разными идентификаторами. Пример: могут быть данные с GUID, начинающиеся с A, B, C, D. Это означает, что у нас могут быть GUID, такие как A_, B_ и т. Д.

Теперь я хочу получить все записи БД, чьи GUID начинается с A_ и хранится локально в самом приложении для дальнейшей обработки. Тем не менее, я вижу только функцию, чтобы получить все идентификаторы из БД. Итак, что я делаю, это:

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 является объектом класса DatabaseImpl. java из облачной библиотеки.

Это определенно хорошо, так как мы только получение и обработка записей БД, которые нам нужны. Однако что мне не нравится в этом подходе, так это то, что мы на самом деле получаем все GUID в БД и затем проверяем каждый из них.

Я надеялся, что у нас будет функция, которая позволит нам искать для идентификаторов с помощью регулярных выражений. Пример: что-то вроде -

List<String> aID = db.getIds("A_");

Что более важно, это улучшит производительность? Я подозреваю, что внутренне в БД нам также нужно будет прочитать все идентификаторы, а затем получить те, которые мы хотим. (Если нет какой-либо оптимизации, которая помогает ускорить это)

Любые материалы / комментарии.

Заранее спасибо. Andy

1 Ответ

0 голосов
/ 30 января 2020

Это можно сделать с помощью функции запроса .

Например, чтобы получить все идентификаторы, начиная с A_. Вы можете использовать селектор, например:

{"selector":{"$and":[{"_id": {"$gte": "A_"}},{"_id": {"$lt": "A_\uffff"}}]}}

В синтаксисе Cloudant c - 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()

Я не совсем уверен из вашего описания, но, кроме того, если вы хотите скопировать подмножество документов с префиксом c на устройство, вы можете использовать строковую форму JSON селектор, показанный выше в качестве аргумента для метода селектор при построении репликации по запросу.

...