2016-06-26 11 views
1

У меня есть андроид и веб-приложения. Android-приложение использует Couchbase Lite, веб-приложение использует Couchbase. Я использую Couchbase Sync Gateway, чтобы включить репликацию данных между этими двумя базами данных.Couchbase Lite отфильтрованная репликация pull

Когда пользователь впервые подключился к мобильному приложению, я хотел бы получить репликацию документа с данными этого конкретного пользователя (на основе имени пользователя). Я читал, что отфильтрованная репликация поддерживается Couchbase Lite (1), но я довольно запутан, какой метод мне следует использовать.

То, что я хочу сделать, это немного похоже на this, так что я думаю, что моя функция фильтра будет, как:

function (doc, req) { 
    if(doc.DocType && doc.DocType == "User" && doc.IsActive && doc.Login == req.query.text) 
     { return true } 
    else 
     {return false} 
} 

, но я не имею ни малейшего представления, где я должен создать эту функцию (в моем веб код приложения? Я нашел только DesignDocument.create(), но он вставляет только функции просмотра).

Я прочитал, что с SyncGateway я должен использовать каналы, но насколько я понимаю базу каналов на статическом свойстве документа, и мне нужно использовать имя пользователя в качестве динамического параметра.

Как я могу удалить реплицированный только этот конкретный документ?

Редактировать.

Так ранее мой SyncGateway конфигурации свойство синхронизации было как:

"sync":` 
      function (doc) { 
      channel (doc.channels); 
     }` 

и она работала нормально, без файлеры. Я включил его в:

"sync":` 
      function (doc, oldDoc) {     

       if(doc.DocType=="User" && doc.IsActive){ 
        channel(doc.Login); 
       } 
       else { 
        channel (doc.channels); 
       } 
     }` 

и мой метод Java является:

public void startFirstLoginReplication(String login, String password) throws CouchbaseLiteException{ 

    (...) 
    pull = DatabaseManager.getDatabaseInstance().createPullReplication(this.createSyncURL(false)); 

    List<String> channels = new ArrayList<String>(); 
    channels.add(login); 
    pull.setChannels(channels); 

    pull.setContinuous(false); 

    pull.start(); 

    progressDialog = showLoadingSpinner(); 

    pull.addChangeListener(this); 
} 

При нормальной репликации, когда он был обновлен метод changed() был назван. С фильтром это не так, ничего не тянет и не прогрессирует Dialog.

В SyncGateway консоли я получаю:

2016-06-27T23:45:46.081+02:00 HTTP: #003: GET  /kris_mobile_db/_local/01ef0a1ec2301f9f9f3bb2fae9d352d26fd4a9a7 
2016-06-27T23:45:46.094+02:00 HTTP: #003:  --> 404 missing (14.5 ms) 
2016-06-27T23:45:46.300+02:00 HTTP: #004: POST /kris_mobile_db/_changes 
2016-06-27T23:45:46.301+02:00 Changes: MultiChangesFeed({Mo}, {Since:0 Limit:0 Conflicts:true IncludeDocs:false Wait:false Continuous:false Terminator:0xc08245cba0 HeartbeatMs:300000 TimeoutMs:300000}) ... 
2016-06-27T23:45:46.301+02:00 Changes+: MultiChangesFeed: channels expand to channels.TimedSet{"Mo":0x1} ... 
2016-06-27T23:45:46.301+02:00 Changes+: MultiChangesFeed sending &{Seq:1 ID:_user/GUEST Deleted:false Removed:{} Doc:map[] Changes:[] Err:<nil> branched:false} 
2016-06-27T23:45:46.302+02:00 Changes: MultiChangesFeed done 

Что мне не хватает?

ответ

0

Отфильтрованные тиражирования с помощью шлюза синхронизации основаны на каналах (see the docs). Вы можете создать канал для каждого имени пользователя. Функция синхронизации может отобразить каждый документ на канал имени собственности Имя пользователя:

function (doc, oldDoc) { 
    channel(doc.username); 
} 

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

PS: Фильтрованные репликации pull с функцией фильтра не поддерживаются в Couchbase Sync Gateway.

+0

Привет @jamiltz! Я обновил свой вопрос и был бы признателен, если бы вы могли взглянуть на него. – Mohru

0

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

Помните, что при настройке каналов свойства это массив строк, не только один строкового

Смежные вопросы