更改的事件未在Couchbase Lite Replication中触发

时间:2015-12-04 13:26:52

标签: c# xamarin couchdb couchbase couchbase-lite

正如标题所提到的那样,我试图围绕我的自定义冲突解决引擎编写一些测试,但是我在使用couchbase复制来玩球时遇到了一些麻烦。

[Test]
public async Task TestSyncReplicationAsync()
{
    bool replicationAttempted = false;
    bool replicationSuccess = false;
    _secondPull.Changed += (sender, e) =>
    {
        switch (e.Status)
        {
            case ReplicationStatus.Idle:
                replicationSuccess = CheckDocumentReplicatedToSecondDatabase();
                replicationAttempted = true;
                break;
            case ReplicationStatus.Active:
                var a = 1;
                break;
            case ReplicationStatus.Offline:
                var b = 2;
                break;
            case ReplicationStatus.Stopped:
                var c = 3;
                break;
            default:
                break;
        }
    };

    var freshDoc = _firstDb.GetDocument(_testRecordId);
    freshDoc.PutProperties(new Dictionary<string, object>() {
        {"name", "Phil"},
        {"age", "40"},
        {"type", "person"}
    });

    await Task.Run(() =>
    {
        while (!replicationAttempted)
        {
            Debug.WriteLine("Spinning waiting for pull");
        }
    });

    Assert.True(replicationSuccess, "Record was not replicated successfully");
}

复制有效,但我通过在一个模拟器中运行两个桶来重复同步,所以简单地说,在第一个存储桶中创建一个记录,等待第二个复制对象,_secondPull&#39 ; s状态改变,然后评估它是否获得新记录。

这是我正在运行的第一个也是最基本的测试,但即使记录确实同步。改变的事件没有解雇,因此我无法完成测试?异步while循环只是为了保持测试代码的活跃性。我直接获得了成功并取得了成功:

while(_firstPush.Status == ReplicationStatus.Active)
{
    //DoNothing
}

while(_secondPull.Status == ReplicationStatus.Active)
{
    //DoNothing
}

///CarryOnTest

然而,这并没有给予反复的成功,而且它很难受。有时调试器只是无限旋转,有时它只会卡住并杀死VS2013。

我不相信我遗漏了任何东西,但遗憾的是CB文件缺乏......

1 个答案:

答案 0 :(得分:0)

有点不清楚你是如何将你的事件处理程序连接到&#34;更改&#34;事件。如果您用来分隔Couchbase Lite实例,则需要确保订阅了适合更改的Couchbase Lite实例。

您可以共享订阅已更改事件的代码吗?

更新:这是一个代码片段,可以在同一个应用程序中将文档从一个CB Lite实例复制到另一个实例。在这种情况下是一个WPF应用程序。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Initialize();
    }

    private void Initialize()
    {
        var cb1 = Manager.SharedInstance.GetDatabase("cb1");
        cb1.Changed += Cb1_Changed;

        var cb2 = Manager.SharedInstance.GetDatabase("cb2");
        cb2.Changed += Cb2_Changed;

        string url = "http://try-cb.cloudapp.net:4984/sync_gateway/";
        var auth = new Couchbase.Lite.Auth.BasicAuthenticator("couchbase", "letmein");

        var push = cb1.CreatePushReplication(new Uri(url));
        push.Continuous = true;
        push.Authenticator = auth;
        push.Start();

        var pull = cb2.CreatePullReplication(new Uri(url));
        pull.Continuous = true;
        pull.Authenticator = auth;
        pull.Start();

    }

    private void Cb2_Changed(object sender, DatabaseChangeEventArgs e)
    {
        var cb2 = Manager.SharedInstance.GetDatabase("cb2");
        var docs = e.Changes
            .Select(id => cb2.GetDocument(id.DocumentId))
            .ToList();

        Debugger.Break();
    }

    private void Cb1_Changed(object sender, DatabaseChangeEventArgs e)
    {
    }

    private void button_Click(object sender, RoutedEventArgs e)
    {
        var cb1 = Manager.SharedInstance.GetDatabase("cb1");

        var doc = cb1.CreateDocument();
        var props = doc.UserProperties != null ? doc.Properties : new Dictionary<string, object>();
        props["doc"] = new
        {
            type = "test",
            guid = Guid.NewGuid().ToString()
        };

        doc.PutProperties(props);
    }
}