Couchbase lite не тянет каналы через шлюз синхронизации

У меня проблема с получением данных через Sync Gateway channels.

Насколько я понимаю, channels это, по сути, форма тега, который позволяет вам помечать документ особым образом.

Что я пытаюсь сделать

Когда я закрываю приложение, удаляю локальную базу данных, а затем снова открываю приложение, я ожидаю, что все документы в channels, которые были настроены для извлечения, но вместо этого ничего не извлекается.

Настраивать

Я использую Couchbase Lite 1.4.0 и последнюю версию Sync_Gateway.

Файл конфигурации Sync Gateways, я использую функцию синхронизации по умолчанию:

{
    "databases": {
        "db": {
            "server": "http://127.0.0.1:8091",
            "username": "db",
            "password": "pass",
            "users":{
                "user1":{
                    "password":"pass"
                }
            }
        }
    }
}

Я получаю доступ к шлюзу синхронизации в Couchbase lite следующим образом:

private String[] docChannels = new String[]{
    "channel1",
    "channel2",
};
private String[] configChannels = new String[]{
    "config1",
    "config2",
};

URL url = null;
try {
    url = new URL("http://127.0.0.1:4984/db");
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }

Replication push = d.createPushReplication(url);
Replication pull = d.createPullReplication(url);
Replication pullConfig = d.createPullReplication(url);

pull.setChannels(Arrays.asList(docChannels));
pullConfig.setChannels(Arrays.asList(configChannels));

pullConfig.setContinuous(false);
pull.setContinuous(true);
push.setContinuous(true);

Authenticator auth = AuthenticatorFactory.createBasicAuthenticator("user1", "pass");
push.setAuthenticator(auth);
pull.setAuthenticator(auth);
pullConfig.setAuthenticator(auth);

push.start();

pullConfig.start();
pull.start();

Каждый раз, когда я создаю документ, я добавляю ключ channels со значением ["config1"].

Информация о синхронизации моего документа теперь выглядит так:

"_sync": {
    "rev": "1-87cdc8c1fd5e0e4ce1a0897cbd47aca1",
    "sequence": 4,
    "recent_sequences": [
      4
    ],
    "history": {
      "revs": [
        "1-87cdc8c1fd5e0e4ce1a0897cbd47aca1"
      ],
      "parents": [
        -1
      ],
      "channels": [
        [
          "config1"
        ]
      ]
    },
    "channels": {
      "config1": null
    },
    "time_saved": "2017-09-22T13:20:43.6061974-05:00"
  }

Я не уверен, что делаю здесь не так. Отправка на сервер Couchbase работает нормально, но моя загрузка - нет.

Спасибо.


person Hypnic Jerk    schedule 22.09.2017    source источник


Ответы (1)


Для синхронизации документа с другим устройством вошедшему в систему пользователю необходимо добавить канал документа в список каналов пользователя. В этом случае, добавив "admin_channels": ["config1"]

Итак, конфигурация шлюза синхронизации будет выглядеть так ...

{
    "databases": {
        "db": {
            "server": "http://127.0.0.1:8091",
            "username": "db",
            "password": "pass",
            "users":{
                "user1":{
                    "password":"pass",
                    "admin_channels": ["config1"]
                }
            }
        }
    }
}
person combinatorial    schedule 22.09.2017
comment
Насколько мне известно, если функция синхронизации не указана, по умолчанию используется значение по умолчанию, что вы и предложили. - person Hypnic Jerk; 23.09.2017
comment
Я не знал об этом. Вам также необходимо добавить каналы, которые вам нужно синхронизировать с пользователем. например admin_channels: [config1] для пользователя user1 - person combinatorial; 23.09.2017
comment
Что ж, это сработало. Похоже, я неправильно понял важный аспект, мне нужно будет прочитать об этом подробнее. Отредактируйте свой ответ, и я его приму - person Hypnic Jerk; 23.09.2017
comment
Хорошо, подойдет, вы подтвердили, что функция синхронизации по умолчанию такая же, как указано выше? Или вы это тоже изменили? - person combinatorial; 23.09.2017
comment
Это как указано выше. На основании документации developer.couchbase.com/documentation/mobile/current/guides/ применяет его, если он не предоставлен. - person Hypnic Jerk; 23.09.2017
comment
Это один из способов сделать это, но вы также можете использовать функцию access() внутри функции синхронизации, чтобы динамически предоставлять пользователям доступ. Если предполагается, что он будет постоянным, то проще всего будет использовать admin_channels. - person borrrden; 24.09.2017