1

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

ユーザーがモバイルアプリに初めてログインしたときに、この特定のユーザーのデータ(ユーザー名に基づいて)をレプリケートしたいと思います。フィルタリングされたレプリケーションは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()しか見つけられませんでしたが、View関数のみを挿入します)。

私はこれを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 

私は何をしないのですか?

答えて

0

同期ゲートウェイを使用したフィルタ付きプルレプリケーションは、チャネル(see the docs)に基づいています。各ユーザ名のチャンネルを作成することができます。同期機能では、各ドキュメントをusernameプロパティの名前の付いたチャネルにマップできます。

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

同期ゲートウェイで各ユーザーのチャネルを作成できます。いくつのチャネルを作成できるか、またはいくつのドキュメントに含めることができるかに制限はありません。

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

+0

こんにちは@jamiltzだけではなく、文字列の配列であることを!忘れないでください私は私の質問を更新し、あなたがそれを見てみることができれば感謝します。 – Mohru

0

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

チャンネルのプロパティを設定するとき、それは1つの文字列

関連する問題