{"id":1199,"date":"2016-07-13T12:24:15","date_gmt":"2016-07-13T12:24:15","guid":{"rendered":"http:\/\/greenrobot.org\/?p=1199"},"modified":"2016-07-13T19:55:05","modified_gmt":"2016-07-13T19:55:05","slug":"android-orm-performance-2016","status":"publish","type":"post","link":"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/","title":{"rendered":"Android ORM Performance 2016"},"content":{"rendered":"<p>With <a href=\"http:\/\/greenrobot.org\/release\/greendao-3-released\/\">greenDAO 3 released<\/a>, it&#8217;s time again to look at the Android ORM performance landscape and do some benchmarks. This time, we also tested\u00a0newer ORMs for SQLite like DbFlow, requery, SQLDelight, and SquiDB. Also, we had an extensive look at benchmarks done by others. Let&#8217;s get started with our results:<\/p>\n<p><!--more--><\/p>\n<p><img loading=\"lazy\" width=\"1140\" height=\"639\" class=\"aligncenter size-full wp-image-1224\" src=\"http:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark.png\" alt=\"Android ORM Performance Benchmark\" srcset=\"https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark.png 1140w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark-300x168.png 300w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark-768x430.png 768w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark-1024x574.png 1024w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark-600x336.png 600w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark-770x432.png 770w\" sizes=\"(max-width: 1140px) 100vw, 1140px\" \/><\/p>\n<p>As you can see greenDAO comes in first in for all operations while there is no distinct second place.\u00a0While this would be easy to claim, we are trying hard\u00a0to\u00a0present straight facts here. <a href=\"http:\/\/greenrobot.org\/android\/benchmarking-on-android\/\">Objective benchmarks\u00a0are really difficult to do<\/a>\u00a0and we did our best to make this comparison fair. All <a href=\"https:\/\/github.com\/greenrobot\/android-database-performance\">our benchmarks are open source<\/a>, so you can verify the procedure for yourselves. Let us know if we can improve.<\/p>\n<h2>Other ORM performance benchmarks<\/h2>\n<p>Critical minds may still have doubts, which is perfectly understandable because we still\u00a0might favor a specific\u00a0product. Granted, so let&#8217;s have a look at other popular benchmark projects by Raizlabs and Kevin Galligan.<\/p>\n<h3>Benchmarks by Raizlabs<\/h3>\n<p>Raizlabs is an interesting case. In early 2015,\u00a0<a href=\"https:\/\/www.raizlabs.com\/dev\/2015\/02\/go-dbflow-fastest-android-orm-database-library\/\">Raizlabs claimed\u00a0DbFlow<\/a>\u00a0to be the fastest Android ORM. Initially, they did not mention greenDAO at all. Soon, readers\u00a0left various comments asking about greenDAO. Thus Raizlabs added greenDAO in their benchmark suite, and commented that DbFlow was faster for inserts while greenDAO may have advantages when it comes to loading. Because concrete results still lacked, we ran Raizlab&#8217;s benchmarking app\u00a0with greenDAO included (smaller is better):<br \/>\n<img loading=\"lazy\" class=\"aligncenter size-full wp-image-1330\" src=\"http:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-simple.png\" alt=\"android-orm-benchmark-raizlabs-simple\" width=\"1920\" height=\"1080\" srcset=\"https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-simple.png 1920w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-simple-300x169.png 300w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-simple-768x432.png 768w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-simple-1024x576.png 1024w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-simple-600x338.png 600w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-simple-770x433.png 770w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/>Seems like greenDAO\u00a0comes out fastest right away. A quick look at the code suggests\u00a0that\u00a0greenDAO&#8217;s\u00a0time for &#8220;Save&#8221; might further improve by exchanging the method &#8220;insertOrReplace&#8221; by just &#8220;insert&#8221;. But OK, let&#8217;s look at the other scenario called &#8220;Complex trial&#8221;:<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1331\" src=\"http:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex.png\" alt=\"android-orm-benchmark-raizlabs-complex\" width=\"1920\" height=\"1080\" srcset=\"https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex.png 1920w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex-300x169.png 300w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex-768x432.png 768w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex-1024x576.png 1024w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex-600x338.png 600w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex-770x433.png 770w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/p>\n<h3>Fixing Raizlabs&#8217;s &#8220;complex trial&#8221; benchmark<\/h3>\n<p>In this setup, DbFlow\u00a0is the clear winner, right? <strong>But wait a second<\/strong>, why is greenDAO slower than OrmLite? And why is DbFlow loading\u00a0that fast? It&#8217;s time to have a closer look at their code. As it turned out, the &#8220;write&#8221; test made greenDAO use 101 transactions while the others used just a single one. That makes a big difference, so <a href=\"https:\/\/github.com\/Raizlabs\/AndroidDatabaseLibraryComparison\/pull\/15\">we fixed it<\/a>. The results from &#8220;load&#8221; test\u00a0are a little harder to understand, but in short, DbFlow already had all entities in memory after insert, so it did not have to load any entity from the database. It&#8217;s easy to\u00a0outperform others by leaps when you are the only one with a nicely filled cache in place. That&#8217;s why we <a href=\"https:\/\/github.com\/Raizlabs\/AndroidDatabaseLibraryComparison\/issues\/16\">filed an issue<\/a>\u00a0because we think the test setup does not make sense: either you test\u00a0caching or\u00a0loading, but never a mixture. Anyway, it was easy to make greenDAO use\u00a0its caching mechanisms in their setup. Here are the revised results:<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1339\" src=\"http:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex2.png\" alt=\"android-orm-benchmark-raizlabs-complex2\" width=\"1920\" height=\"1080\" srcset=\"https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex2.png 1920w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex2-300x169.png 300w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex2-768x432.png 768w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex2-1024x576.png 1024w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex2-600x338.png 600w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-raizlabs-complex2-770x433.png 770w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/p>\n<p>Yep, fixing those seemingly small flaws in the benchmark\u00a0made a huge difference. In the revised benchmark, greenDAO clearly\u00a0outperforms\u00a0DbFlow for saving complex data. And\u00a0for loading, greenDAO can also\u00a0reuse previously inserted and thus &#8220;cached&#8221; entities in memory leading to close-to-zero &#8220;load&#8221; times.<\/p>\n<h3>Benchmarks by Kevin Galligan<\/h3>\n<p>Kevin Galligan is a pioneer in\u00a0the Android ORM world: he&#8217;s the developer\u00a0of the Android Adapter for OrmLite and also\u00a0made an annotation processing extension for it. He gave a <a href=\"https:\/\/docs.google.com\/presentation\/d\/1jZW-SKdlMmOZG2QrcnWNP7EPJj5bIunLXiHdUeVZq2U\/edit#slide=id.ge5dd27a92_1_4\">presentation at droidcon UK in late\u00a02015<\/a>\u00a0on Android ORMs accompanied by an <a href=\"http:\/\/kpgalligan.tumblr.com\/post\/133281929963\/my-talk-at-droidcon-uk\">blog post<\/a>\u00a0diving deeper also on ORM performance. <a href=\"https:\/\/github.com\/touchlab\/android-orm-benchmark-updated\">His benchmarks<\/a> gave a different picture than ours, especially when looking at greenDAO. Let&#8217;s look a bit behind the scenes to understand what&#8217;s going on.<\/p>\n<p>The benchmarking code came initially from another developer\u00a0and\u00a0penalized OrmLite drastically. So Kevin\u00a0fixed it. Unfortunately, the original code also had a couple of problems regarding greenDAO, which were left unnoticed. We pushed a couple of pull requests to Kevin&#8217;s GitHub repository to fix those too:<\/p>\n<ul>\n<li>For batch inserts, the method insertInTx should be used. Doing 1) manual iterations\u00a0and 2) using\u00a0the method insertOrReplace instead of just insert is less efficient. (see\u00a0<a href=\"https:\/\/github.com\/touchlab\/android-orm-benchmark-updated\/pull\/2\">pull request #2<\/a>)<\/li>\n<li>Like all\u00a0other ORMs being tested, greenDAO should also\u00a0use primitive types in the entity. Wrapper types\u00a0like Long are\u00a0somewhat expensive. (see <a href=\"https:\/\/github.com\/touchlab\/android-orm-benchmark-updated\/pull\/3\">pull request #3<\/a>)<\/li>\n<li>greenDAO&#8217;s optional identity scope introduces a little\u00a0overhead, which should be switched off in some cases depending on what you compare it with.\u00a0 (see\u00a0<a href=\"https:\/\/github.com\/touchlab\/android-orm-benchmark-updated\/pull\/4\">pull request #4<\/a>)<\/li>\n<\/ul>\n<p>After those modifications, we got the following results:<\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1364\" src=\"http:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-kevin.png\" alt=\"android-orm-benchmark-kevin\" width=\"1920\" height=\"1080\" srcset=\"https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-kevin.png 1920w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-kevin-300x169.png 300w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-kevin-768x432.png 768w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-kevin-1024x576.png 1024w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-kevin-600x338.png 600w, https:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/android-orm-benchmark-kevin-770x433.png 770w\" sizes=\"(max-width: 1920px) 100vw, 1920px\" \/><\/p>\n<p>In Kevin&#8217;s revised benchmark, greenDAO and DbFlow are about\u00a0the same speed for writing, while greenDAO seems to read data\u00a0around 20% faster than DbFlow.\u00a0While still being\u00a0similar, it does not exactly match our findings. A possible reason could be that we used DBFlow 3.0 while Kevin used 2.0, but we did not take the time to investigate that. So, that is only a speculation.<\/p>\n<h2>About our ORM benchmark<\/h2>\n<p>Some remarks and additional info about our 2016 edition of our Android ORM performance benchmark:<\/p>\n<ul>\n<li>Benchmarked versions: greenDAO 3.0.1, OrmLite 4.48, DbFlow 3.0.1,\u00a0SQLDelight 0.4.2,\u00a0SquiDB 3.0.0, requery\u00a01.0.0-beta23.<\/li>\n<li>The tests were run on a Nexus 5 with Android\u00a06.0.1 (June 2016 patch level).<\/li>\n<li>The values are the average of 8 separate runs<\/li>\n<li><a href=\"https:\/\/github.com\/greenrobot\/android-database-performance\">The benchmark code is open source<\/a><\/li>\n<li><a href=\"http:\/\/greenrobot.org\/android\/android-orm-performance-in-2015\/\">Last year&#8217;s comparison<\/a> benchmarked\u00a0greenDAO,\u00a0ORMLite, and ActiveAndroid. We dropped ActiveAndroid this year, because we think it&#8217;s not a good alternative anymore. Its development seems to have stopped\u00a0and also its results were inferior.<\/li>\n<\/ul>\n<p>Side note: We used the same hardware like last year. The values for greenDAO and OrmLite remained the same hinting that there were no performance improvements from Android 5.1 (2016) to Android 6.0.1 (2016) done in the internal SQLite version shipping with Android.<\/p>\n<h2>Summary<\/h2>\n<p>We cannot stress enough how\u00a0hard it is to make objective performance benchmarks.\u00a0Even if the benchmarking code is open source (which is great), it\u00a0may not have been critically reviewed. We did our part and\u00a0fixed\u00a0a couple of issues in two other\u00a0benchmark suites and invite you to do the same. After these revisions, the results are very similar to each other. This similarity should\u00a0validate each of the (revised) benchmark suites:\u00a0it is much less likely that three benchmark suites get it wrong.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With greenDAO 3 released, it&#8217;s time again to look at the Android ORM performance landscape and do some benchmarks. This time, we also tested\u00a0newer ORMs for SQLite like DbFlow, requery, SQLDelight, and SquiDB. Also, we had an extensive look at benchmarks done by others. Let&#8217;s get started with our results:<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[52],"tags":[32,89,83,35,33,31,12,85,90,91],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.7.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Android ORM Performance 2016 - Open Source by greenrobot<\/title>\n<meta name=\"description\" content=\"Android ORM performance comparison with greenDAO, OrmLite, SQLDelight, DbFlow, requery, and SquiDB. What is the fastest way to work with SQLite database?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Android ORM Performance 2016 - Open Source by greenrobot\" \/>\n<meta property=\"og:description\" content=\"Android ORM performance comparison with greenDAO, OrmLite, SQLDelight, DbFlow, requery, and SquiDB. What is the fastest way to work with SQLite database?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/\" \/>\n<meta property=\"og:site_name\" content=\"Open Source by greenrobot\" \/>\n<meta property=\"article:published_time\" content=\"2016-07-13T12:24:15+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-07-13T19:55:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark.png\" \/>\n<meta name=\"author\" content=\"DaoMaster\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"DaoMaster\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/\",\"url\":\"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/\",\"name\":\"Android ORM Performance 2016 - Open Source by greenrobot\",\"isPartOf\":{\"@id\":\"https:\/\/greenrobot.org\/#website\"},\"datePublished\":\"2016-07-13T12:24:15+00:00\",\"dateModified\":\"2016-07-13T19:55:05+00:00\",\"author\":{\"@id\":\"https:\/\/greenrobot.org\/#\/schema\/person\/833bf8c669eb3a78801c6595fda29e19\"},\"description\":\"Android ORM performance comparison with greenDAO, OrmLite, SQLDelight, DbFlow, requery, and SquiDB. What is the fastest way to work with SQLite database?\",\"breadcrumb\":{\"@id\":\"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/greenrobot.org\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Android ORM Performance 2016\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/greenrobot.org\/#website\",\"url\":\"https:\/\/greenrobot.org\/\",\"name\":\"Open Source by greenrobot\",\"description\":\"EventBus, greenDAO, and greenrobot Essentials: Open Source by Heart.\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/greenrobot.org\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/greenrobot.org\/#\/schema\/person\/833bf8c669eb3a78801c6595fda29e19\",\"name\":\"DaoMaster\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/greenrobot.org\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9fa9803157482d5ae0663d4527860e9f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9fa9803157482d5ae0663d4527860e9f?s=96&d=mm&r=g\",\"caption\":\"DaoMaster\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Android ORM Performance 2016 - Open Source by greenrobot","description":"Android ORM performance comparison with greenDAO, OrmLite, SQLDelight, DbFlow, requery, and SquiDB. What is the fastest way to work with SQLite database?","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:\/\/greenrobot.org\/android\/android-orm-performance-2016\/","og_locale":"en_US","og_type":"article","og_title":"Android ORM Performance 2016 - Open Source by greenrobot","og_description":"Android ORM performance comparison with greenDAO, OrmLite, SQLDelight, DbFlow, requery, and SquiDB. What is the fastest way to work with SQLite database?","og_url":"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/","og_site_name":"Open Source by greenrobot","article_published_time":"2016-07-13T12:24:15+00:00","article_modified_time":"2016-07-13T19:55:05+00:00","og_image":[{"url":"http:\/\/greenrobot.org\/wordpress\/wp-content\/uploads\/2016-07-08-android-orm-performance-benchmark.png"}],"author":"DaoMaster","twitter_card":"summary","twitter_misc":{"Written by":"DaoMaster","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/","url":"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/","name":"Android ORM Performance 2016 - Open Source by greenrobot","isPartOf":{"@id":"https:\/\/greenrobot.org\/#website"},"datePublished":"2016-07-13T12:24:15+00:00","dateModified":"2016-07-13T19:55:05+00:00","author":{"@id":"https:\/\/greenrobot.org\/#\/schema\/person\/833bf8c669eb3a78801c6595fda29e19"},"description":"Android ORM performance comparison with greenDAO, OrmLite, SQLDelight, DbFlow, requery, and SquiDB. What is the fastest way to work with SQLite database?","breadcrumb":{"@id":"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/greenrobot.org\/android\/android-orm-performance-2016\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/greenrobot.org\/"},{"@type":"ListItem","position":2,"name":"Android ORM Performance 2016"}]},{"@type":"WebSite","@id":"https:\/\/greenrobot.org\/#website","url":"https:\/\/greenrobot.org\/","name":"Open Source by greenrobot","description":"EventBus, greenDAO, and greenrobot Essentials: Open Source by Heart.","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/greenrobot.org\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/greenrobot.org\/#\/schema\/person\/833bf8c669eb3a78801c6595fda29e19","name":"DaoMaster","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/greenrobot.org\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9fa9803157482d5ae0663d4527860e9f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9fa9803157482d5ae0663d4527860e9f?s=96&d=mm&r=g","caption":"DaoMaster"}}]}},"_links":{"self":[{"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/posts\/1199"}],"collection":[{"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/comments?post=1199"}],"version-history":[{"count":24,"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/posts\/1199\/revisions"}],"predecessor-version":[{"id":1386,"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/posts\/1199\/revisions\/1386"}],"wp:attachment":[{"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/media?parent=1199"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/categories?post=1199"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/greenrobot.org\/wp-json\/wp\/v2\/tags?post=1199"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}