Couchbase Lite复制中未触发更改的事件

问题描述 投票:0回答:1

正如标题所提到的,我正在尝试围绕自定义冲突解决引擎编写一些测试,但是在使沙发床复制发挥作用时遇到了一些麻烦。

[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的状态更改,然后评估是否它有新的记录。

这是我正在运行的测试的第一个也是最基本的,即使记录确实同步了。更改的事件未触发,因此我无法完成测试?异步while循环只是保持测试代码有效。我直接获得了不同的成功:

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

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

///CarryOnTest

但是,这不会带来重复的成功,而且很难看。有时调试器会无限旋转,而有时它会卡住并杀死VS2013。

我不相信我会丢失任何东西,但遗憾的是缺少CB文档...

c# xamarin couchbase couchbase-lite
1个回答
0
投票

尚不清楚如何将事件处理程序连接到“ Changed”事件。如果要用于分隔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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.