У меня есть андроид и веб-приложения. 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
Что мне не хватает?
Привет @jamiltz! Я обновил свой вопрос и был бы признателен, если бы вы могли взглянуть на него. – Mohru