使用SAP OData offline库实现Android应用的离线(offline)模式
打开Android studio,在工程的build.gradle里加入下面的依赖,导入SAP OData offline库:
implementation group:'com.sap.cloud.android', name:'offline-odata', version: sdkVersion
点击Sync now:
新建一个java文件:SAPServiceManager.java
使用的import如下:
import android.content.Context; import android.util.Log; import android.widget.Toast; import com.sap.cloud.mobile.odata.core.AndroidSystem; import com.sap.cloud.mobile.odata.offline.OfflineODataDefiningQuery; import com.sap.cloud.mobile.odata.offline.OfflineODataException; import com.sap.cloud.mobile.odata.offline.OfflineODataParameters; import com.sap.cloud.mobile.odata.offline.OfflineODataProvider; import java.net.MalformedURLException; import java.net.URL; // 将OfflineODataProvider注释掉,改为OfflineODataProvider //private OnlineODataProvider provider; private OfflineODataProvider provider; private static final String TAG = SAPServiceManager.class.getName(); OData offiline datastore的setup方法: public void openODataStore(Action0 callback, Context context) { setupOfflineOData(callback, context); } private void setupOfflineOData(Action0 callback, Context context) { try { if (configurationData.loadData()) { Toast.makeText(context, "Opening the offline store which may take a few moments the first time it is opened.", Toast.LENGTH_LONG).show(); //Initialize application context for use by OfflineODataProvider AndroidSystem.setContext(context); //commonly set parameters include setStoreEncryptionKey, setStoreName, setStorePath OfflineODataParameters offParam = new OfflineODataParameters(); String serviceUrl = configurationData.getServiceUrl(); URL url = new URL(serviceUrl + CONNECTION_ID_ESPMCONTAINER); provider = new OfflineODataProvider(url, offParam, ClientProvider.get()); //Specifies which entities we wish to include in the offline store provider.addDefiningQuery(new OfflineODataDefiningQuery("Customers", "Customers", false)); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (OfflineODataException e) { e.printStackTrace(); } //opens the offline store. This can take a minute or so the first time it is called as it is created and populated. Log.d(TAG, "About to call open on the offline store."); provider.open(() -> { Log.d(TAG, "Offline store opened."); eSPMContainer = new ESPMContainer(provider); callback.call(); syncOfflineData(); //TODO could be triggered via a menu action }, (OfflineODataException offlineODataException) -> { Log.d(TAG, "Offline store did not open.", offlineODataException); }); } public void syncOfflineData() { //send the local changes to the back end OData service Log.d(TAG, "About to call provider.upload."); provider.upload(() -> { Log.d(TAG, "Successfully uploaded the changed data."); //get changes from the back end OData service. provider.download(() -> { Log.d(TAG, "Successfully downloaded the changed data."); }, (error) -> { Log.d(TAG, "Failed when downloading the changed data with error: " + error.getMessage()); }); }, (error) -> { Log.d(TAG, "Failed when uploading the changed data with error: " + error.getMessage()); }); } public String getServiceRoot() { if (configurationData.loadData()) { String serviceUrl = configurationData.getServiceUrl(); if (serviceRoot == null) { serviceRoot = serviceUrl + "/" + CONNECTION_ID_ESPMCONTAINER; } } else { throw new IllegalStateException("SAPService manager configurationData.loadData() failed."); } return serviceRoot; }
新建LogonActivity.java,调用之前实现的sapServiceManager.openODataStore:
第一次运行应用,会发现offline OData store的初始化日志:
现在可以测试离线模式了,打开移动设备的飞行模式:
选择存储于OData offline store上的某个客户,点击编辑按钮:
修改city字段:
关闭该应用,关闭设备的飞行模式,再启动该应用,在logcat里能观察到之前处于离线模式修改的数据已经自动同步到了后台online store里:
本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何使用SAP云平台的Notification服务给Android应用推送通知消息
登录SAP Cloud Platform Mobile Services management cockpit: 在Mobile Application列表里,选择之前创建好的Wiz App: 打开User Registration标签页: 指定需要推送到移动应用上的Notification文本: 之前使用SAP Cloud Platform Android SDK创建的Android应用,就收到了这条Notification: 如果我们测试的应用当前处于后台运行状态,则来自SAP Cloud Platform的Notification推送到达移动设备后,表现形式如下: 点击手机上这条推送消息列表,就能将收到推送消息的应用转换到前台运行状态(foreground mode): SAP Cloud Platform提供的这种通知服务,是采用AlertDialog实现的。 本文来自云栖社区合作伙伴“汪子熙”,了解相关信息可以关注微信公众号"汪子熙"。
- 下一篇
Android Native禁止使用系统私有库详解
系统私有库指的是,存放在android系统/system/lib/和/vendor/lib下面,但是Android NDK中没有公开API的lib库。 从Android N开始(SDK >= 24),通过dlopen打开系统私有库,或者lib库中依赖系统私有库,都会产生异常,甚至可能导致app崩溃。具体可以阅读官方文档说明。 这个变更会有怎样的影响呢? 曾经的美好 在以前,在ndk层面,我们是可以使用一些hack的手段得到系统的私有api的。 比如,你想使用虚拟机中的一些内部符号,在N以下版本,你可以这么搞 void *handle = dlopen("libart.so", RTLD_NOW); void *originFunc = dlsym(handle, "_ZNK3art6Thread13DumpJavaStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE"); 这样你就能得到art::Thread::DumpJavaStack的函数指针,然后愉快地调用它了。 晴天霹雳 但是到了N以后, void *handle ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2更换Tomcat为Jetty,小型站点的福音