Синхронизация и удаление удаленных документов из CouchDB и Couchbase-lite

В настоящее время я использую couchbase-lite в своем приложении для iOS и Android для синхронизации файлов из базы данных, в которой работает CouchDB.

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

Есть ли способ удалить из мобильного приложения документы, которых больше нет в БД сервера, без полной очистки мобильного приложения и последующей повторной синхронизации всей базы данных?


person Anthony Taylor    schedule 17.06.2018    source источник
comment
Вы удаляете их на стороне сервера или на мобильной стороне? Репликация также предназначена для извлечения удалений, но я не могу вспомнить, следует ли CouchDB правильной процедуре. Однако, если вы удалите их на мобильной стороне, удаления будут синхронизироваться с сервером.   -  person borrrden    schedule 18.06.2018
comment
@borrrden Итак, это односторонняя репликация. Пользователь синхронизирует БД с телефоном и ничего не редактирует. Затем, когда я обновляю информацию (добавляю информацию и удаляю информацию), я хочу, чтобы эта удаленная информация также была удалена с телефона пользователя с указанием даты, поэтому она бесполезна по прошествии определенного времени. Но если я удаляю данные, когда приложение извлекает, оно сохраняет старую информацию после репликации по запросу.   -  person Anthony Taylor    schedule 18.06.2018
comment
Вы случайно не знаете, сохраняет ли CouchDB историю изменений нетронутой при ее удалении? Это будет отображаться как новая ревизия с флагом _deleted. Если вы просто удаляете значение с сервера, оно не реплицируется. Будут тиражироваться только «новые ревизии», что и является причиной этой так называемой «надгробной ревизии».   -  person borrrden    schedule 19.06.2018
comment
@borrrden Я не уверен, проверю и выясню. Насколько я понимаю, я перезаписываю только документы, что приводит к увеличению числа редакций. Я действительно хочу, чтобы мобильное приложение идеально синхронизировалось с сервером.   -  person Anthony Taylor    schedule 20.06.2018


Ответы (2)


Из класса базы данных есть метод purgeDocument(). Это удаляет целевой документ из локальной базы данных - серверные копии целевых документов остаются без изменений. Если позже документ будет обновлен, он вернется к локальному клиенту при следующей репликации.

http://docs.couchbase.com/mobile/2.1/couchbase-lite-swift/Classes/Database.html

person Ian Bradbury    schedule 20.11.2018

Вы можете удалять документы из базы данных на основе id следующим образом:

try {
        for (Result result : docList) {
            String id = result.getString(0);
            Document doc = database.getDocument(id);
            database.delete(doc);
        }
    } catch (CouchbaseLiteException e) {
        e.printStackTrace();
    } 

Чтобы получить идентификатор документа, вам нужно запросить что-то вроде этого:

Query query = QueryBuilder
    .select(SelectResult.expression(Meta.id), SelectResult.all())
    .from(DataSource.database(database))

ResultSet rs = query.execute();
    for (Result result : rs) {
        Dictionary data = result.getDictionary("db_name");
        Log.e("CouchbaseLite ", "document: " + data);
        Log.e("CouchbaseLite ", "id: " + result.getString(0));
    }
person uniruddh    schedule 03.03.2020