1

私はアンドロイドとウェブアプリを持っています。Android アプリは Couchbase Lite を使用し、Web アプリは Couchbase を使用します。私は Couchbase Sync Gateway を使用して、これら 2 つのデータベース間のデータ複製を有効にしています。

ユーザーが初めてモバイル アプリにログインするときに、この特定のユーザーに関するデータ (ユーザー名に基づく) を使用してドキュメントを複製したいと考えています。Couchbase Lite (1)でフィルタリングされたレプリケーションがサポートされていることを読みましたが、どの方法を使用すればよいか非常に混乱しています。

私がやりたいことはこれに少し似ているので、フィルター関数は次のようになると思います。

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

しかし、この関数をどこに作成すればよいかわかりません(私のWebアプリコードで?私は見つけまし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()が呼び出されました。フィルターではなく、何も引っ張られず、progressDialog がスタックします。

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

私は何が欠けていますか?

4

2 に答える 2

0

同期ゲートウェイを使用したフィルタリングされたプル レプリケーションは、チャネルに基づいています (ドキュメントを参照してください)。ユーザー名ごとにチャネルを作成できます。同期関数は、各ドキュメントをユーザー名プロパティにちなんで名付けられたチャネルにマップできます。

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

Sync Gateway で各ユーザーのチャネルを作成できます。作成できるチャネルの数や、1 つのチャネルに含めることができるドキュメントの数に制限はありません。

PS: Couchbase Sync Gateway では、フィルター機能を使用したフィルター付きプル レプリケーションはサポートされていません。

于 2016-06-27T12:12:06.430 に答える
0

この使用例ではチャネルを使用する必要があります。ドキュメントごとに名前付きのプロパティを指定channelsし、チャネルはすべてのユーザーに対して一意である必要があります。これで、ドキュメントをプルするときに、どのチャネルからプルするかを同期ゲートウェイに伝えることができます。したがって、基本的には異なるチャネルからプルできます(動的プル)。

channels プロパティを設定するときは、1 つの文字列だけでなく、文字列の配列であることを覚えておいてください

于 2016-06-27T14:07:54.713 に答える