05、应用程序数据操作(下)
1、DataChangedEvent
对于保存在云端的设置或者文件,应用程序需要知道什么时间数据发生了变化从而更改对应的用户 UI。在任何时间当云端的处理(handler)被触发时会同步触发 datachanged 事件。
这个示例将响应 datachanged 事件,并且更新 UI。
在两台登录的微软账号的机器上同时运行本示例会看到当云端的设置更新时,会同步更改该程序的 UI。
ApplicationData applicationData = ApplicationData.Current; // 提供对与应用程序的应用程序包相关的应用程序数据存储的访问。ApplicationDataContainer roamingSettings = applicationData.RoamingSettings; //获取漫游应用程序数据存储区中的应用程序设置容器。const string settingName = "userName";applicationData.DataChanged += new TypedEventHandler<ApplicationData, object>(DataChangedHandler); // 在同步漫游应用程序数据时发生。
async void DataChangedHandler(Windows.Storage.ApplicationData appData, object o){ //当触发 DataChanged 事件时调用// DataChangeHandler may be invoked on a background thread, so use the Dispatcher to invoke the UI-related code on the UI thread.await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>{Object value = roamingSettings.Values[settingName];OutputTextBlock.Text = "Name: " + (value == null ? "<empty>" : ("\"" + value + "\"")); });}
roamingSettings.Values[settingName] = UserName.Text;// Simulate roaming by intentionally signaling a data changed event. 向所有已注册的事件处理程序发送数据更改事件。applicationData.SignalDataChanged();
2、RoamingL: HighPrority
如果需要在不同的设备之间进行比较时间紧迫的设置通信,可以使用 高优先级的设置(HighPriority setting)。这种方法使用于用户的环境信息(context)(例如:游戏的等级、用户看书的页码等)
当使用这种设置时,设置为 “HighPriority”,操作系统就会自动的频繁响应云端数据设置。这个 HighPriority 设置可以是一个复合的设置。
本示例演示了向 HighPriority setting 中写入,并且响应当云端数据进来触发 datachanged 事件。在两台机器上运行这个示例使用相同的连接帐户观察漫游设置。
导读:向 HighPriority setting 写数据可以使开发者把少量数据比其他漫游数据有更高优先级的被存储到云端。
应该仔细权衡应用程序的哪些数据应该使用 HighPriority setting。“Context” 数据 例如用户的媒体内的位置信息
或者他们的游戏排行榜、得分可以优先设置为 highPriority。通过 highPriority 设置,这些信息享有更高的可能性被分享
到用户所使用的其它机器中。
应用程序应该在用户更改数据时更新他们的 highPriority 设置。包括例如用户音乐的状态、在书中的页码或者完成游戏中的一个任务。
ApplicationData applicationData = ApplicationData.Current; //提供对与应用程序的应用程序包相关的应用程序数据存储的访问。 ApplicationDataContainer roamingSettings = applicationData.RoamingSettings; // 获取漫游应用程序数据存储区中的应用程序设置容器。 applicationData.DataChanged += new TypedEventHandler<ApplicationData, object>(DataChangedHandler); // 在同步漫游应用程序数据时发生。
async void DataChangedHandler(Windows.Storage.ApplicationData appData, object o){// DataChangeHandler may be invoked on a background thread, so use the Dispatcher to invoke the UI-related code on the UI thread.await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>{int counter = Convert.ToInt32(roamingSettings.Values["HighPriority"]);OutputTextBlock.Text = "Counter: " + counter + "(updated remotely)" ; });}
int counter = Convert.ToInt32(roamingSettings.Values["HighPriority"]); //获取并增加 HighPriority 对应的值 roamingSettings.Values["HighPriority"] = counter + 1;
3、ms-appdata://Protocol
可以使用 ms-appdata:// protocol 的方式来访问应用程序文件夹中的 媒体(图片、声音、视频)。这个示例展示了从本地、云端和 临时文件夹中加载图片。
ApplicationData appData = ApplicationData.Current; // 提供对与应用程序的应用程序包相关的应用程序数据存储的访问。try{StorageFile sourceFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///assets/appDataLocal.png")); //异步获取应用程序中的文件await sourceFile.CopyAsync(appData.LocalFolder); // 在本地应用程序数据存储区中的根文件夹中创建文件的副本。当此方法成功完成时,它将返回表示副本的 StorageFile }catch (Exception){// If the image has already been copied the CopyAsync() method above will fail.// Ignore this error. }try{StorageFile sourceFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///assets/appDataRoaming.png"));await sourceFile.CopyAsync(appData.RoamingFolder); // 在漫游应用程序数据存储区中的根文件夹中创建文件的副本。 }catch (Exception){// If the image has already been copied the CopyAsync() method above will fail.// Ignore this error. }try{StorageFile sourceFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///assets/appDataTemp.png"));await sourceFile.CopyAsync(appData.TemporaryFolder); //在临时应用程序数据存储区中的根文件夹中创建文件的副本。 }catch (Exception){// If the image has already been copied the CopyAsync() method above will fail.// Ignore this error. }LocalImage.Source = new Windows.UI.Xaml.Media.Imaging.BitmapImage(new Uri("ms-appdata:///local/appDataLocal.png")); //本地的RoamingImage.Source = new Windows.UI.Xaml.Media.Imaging.BitmapImage(new Uri("ms-appdata:///roaming/appDataRoaming.png"));//漫游的TempImage.Source = new Windows.UI.Xaml.Media.Imaging.BitmapImage(new Uri("ms-appdata:///temp/appDataTemp.png"));//临时的}
4、clear:
使用 Windows.Storage.ApplicationData.Current.ClearAsync 方法来清除 ApplicationData 中的数据。
async void Clear_Click(Object sender, RoutedEventArgs e){try{await Windows.Storage.ApplicationData.Current.ClearAsync();OutputTextBlock.Text = "ApplicationData has been cleared. Visit the other scenarios to see that their data has been cleared.";}catch (Exception){OutputTextBlock.Text = "Unable to clear settings. This can happen when files are in use.";}}
5、SetVersion:
版本控制可以使你在以后版本的应用程序中改变应用程序数据格式,而不会引起和之前版本的冲突。每个版本只会漫游到相同的版本,从而分离不兼容的数据。使用 Windows.Storage.ApplicationData.Current.SetVersion 来改变 ApplicationData 的版本。
// SetVerion 页面类中的成员public sealed partial class SetVersion : Page{ApplicationData appData = null;const string settingName = "SetVersionSetting";const string settingValue0 = "Data.v0";const string settingValue1 = "Data.v1";public SetVersion(){this.InitializeComponent();appData = ApplicationData.Current; //提供对与应用程序的应用程序包相关的应用程序数据存储的访问。 DisplayOutput();}// SetVersionRequest : 当应用程序在其应用程序数据存储中设置应用程序数据的版本时提供数据。void SetVersionHandler0(SetVersionRequest request){SetVersionDeferral deferral = request.GetDeferral(); // 请求延迟集版本请求。uint version = appData.Version; // 获取应用程序数据存储区中的应用程序数据的版本号。switch (version){case 0:// Version is already 0. Nothing to do.break;case 1:// Need to convert data from v1 to v0.// This sample simulates that conversion by writing a version-specific value.appData.LocalSettings.Values[settingName] = settingValue0;break;default:throw new Exception("Unexpected ApplicationData Version: " + version);}deferral.Complete(); // 通知系统应用程序已在其应用程序数据存储区设置应用程序数据的版本。 }void SetVersionHandler1(SetVersionRequest request){SetVersionDeferral deferral = request.GetDeferral();uint version = appData.Version;switch (version){case 0:// Need to convert data from v0 to v1.// This sample simulates that conversion by writing a version-specific value.appData.LocalSettings.Values[settingName] = settingValue1;break;case 1:// Version is already 1. Nothing to do.break;default:throw new Exception("Unexpected ApplicationData Version: " + version);}deferral.Complete();}async void SetVersion0_Click(Object sender, RoutedEventArgs e){await appData.SetVersionAsync(0, new ApplicationDataSetVersionHandler(SetVersionHandler0)); // 设置应用程序数据存储区中的应用程序数据的版本号。 DisplayOutput();}async void SetVersion1_Click(Object sender, RoutedEventArgs e){await appData.SetVersionAsync(1, new ApplicationDataSetVersionHandler(SetVersionHandler1));DisplayOutput();}void DisplayOutput(){OutputTextBlock.Text = "Version: " + appData.Version;}
转载于:https://www.cnblogs.com/hebeiDGL/archive/2012/09/15/2686107.html
05、应用程序数据操作(下)相关推荐
- 微信小程序数据操作(增、删、改、查),id为随机数
addItem() { let that = this var math = Math.floor(Math.random() * 50 + 10) var dataList = that.data. ...
- MySQL将表中的yes改成no_mysql在不需要改程序的情况下通过操作数据库对单表数据量大的表进行分表...
1.为什么要分表? 数据库数据越来越大,随之而来的是单个表中数据太多.以至于查询速度变慢,而且由于表的锁机制导致应用操作也搜到严重影响,出现了数据库性能瓶颈. mysql中有一种机制是表锁定和行锁定, ...
- 【ARM】数据操作指令(下)
00. 目录 文章目录 00. 目录 01. 数据操作指令概述 02. RSC指令 03. TST测试指令 04. TEQ指令 05. CMP 指令 06. CMN 指令 07. ORR 指令 08. ...
- 微信小程序引用php函数,微信小程序Page中data数据操作和函数调用详细介绍
这篇文章主要介绍了微信小程序 详解Page中data数据操作和函数调用的相关资料,需要的朋友可以参考下 微信小程序 详解Page中data数据操作和函数调用 Page() 函数用来注册一个页面.接受一 ...
- android开发:如何在卸载应用程序操作下,不删除原来程序数据库?
情景: 做项目中发现,如果手动卸载安卓应用程序,会清除掉应用原来的数据,比如sqlite3数据库中的数据,为了避免用户卸载应用程序操作下,不会删掉原来的数据. 实现: public class MyA ...
- NET下,你采用的是哪种方式进行数据操作?
进行数据库进行更新操作时,有许多种方式,你使用的是哪种? 这里假设一个数据库中有一张表,表名为Test,列为colID,colTest1,colTest2,colTest3.其中,colTest1,c ...
- 微信小程序云开发之云数据操作
本文主要讲述"微信小程序云开发"中的云数据库的用法 第一节:小程序云开发之数据库 文章目录 前言 一.小程序云开发数据库与传统SQL数据库有什么区别? 二.云数据库开发的使用 1. ...
- 一个WinForm记事本程序(包含主/下拉/弹出菜单/打开文件/保存文件/打印/页面设置/字体/颜色对话框/剪切版操作等等控件用法以及记事本菜单事件/按键事件的具体代码)...
(一).说明 功能类似Windows 操作系统自带的记事本. 一个WinForm记事本程序(包含主/下拉/弹出 菜单/打开保存对话框等控件用法以及记事本菜单事件的具体代码) (二).图片示例 (三) ...
- datagrid出现相同两组数据_stata 数据操作基础知识:以一篇论文数据操作为例
stata 数据操作基础知识:以一篇论文数据操作为例 上节回顾及问题 统计学学习大图景 数据描述 分位数回归 存在的问题: 1.学了就要多使用,哪怕生搬硬套也要多用 2.时间序列的方法,大家可以操作, ...
- 【ARM】数据操作指令(上)
00. 目录 文章目录 00. 目录 01. 数据操作指令概述 02. MOV指令 03. MVN指令 04. AND指令 05. EOR 指令 06. SUB指令 07. RSB 指令 08. AD ...
最新文章
- js 打开窗口window.open
- 【T-SQL】基础——表别名
- 可以使用的mysql和navigate
- 百度搜索引擎提供了一段嵌入到页面中的代码
- matlab 子图title的位置_Plotly_多个子图
- VS2010和opencv2.4.9的配置
- python显示图片列表_python读取图片任意范围区域
- Windows Media Player播放器 VC++ 2008
- (07)System Verilog 类与结构体区别
- ADO.NET基础复习(二)
- 什么是软件开发生命周期?
- 初始化 Hilbert 矩阵
- Winform自动升级系统的设计与实现(源码)
- 竹笋的营养价值及使用方法
- 任务栏创建返回桌面快捷图标
- C语言的/t到底有什么用
- c语言—冒泡排序(详解)
- pyparsing简介
- java 将.amr音频文件转换为.mp3或.wav文件
- (10.1.4) Material Design设计规范
热门文章
- 教你与客户成交的24种技巧
- Android Android.mk脚本结构
- 分享一篇获取键盘数值的js(限制在IE浏览器)
- 圣殿骑士的一篇关于WPF的培训好文,WPF应用与团队开发(转)
- 有些事,我们逃不掉。有些事,我们逃不掉。
- [Flex]浅析Mate flex framework在实际项目中的应用(二)
- Lucene: 全文检索的基本原理
- 《精通Matlab数字图像处理与识别》一第6章 频率域图像增强
- CentOS6.5搭建MySQL5.1主从复制
- 3.支付平台架构:业务、规划、设计与实现 --- 支付后端技术实战