{"id":60,"date":"2018-08-01T08:14:44","date_gmt":"2018-08-01T15:14:44","guid":{"rendered":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/implementing-offline-capabilities-for-relational-data\/"},"modified":"2025-06-11T08:07:40","modified_gmt":"2025-06-11T15:07:40","slug":"implementing-offline-capabilities-for-relational-data","status":"publish","type":"post","link":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/implementing-offline-capabilities-for-relational-data\/","title":{"rendered":"Implementing Offline Capabilities for Relational Data"},"content":{"rendered":"<p>As you may already know, PowerApps provides offline capabilities for your applications to enable users to be productive when there is limited internet access or no connectivity. <a href=\"https:\/\/powerapps.microsoft.com\/en-us\/blog\/implementing-offline-capability-in-your-app\/\">Here<\/a> is a blog which talks about basic implementation details for offline capabilities in your app. The current tutorial provides deeper context on how to build these offline capabilities along with relational data (master and child) in your PowerApps application.<\/p>\n<p>This tutorial assumes that you already know the offline concepts of PowerApps like <a href=\"https:\/\/docs.microsoft.com\/en-us\/powerapps\/maker\/canvas-apps\/functions\/function-savedata-loaddata\">SaveData, LoadData<\/a> functions and <a href=\"https:\/\/docs.microsoft.com\/en-us\/powerapps\/maker\/canvas-apps\/functions\/signals#connection\">Connection<\/a> signal object. We&#8217;ll will use all these concepts in this tutorial .<\/p>\n<h3>\u00a0<\/h3>\n<h3><b>Note<\/b><\/h3>\n<p><em>The offline feature area is still under development and is not optimized for every offline scenario today. The functions to SaveData() to a local device and LoadData() from that device work best in their current implementation over relatively small quantities of data (e.g., dozens of text records in a table) that generally do not exceed 2MB. This is useful for some basic \u201coffline\u201d scenarios as well as to increase the startup performance of canvas apps by caching data locally. However, using this feature to save large amounts of data (e.g., saving thousands of rows in a table, or caching large images or videos) may cause errors or unexpected behavior with the current implementation and should be avoided. Also, the functions do not automatically resolve merge conflicts when a device returns to connectivity from offline \u2013 configuration on what data is saved and how to handle reconnection is up to the maker when writing expressions. We are working to expand the capabilities of offline apps to increase stability and size limits, and in the future to automatically handle decisions about what to save and how to handle conflicts. Stay tuned here and on the PowerApps blog for updates when they become available.\u00a0<\/em><\/p>\n<p>\u00a0<\/p>\n<h3><b>Scenario<\/b><\/h3>\n<p>For this tutorial , let\u2019s assume we have to build a simple Store Inspection App.<\/p>\n<ul>\n<li>Primarily, app should have 3 screens<\/li>\n<\/ul>\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-top-width: 0px;\" width=\"991\">\n<tbody style=\"border-bottom-width: 0px;\">\n<tr style=\"border-bottom-width: 0px;\">\n<td valign=\"top\" width=\"343\">1. List of Stores<\/td>\n<td valign=\"top\" width=\"322\">2. Add Store Screen<\/td>\n<td valign=\"top\" width=\"324\">3. Add inspection Screen<\/td>\n<\/tr>\n<tr style=\"border-bottom-width: 0px;\">\n<td valign=\"top\" width=\"350\"><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" height=\"387\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png\" style=\"display: inline;\" title=\"image\" width=\"216\"\/><\/a><\/td>\n<td valign=\"top\" width=\"319\"><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/2fbac9ca-1285-4cdc-a04f-1f88cb1ef8a1.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"384\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/2fbac9ca-1285-4cdc-a04f-1f88cb1ef8a1.png\" style=\"border: 0px currentcolor; border-image: none; display: inline; background-image: none;\" title=\"image\" width=\"216\"\/><\/a><\/td>\n<td valign=\"top\" width=\"325\"><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/739ec8cf-f1c2-43d8-984a-e67f283d5f08.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"383\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/739ec8cf-f1c2-43d8-984a-e67f283d5f08.png\" style=\"border: 0px currentcolor; border-image: none; display: inline; background-image: none;\" title=\"image\" width=\"215\"\/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<ul>\n<li>\n<div>Screen 1 should show the list of all stores including the stores that are created when offline<\/div>\n<\/li>\n<li>\n<div>Screen 2 captures new stores along with inspections (Screen 3) even when the internet connection is not available and save them to the database when the internet connection is available<\/div>\n<\/li>\n<li>\n<div>For existing stores, new inspections(Screen 3) should be prepopulated with latest inspection data (sorted by created data) in both offline and online mode.<\/div>\n<\/li>\n<li>\n<div>Offline changes should be synched to online by user intervention (on explicit button click)<\/div>\n<\/li>\n<\/ul>\n<p align=\"left\"><b>Note<\/b>: You can find the finished <a href=\"https:\/\/pahandsonlab.blob.core.windows.net\/content\/OfflineAppMasterChild.zip\">sample msapp file(for code reference) over here<\/a>. For this app, I used CDS (Common Data Service) as the data source. However same concepts will apply to any other data source like SharePoint, SQL etc.<\/p>\n<p align=\"left\">So to achieve above mentioned requirements, I have created 2 custom entities called Store and Inspection with 1 : n relationship ( I.e., one store can have multiple inspections) in CDS to capture Stores and related inspections data.<\/p>\n<blockquote>\n<p><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/085ccc3d-1281-45b3-8724-14e091ce7e5d.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"379\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/085ccc3d-1281-45b3-8724-14e091ce7e5d.png\" style=\"border-image: none; display: inline; background-image: none;\" title=\"image\" width=\"598\"\/><\/a><\/p>\n<\/blockquote>\n<h3><b>Part 1 : Offline Caching of master and child tables<\/b><\/h3>\n<p>First screen of this app is a List of Stores. So, on Start of the app, we\u2019ll check for the internet connection using PowerApps built in operator \u201cConnection\u201d. If internet connection is available, Populate both parent and child entities data \u201cStores\u201d, \u201cInspections\u201d into local collections \u201cStoreCollection\u201d and StoreInspectionCollection. Also, save it to the local storage (local caches) as \u201cstoresInLocalStorage\u201d, \u201cstoresInspectionsInLocalStorage\u201d so that we can use it as local cache when the internet connection is not available.<\/p>\n<p>High level approach for accomplishing this is below:<\/p>\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-top-width: 0px;\" width=\"998\">\n<tbody border=\"0\" style=\"border-bottom-width: 0px;\">\n<tr border=\"0\" style=\"border-bottom-width: 0px;\">\n<td valign=\"top\" width=\"499\">\n<ul><!--StartFragment--><\/p>\n<li>On start of the app, check if the internet connection is available or not<\/li>\n<li>If internet connection is available, fetch the data from the database and put that in a collection and save this collection data to local storage of your device (local cache) so that we can use this cached data next time when the internet connection is not available.<\/li>\n<li>If internet connection is not available, fetch data from local storage of your device and use that to populate the collection.<\/li>\n<p><!--EndFragment-->\n<\/ul>\n<\/td>\n<td valign=\"top\" width=\"499\"><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/c58fe3db-f1d7-4c2b-80ad-868e4391d0d9.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"offline-1\" border=\"0\" height=\"341\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/c58fe3db-f1d7-4c2b-80ad-868e4391d0d9.png\" style=\"border: 0px currentcolor; border-image: none; display: inline; background-image: none;\" title=\"offline-1\" width=\"249\"\/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/b29204b8-fd96-4c37-850d-e04929f3b080.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"image\" border=\"0\" height=\"429\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/b29204b8-fd96-4c37-850d-e04929f3b080.png\" style=\"border: 0px currentcolor; border-image: none; display: inline; background-image: none;\" title=\"image\" width=\"545\"\/><\/a><\/p>\n<h3><b>Part 2: Capture new stores and inspections whether the device is online or offline<\/b><\/h3>\n<h5><b>Create new store<\/b><\/h5>\n<p>For adding new stores, add a new screen and insert an EditForm control with data source to Stores in that screen. Navigate to this screen on the press of plus sign from the first page.<\/p>\n<p>Our high-level approach to save new Stores will be as follow:<\/p>\n<p><a href=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/0d1bc0fb-e0e6-43c9-b558-11710fcf3c8a.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"flow 1-1\" border=\"0\" height=\"732\" src=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2024\/06\/0d1bc0fb-e0e6-43c9-b558-11710fcf3c8a.png\" style=\"border: 0px currentcolor; border-image: none; display: inline; background-image: none;\" title=\"flow 1-1\" width=\"652\"\/><\/a><\/p>\n<p>1. If the internet connection is available,<\/p>\n<ul style=\"margin-left: 25px;\">\n<li>Submit the form so that new issue is directly saved to the database.<\/li>\n<li>Refresh the \u201cStores\u201d data source and repopulate the parent collection with the latest data so that your local collection has the last added record<\/li>\n<li>Save this local collection in the local storage\u2013 this ensures that the newly added record is available in local cache to be used next time when the app is opened in offline mode (without internet connection)<\/li>\n<li>Set the SelectedStoreid variable to last submitted record id, so that it can be used in the child screen.<\/li>\n<li>Navigate to inspection screen to create the inspection for newly created store<\/li>\n<\/ul>\n<p>2. If the internet connection is not available,<\/p>\n<ul style=\"margin-left: 25px;\">\n<li>Here, we need a unique id or GUID to carry on the parent child relationship. So, create a temp unique id for new parent record so that you can attach this id to child records for relationship tracking.<\/li>\n<li>PowerApps does not have better way to generate GUIDs so I have used date time now in milliseconds as unique id, because it is almost not possible for the same user to create two records in a millisecond. You can use your own approaches to create this temp unique id\u2019s.<\/li>\n<\/ul>\n<p>3. Set the SelectedStoreid variable to this unique id to use in child screen<\/p>\n<p>4. Add a variable called isDirty= true to identify offline records while synch back to online. Use Collect function to collect all this details into master collection \u201cStoreCollection\u201d so that this offline record reflects on the Stores Screen.<\/p>\n<ul style=\"margin-left: 25px;\">\n<li>Save this local collection in the local storage\u2013 this ensures that the newly added offline record is available in local cache to be used next time when the app is opened in offline mode (without internet connection)<\/li>\n<\/ul>\n<h5><b>Create new inspection<\/b><\/h5>\n<p>Now, let\u2019s focus on how to save the inspections(Child) for stores, high-level approach for this is almost like Stores with fewer changes.<\/p>\n<p>As we mentioned above in this tutorial , Inspection form would be prepopulated with latest\/last inspection record (sorted by created date), So again we need to cover 2 scenarios here.<\/p>\n<p>For New store, there will be no inspection records and form will be new and for existing store, we will find the latest record using Last and Sort By functions and pass this record as parameter(LastSurveyOfStore) to inspection screen using Navigate function.<\/p>\n<p>Our high-level approach to save new Inspections will be as follow:<\/p>\n<p>1. If the internet connection is available<\/p>\n<ul style=\"margin-left: 25px;\">\n<li>Submit the form so that new Inspection is directly saved to the database.<\/li>\n<li>Refresh the \u201cInspections\u201d data source and repopulate the child collection with the latest data so that your local collection has the last added record<\/li>\n<li>Save this local collection in the local storage<\/li>\n<li>Navigate back to Stores screen (1<sup>st<\/sup> Screen)<\/li>\n<\/ul>\n<p>2. If the internet connection is not available<\/p>\n<ul style=\"margin-left: 25px;\">\n<li>Add a variable called ParentID and assign the SelectedStoreid (Which contains latest uniqueid in offline mode and last submitted record id in online mode).<\/li>\n<li>Use Collect function to collect all this details into child collection \u201cStoreInspectionCollection\u201d so that this offline record reflects on the Stores Screen.<\/li>\n<li>Save this local collection in the local storage<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-top-width: 0px;\" width=\"90%\">\n<tbody style=\"border-bottom-width: 0px;\">\n<tr style=\"border-bottom-width: 0px;\">\n<td align=\"center\" valign=\"top\" width=\"33%\"><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/37629d07-f855-4470-a10e-5b5c115733f6.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"2\" border=\"0\" height=\"330\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/37629d07-f855-4470-a10e-5b5c115733f6.png\" style=\"border: 0px currentcolor; border-image: none; display: inline; background-image: none;\" title=\"2\" width=\"614\"\/><\/a><\/td>\n<td align=\"center\" valign=\"top\" width=\"33%\"><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/fa4e6266-712a-4c99-9378-ffd54a2a6257.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"3\" border=\"0\" height=\"345\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/fa4e6266-712a-4c99-9378-ffd54a2a6257.png\" style=\"border: 0px currentcolor; border-image: none; display: inline; background-image: none;\" title=\"3\" width=\"545\"\/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><b>Part 3: Sync up offline records when internet connection is available<\/b><\/h3>\n<p>On the \u201cStoreScreen\u201d, Add a label at the bottom to show how many offline records are to be save to database (or, if all of them are saved, indicate so). This is done by filtering the count or rows in the collection using isDirty flag.<\/p>\n<p>Add a button for user intervention to save the offline records to database (We can also have timer that checks for the internet connection availability using the same Connection object which we used earlier for every given time interval). If the Connection is connected and button gets enabled and gives the opportunity to save the pending offline records.<\/p>\n<p>Our high- level approach would be first to patch the parent record and update the corresponding child records parentID with patched primary id and then patch the child records.<\/p>\n<p>In detail as follows<\/p>\n<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"border-top-width: 0px;\" width=\"90%\">\n<tbody style=\"border-bottom-width: 0px;\">\n<tr style=\"border-bottom-width: 0px;\">\n<td valign=\"top\" width=\"55%\">\n<ul>\n<li>Filter the StoreCollection and StoreInspectionCollection for items that are added offline using isDirty flag and ClearCollect these items into new collections (\u201cStoresTobeAdded\u201d,\u201d StoresInspectionsTobeAdded.<\/li>\n<li>Use ForAll function to iterate each record of new Parent collection and patch each store(parent) record. Collect this patched item into temp collection to access the primary id since PowerApps does not allow to declare a variable in ForAll to hold the patched item.<\/li>\n<li>Identify the children of patched parent record using ParentID variable in new child collection and Update the corresponding child records ParentID value with newly patched primary id.<\/li>\n<li>Remove the patched item from the collection and continue to evaluate other records in the loop<\/li>\n<li>Refresh the data source (Stores), collect to local collection and save this local collection to cache (local storage)<\/li>\n<li>Now, it\u2019s time to save the child records, Use ForAll function and Patch each child record.<\/li>\n<li>Refresh the data source (Inspections), collect to local collection and save this local collection to cache (local storage)<\/li>\n<\/ul>\n<\/td>\n<td valign=\"top\" width=\"45%\"><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/44c1806c-695c-4e60-a0f9-a54525cccab9.png\"><img loading=\"lazy\" decoding=\"async\" alt=\"save button flow\" border=\"0\" height=\"653\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/44c1806c-695c-4e60-a0f9-a54525cccab9.png\" style=\"border: 0px currentcolor; border-image: none; display: inline; background-image: none;\" title=\"save button flow\" width=\"324\"\/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/aceef00a-5fa0-4258-accf-dc5cae9dc1f1.png\" style='font-family: tahoma, \"Helvetica Neue\", arial, helvetica, sans-serif; font-size: 13px; font-style: normal; font-weight: 400; text-decoration-line: underline;'><img decoding=\"async\" alt=\"4\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/aceef00a-5fa0-4258-accf-dc5cae9dc1f1.png\" style=\"border: 0px solid currentcolor; width: 630px; height: 470px; font-size: 13px; display: inline; background-image: none;\" title=\"4\"\/><\/a><\/h3>\n<p>\u00a0<\/p>\n<p><a href=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/cd65d325-5693-4a02-b5e9-3fa97e085566.png\" style='font-family: tahoma, \"Helvetica Neue\", arial, helvetica, sans-serif; font-size: 13px; font-style: normal; font-weight: 400; text-decoration-line: underline;'><img loading=\"lazy\" decoding=\"async\" alt=\"5\" border=\"0\" height=\"432\" src=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/cd65d325-5693-4a02-b5e9-3fa97e085566.png\" style=\"border-color: currentcolor; font-size: 13px; display: inline; background-image: none;\" title=\"5\" width=\"836\"\/><\/a><\/p>\n<h3><b>Conclusion<\/b><\/h3>\n<p>Hopefully, this tutorial gives you an idea of how to build offline capabilities with relational data in your application.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As you may already know, POWERAPPS provides offline capabilities for your applications to enable users to be productive when there is limited internet access or no connectivity.<\/p>\n","protected":false},"author":109,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ms_queue_id":[],"ep_exclude_from_search":false,"_classifai_error":"","_classifai_text_to_speech_error":"","_alt_title":"","ms-ems-related-posts":[],"footnotes":""},"audience":[3378],"content-type":[3423],"job-role":[],"product":[3473],"property":[],"topic":[],"coauthors":[2138],"class_list":["post-60","post","type-post","status-publish","format-standard","hentry","audience-it-professional","content-type-tips-and-guides","product-power-apps"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Implementing Offline Capabilities for Relational Data - Microsoft Power Platform Blog<\/title>\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.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Implementing Offline Capabilities for Relational Data - Microsoft Power Platform Blog\" \/>\n<meta property=\"og:description\" content=\"As you may already know, POWERAPPS provides offline capabilities for your applications to enable users to be productive when there is limited internet access or no connectivity.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/implementing-offline-capabilities-for-relational-data\/\" \/>\n<meta property=\"og:site_name\" content=\"Microsoft Power Platform Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-01T15:14:44+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-11T15:07:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png\" \/>\n<meta name=\"author\" content=\"Saurabh Pant\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Saurabh Pant\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/\"},\"author\":[{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/saurabh-pant\/\",\"@type\":\"Person\",\"@name\":\"Saurabh Pant\"}],\"headline\":\"Implementing Offline Capabilities for Relational Data\",\"datePublished\":\"2018-08-01T15:14:44+00:00\",\"dateModified\":\"2025-06-11T15:07:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/\"},\"wordCount\":1582,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/\",\"name\":\"Implementing Offline Capabilities for Relational Data - Microsoft Power Platform Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png\",\"datePublished\":\"2018-08-01T15:14:44+00:00\",\"dateModified\":\"2025-06-11T15:07:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#primaryimage\",\"url\":\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png\",\"contentUrl\":\"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Implementing Offline Capabilities for Relational Data\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\",\"name\":\"Microsoft Power Platform Blog\",\"description\":\"Innovate with Business Apps\",\"publisher\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization\",\"name\":\"Microsoft Power Platform Blog\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"contentUrl\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png\",\"width\":194,\"height\":145,\"caption\":\"Microsoft Power Platform Blog\"},\"image\":{\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/person\/cff307f090dbecc142a4ae500635fbc0\",\"name\":\"Saurabh Pant\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/a2aee9e7e83190780707b84811a763b3798edcf2c9d6a04c84472ee66376ebb2?s=96&d=mm&r=g0f202c855deeae9d0116ea4b4d397597\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a2aee9e7e83190780707b84811a763b3798edcf2c9d6a04c84472ee66376ebb2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a2aee9e7e83190780707b84811a763b3798edcf2c9d6a04c84472ee66376ebb2?s=96&d=mm&r=g\",\"caption\":\"Saurabh Pant\"},\"url\":\"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/spant\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Implementing Offline Capabilities for Relational Data - Microsoft Power Platform Blog","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.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/","og_locale":"en_US","og_type":"article","og_title":"Implementing Offline Capabilities for Relational Data - Microsoft Power Platform Blog","og_description":"As you may already know, POWERAPPS provides offline capabilities for your applications to enable users to be productive when there is limited internet access or no connectivity.","og_url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/power-apps\/implementing-offline-capabilities-for-relational-data\/","og_site_name":"Microsoft Power Platform Blog","article_published_time":"2018-08-01T15:14:44+00:00","article_modified_time":"2025-06-11T15:07:40+00:00","og_image":[{"url":"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png","type":"","width":"","height":""}],"author":"Saurabh Pant","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Saurabh Pant","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#article","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/"},"author":[{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/saurabh-pant\/","@type":"Person","@name":"Saurabh Pant"}],"headline":"Implementing Offline Capabilities for Relational Data","datePublished":"2018-08-01T15:14:44+00:00","dateModified":"2025-06-11T15:07:40+00:00","mainEntityOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/"},"wordCount":1582,"commentCount":0,"publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#primaryimage"},"thumbnailUrl":"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/","name":"Implementing Offline Capabilities for Relational Data - Microsoft Power Platform Blog","isPartOf":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#primaryimage"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#primaryimage"},"thumbnailUrl":"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png","datePublished":"2018-08-01T15:14:44+00:00","dateModified":"2025-06-11T15:07:40+00:00","breadcrumb":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#primaryimage","url":"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png","contentUrl":"https:\/\/pwrappscdn.azureedge.net\/mediahandler\/blog\/media\/PowerApps\/blog\/271c09a6-109d-4f50-b641-ce72b74f6ef2.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/2018\/08\/01\/implementing-offline-capabilities-for-relational-data\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/"},{"@type":"ListItem","position":2,"name":"Implementing Offline Capabilities for Relational Data"}]},{"@type":"WebSite","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#website","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/","name":"Microsoft Power Platform Blog","description":"Innovate with Business Apps","publisher":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#organization","name":"Microsoft Power Platform Blog","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","contentUrl":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-content\/uploads\/2020\/03\/Microsoft-Logo-e1685482038800.png","width":194,"height":145,"caption":"Microsoft Power Platform Blog"},"image":{"@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/#\/schema\/person\/cff307f090dbecc142a4ae500635fbc0","name":"Saurabh Pant","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a2aee9e7e83190780707b84811a763b3798edcf2c9d6a04c84472ee66376ebb2?s=96&d=mm&r=g0f202c855deeae9d0116ea4b4d397597","url":"https:\/\/secure.gravatar.com\/avatar\/a2aee9e7e83190780707b84811a763b3798edcf2c9d6a04c84472ee66376ebb2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a2aee9e7e83190780707b84811a763b3798edcf2c9d6a04c84472ee66376ebb2?s=96&d=mm&r=g","caption":"Saurabh Pant"},"url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/author\/spant\/"}]}},"bloginabox_animated_featured_image":null,"bloginabox_display_generated_audio":false,"distributor_meta":false,"distributor_terms":false,"distributor_media":false,"distributor_original_site_name":"Microsoft Power Platform Blog","distributor_original_site_url":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog","push-errors":false,"_links":{"self":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/60","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/users\/109"}],"replies":[{"embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/comments?post=60"}],"version-history":[{"count":1,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/60\/revisions"}],"predecessor-version":[{"id":131045,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/posts\/60\/revisions\/131045"}],"wp:attachment":[{"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/media?parent=60"}],"wp:term":[{"taxonomy":"audience","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/audience?post=60"},{"taxonomy":"content-type","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/content-type?post=60"},{"taxonomy":"job-role","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/job-role?post=60"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/product?post=60"},{"taxonomy":"property","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/property?post=60"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/topic?post=60"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.microsoft.com\/en-us\/power-platform\/blog\/wp-json\/wp\/v2\/coauthors?post=60"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}