{"id":2902,"date":"2017-03-07T08:42:52","date_gmt":"2017-03-07T16:42:52","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2902"},"modified":"2025-06-13T20:09:45","modified_gmt":"2025-06-14T03:09:45","slug":"determining-status-replication-couchbase-lite","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/","title":{"rendered":"Determining Status of a Replication in Couchbase Lite"},"content":{"rendered":"<div id=\"attachment_2919\" style=\"width: 650px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-2919\" class=\"size-full wp-image-2919\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/03\/19300545790_82ac2a3444_z.jpg\" alt=\"\" width=\"640\" height=\"427\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg 640w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z-300x200.jpg 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z-400x267.jpg 400w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z-450x300.jpg 450w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z-20x13.jpg 20w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><p id=\"caption-attachment-2919\" class=\"wp-caption-text\">Courtesy of Andr\u00e9s Nieto Porras (https:\/\/www.flickr.com\/photos\/anieto2k)<\/p><\/div>\n<p><a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/guides\/couchbase-lite\/index.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Couchbase Lite<\/a> runs replications (syncs) using background threads. Starting and stopping replications doesn&#8217;t happen synchronously. This can lead to mistakes in detecting the state of a replication.<\/p>\n<p>The <a href=\"https:\/\/developer.couchbase.com\/documentation\/mobile\/current\/references\/couchbase-lite\/couchbase-lite\/replication\/index.html\">Replication class<\/a> has, depending on platform, either a <code>running<\/code> property or a convenience routine like <code>isRunning()<\/code>. This is a lightweight way of checking the status of a replication.<\/p>\n<p>Using it can lead to unexpected results, though. For example, I recently wrote a utility that uses continuous replications. I have a toggle button to start and stop them. It&#8217;s tempting to use <code>isRunning<\/code> to update the button state. Turns out this is a bad idea. Not surprising, given changes happen in the background, but easy to overlook.<\/p>\n<p>Instead, the preferred approach uses a change listener. Here&#8217;s an example.<\/p>\n<p>We have two classes. The database helper class wraps some standard operations for simplicity. I added an interface to employ a callback pattern. The client class has to implement it. The helper class digests the Couchbase Lite change notification before passing anything to the client. This gives a nice separation of concerns.<\/p>\n<p>The code listings below are outlines. They only show essentials. Let&#8217;s look at the helper class first.<\/p>\n<pre class=\"lang:java decode:true \">public class DBHelper implements Replication.ChangeListener {\r\n  private boolean replicationActive = false;\r\n  private List stateListeners = new ArrayList&amp;lt;&amp;gt;();\r\n  ...\r\n\r\n  public interface ReplicationStateListener {\r\n    void onChange(boolean isActive);\r\n  }\r\n\r\n  public void startReplication(URL gateway, boolean continuous) {\r\n    ...\r\n\r\n    pushReplication.addChangeListener(this);\r\n    pushReplication.start();\r\n  }\r\n\r\n  public void stopReplication() {\r\n    ...\r\n  }\r\n\r\n  public void addReplicationStateListener(ReplicationStateListener listener) {\r\n    stateListeners.add(listener);\r\n  }\r\n\r\n  public void removeReplicationStateListener(ReplicationStateListener listener) {\r\n    stateListeners.remove(listener);\r\n  }\r\n\r\n  \/\/ Replication.ChangeListener\r\n  @Override\r\n  public void changed(Replication.ChangeEvent changeEvent) {\r\n    if (changeEvent.getError() != null) {\r\n      Throwable lastError = changeEvent.getError();\r\n\r\n      \/\/ React to the error\r\n\r\n      return;\r\n    }\r\n\r\n    if (changeEvent.getTransition() == null) return;\r\n\r\n    ReplicationState dest = changeEvent.getTransition().getDestination();\r\n\r\n    replicationActive = ((dest == ReplicationState.STOPPING || dest == ReplicationState.STOPPED) ? false : true);\r\n\r\n    stateListeners.forEach(listener -&gt; listener.onChange(replicationActive));\r\n  }\r\n}<\/pre>\n<p>We see that DBHelper implements the <code>Replication.ChangeListener<\/code> interface. This is an interface defined by Couchbase Lite. In <code>startReplication<\/code> we add this listener to the replication. It has one method to override, <code>changed<\/code>. The <code>ChangeEvent<\/code> passed in can have several different values. In the example, I check for errors first and notify the user if one occurs. Otherwise I check to see if this is a replication state transition event. The destination state can be one of <code>INITIAL<\/code>, <code>RUNNING<\/code>, <code>IDLE<\/code>, <code>OFFLINE<\/code>, <code>STOPPING<\/code>, or <code>STOPPED<\/code>.<\/p>\n<p>In this case I just want to know if the replication is shutting down, so I simplify the return value. I allow clients to register more than one listener, so the last bit of code loops over all the callbacks and invokes them.<\/p>\n<p>The client class is even simpler. I have the class implement the needed interface from the helper class. Just register the listener during instance construction, and have <code>onChange<\/code> do whatever you need in the UI.<\/p>\n<pre><code class=\"language-java\">public class Client implements DBHelper.ReplicationStateListener {\r\n  private DBHelper service = DBHelper.getInstance();\r\n  ...\r\n\r\n  public Client() {\r\n    service.addReplicationStateListener(this);\r\n  }\r\n\r\n  ...\r\n\r\n  \/\/ DBHelper.ReplicationStateListener\r\n  @Override\r\n  public void onChange(boolean isActive) {\r\n    \/\/ Code to handle the change\r\n  }\r\n}<\/code><\/pre>\n<p>This code is drawn from a tool I built. Read about the tool itself in <a href=\"https:\/\/www.couchbase.com\/blog\/couchbase-mobile-changes-explorer-part-1\/\">this post<\/a>.You can find the source code on GitHub <a href=\"https:\/\/github.com\/couchbaselabs\/CBM-Changes-Explorer\">here<\/a>.<\/p>\n<h2>Postscript<\/h2>\n<p>Check out more resources on our <a href=\"https:\/\/www.couchbase.com\/developers\/community\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">developer portal<\/a> and follow us on Twitter <a href=\"https:\/\/twitter.com\/CouchbaseDev\">@CouchbaseDev<\/a>.<\/p>\n<p>You can post questions on our <a href=\"https:\/\/www.couchbase.com\/forums\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">forums<\/a>. And we actively participate on <a href=\"https:\/\/stackoverflow.com\/questions\/tagged\/couchbase\">Stack Overflow<\/a>.<\/p>\n<p>Hit me up on Twitter <a href=\"https:\/\/twitter.com\/HodGreeley\">@HodGreeley<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Couchbase Lite runs replications (syncs) using background threads. Starting and stopping replications doesn&#8217;t happen synchronously. This can lead to mistakes in detecting the state of a replication. The Replication class has, depending on platform, either a running property or a [&hellip;]<\/p>\n","protected":false},"author":73,"featured_media":2919,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,7667,1810],"tags":[1562],"ppma_author":[9042],"class_list":["post-2902","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-couchbase-lite","category-couchbase-mobile","tag-replication"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Determining Status of a Replication in Couchbase Lite - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"This blog focuses on how to use Replication class and change listener for checking the status of replication in Couchbase Lite.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Determining Status of a Replication in Couchbase Lite\" \/>\n<meta property=\"og:description\" content=\"This blog focuses on how to use Replication class and change listener for checking the status of replication in Couchbase Lite.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-07T16:42:52+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T03:09:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"427\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@HodGreeley\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hod Greeley, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/\"},\"author\":{\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\"},\"headline\":\"Determining Status of a Replication in Couchbase Lite\",\"datePublished\":\"2017-03-07T16:42:52+00:00\",\"dateModified\":\"2025-06-14T03:09:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/\"},\"wordCount\":434,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg\",\"keywords\":[\"replication\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Lite\",\"Couchbase Mobile\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/\",\"name\":\"Determining Status of a Replication in Couchbase Lite - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg\",\"datePublished\":\"2017-03-07T16:42:52+00:00\",\"dateModified\":\"2025-06-14T03:09:45+00:00\",\"description\":\"This blog focuses on how to use Replication class and change listener for checking the status of replication in Couchbase Lite.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg\",\"width\":640,\"height\":427,\"caption\":\"Courtesy of Andr\u00e9s Nieto Porras (https:\/\/www.flickr.com\/photos\/anieto2k)\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Determining Status of a Replication in Couchbase Lite\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4\",\"name\":\"Hod Greeley, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g\",\"caption\":\"Hod Greeley, Developer Advocate, Couchbase\"},\"description\":\"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.\",\"sameAs\":[\"https:\/\/hod.greeley.org\/blog\",\"https:\/\/x.com\/HodGreeley\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/author\/hod-greeley\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Determining Status of a Replication in Couchbase Lite - The Couchbase Blog","description":"This blog focuses on how to use Replication class and change listener for checking the status of replication in Couchbase Lite.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/","og_locale":"en_US","og_type":"article","og_title":"Determining Status of a Replication in Couchbase Lite","og_description":"This blog focuses on how to use Replication class and change listener for checking the status of replication in Couchbase Lite.","og_url":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-03-07T16:42:52+00:00","article_modified_time":"2025-06-14T03:09:45+00:00","og_image":[{"width":640,"height":427,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg","type":"image\/jpeg"}],"author":"Hod Greeley, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@HodGreeley","twitter_misc":{"Written by":"Hod Greeley, Developer Advocate, Couchbase","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/"},"author":{"name":"Hod Greeley, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4"},"headline":"Determining Status of a Replication in Couchbase Lite","datePublished":"2017-03-07T16:42:52+00:00","dateModified":"2025-06-14T03:09:45+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/"},"wordCount":434,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg","keywords":["replication"],"articleSection":["Best Practices and Tutorials","Couchbase Lite","Couchbase Mobile"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/","url":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/","name":"Determining Status of a Replication in Couchbase Lite - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg","datePublished":"2017-03-07T16:42:52+00:00","dateModified":"2025-06-14T03:09:45+00:00","description":"This blog focuses on how to use Replication class and change listener for checking the status of replication in Couchbase Lite.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/03\/19300545790_82ac2a3444_z.jpg","width":640,"height":427,"caption":"Courtesy of Andr\u00e9s Nieto Porras (https:\/\/www.flickr.com\/photos\/anieto2k)"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/determining-status-replication-couchbase-lite\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Determining Status of a Replication in Couchbase Lite"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"The Couchbase Blog","description":"Couchbase, the NoSQL Database","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"The Couchbase Blog","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/9b62593c8a13531e53d52fcd5aabbca4","name":"Hod Greeley, Developer Advocate, Couchbase","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/21eb69cb5d4a401fb23b149e4f4e9e87","url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","caption":"Hod Greeley, Developer Advocate, Couchbase"},"description":"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University.","sameAs":["https:\/\/hod.greeley.org\/blog","https:\/\/x.com\/HodGreeley"],"url":"https:\/\/www.couchbase.com\/blog\/author\/hod-greeley\/"}]}},"authors":[{"term_id":9042,"user_id":73,"is_guest":0,"slug":"hod-greeley","display_name":"Hod Greeley, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/52d0018695c0ced0d1c68cf64a6195c81dbac03dce5983f98eb209e7c84350df?s=96&d=mm&r=g","author_category":"","last_name":"Greeley","first_name":"Hod","job_title":"","user_url":"https:\/\/hod.greeley.org\/blog","description":"Hod Greeley is a Developer Advocate for Couchbase, living in Silicon Valley. He has over two decades of experience as a software engineer and engineering manager. He has worked in a variety of software fields, including computational physics and chemistry, computer and network security, finance, and mobile. Prior to joining Couchbase in 2016, Hod led developer relations for mobile at Samsung. Hod holds a Ph.D. in chemical physics from Columbia University."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/users\/73"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/comments?post=2902"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/posts\/2902\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media\/2919"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/media?parent=2902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/categories?post=2902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/tags?post=2902"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/wp-json\/wp\/v2\/ppma_author?post=2902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}