Windows phone 8 学习笔记(2) 数据文件操作
原文:Windows phone 8 学习笔记(2) 数据文件操作
Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹、本地文件夹(独立存储空间)、媒体库和SD卡四个地方。本节主要讲解它们的用法以及相关限制性。另外包括本地数据库的使用方式。
快速导航:
一、分析各类数据文件存储方式
二、安装文件夹
三、本地文件夹(独立存储空间)
四、媒体库操作
五、本地数据库
一、分析各类数据文件存储方式
1)安装文件夹
安装文件夹即应用安装以后的磁盘根文件夹,它提供只读的访问权限。它在手机中对应的路径为“ C:\Data\Programs\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\Install\”。
一般在这个位置可以拿到如下信息:
资源文件AppResources.resx 资源文件一般用于定义字符串,国际化资源等,也可以编译存放图片
被编译的资源文件
安装目录的其他文件
特点:只读,可以访问与应用程序相关的资源与文件。
2)本地文件夹(WP7:独立存储空间)
Windows phone 8 为每个应用分配了一个本地文件夹,一般情况下只能访问自己的本地文件夹,对自己的本地文件夹具备完全的读写权限。它在手机中的路径一般为:“C:\Data\Users\DefApps\AppData\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}\Local”
本地文件夹主要功能:
自由读写存储文件
存放本地数据库
存取键值对
特点:读写操作不限制,主要用于处理应用相关的文件。
3)媒体库
媒体库是唯一一个共享访问区域,可以访问图片、视频、音乐等。图片库的地址为:“C:\Data\Users\Public\Pictures\”
媒体库主要功能:
提供共享式的媒体文件访问,部分读写权限
特点:可读取,写权限部分限制,共享性强。
4)SD卡
SD卡与后面的章节关联,你可以访问《Windows phone 8 学习笔记 应用的启动 文件关联以及SD卡访问》 提前了解,如果连接未生效请耐心等待发布^_^。
二、安装文件夹
1)读取资源文件资源文件AppResources.resx的内容
新建WP8项目,添加新建项,资源文件,“Resource1.resx”。添加字符串资源,名称为“String1”值为“Test”。
切换到图片资源,添加图片“ResourceImg.png”
然后,我们访问这些资源,代码如下:
[XAML]
- <!--ContentPanel - 在此处放置其他内容-->
- <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
- <StackPanel x:Name="stackPanel" Grid.Row="1">
- </StackPanel>
- </Grid>
[C#]
- //获取字符资源
- string myString1 = Resource1.String1;
- //获取图片资源
- var myResourceImg = Resource1.ResourceImg;
- Image image = new Image();
- BitmapImage bitmapImage = new BitmapImage();
- bitmapImage.SetSource(new MemoryStream(myResourceImg));
- image.Source = bitmapImage;
- stackPanel.Children.Add(image);
2)读取被编译的资源文件
首先,我们设置图片为资源模式,一般的项目中的图片文件的生成操作设置为“内容”,这里设置为“Resource”。添加一张图片到Image/2.png,右键属性,设置生成操作为“Resource”。这个时候我们不能通过直接路径的方式访问图片,我们分别看看在XAML中和代码中如何获取图片。
[XAML]
- <Image Source="/PhoneApp1;component/Image/2.png"></Image>
[C#]
- Uri uri = new Uri("/PhoneApp1;component/Image/2.png", UriKind.Relative);
- //查看安装文件夹中的资源文件
- StreamResourceInfo streamResourceInfo = Application.GetResourceStream(uri);
- BitmapImage bitmapImage = new BitmapImage();
- bitmapImage.SetSource(streamResourceInfo.Stream);
- Image image = new Image();
- image.Source = bitmapImage;
3)访问安装文件夹
我们通过代码获取安装目录下的所有文件和文件夹。
[C#]
- //获取安装文件夹
- StorageFolder installedLocation = Package.Current.InstalledLocation;
- //获取安装文件夹下的子文件夹集合
- var folders = await installedLocation.GetFoldersAsync();
- var folderNames = folders.Select(x => x.Name).ToArray();
- //获取安装文件夹下的文件集合
- var files = await installedLocation.GetFilesAsync();
- var fileNames = files.Select(x => x.Path).ToArray();
另外,我们还可以通过路径的方式访问安装文件夹,如下操作将访问图片文件,并展示到图片控件。
[C#]
- Image image = new Image();
- StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///1.jpg"));
- var c = await storageFile.OpenReadAsync();
- BitmapImage bitmapImage = new BitmapImage();
- bitmapImage.SetSource(c.AsStream());
- image.Source = bitmapImage;
- this.stackPanel.Children.Add(image);
三、本地文件夹(独立存储空间)
1)在本地文件夹中操作文件
WP7:
[C#]
- //WP7中存取独立存储空间(本地文件夹)的方法
- using (IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication())
- {
- //获取本地文件夹下所有的文件名集合
- var fileNames = storageFile.GetFileNames();
- //操作文件
- var storageFileStrem = storageFile.OpenFile("test.txt", FileMode.OpenOrCreate);
- }
WP8:
[C#]
- //WP8中存取本地文件夹(独立存储空间)的方法
- //获取本地文件夹
- var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
- //操作文件
- var file = await localFolder.GetFileAsync("test.txt");
- var fileRandomAccessStream = await file.OpenAsync(FileAccessMode.Read);
- var fileStream = fileRandomAccessStream.AsStream();
- var path = localFolder.Path;
2)存取键值对
ApplicationSettings用于存储当应用程序退出后需要保存的轻量级数据。下面是使用方法:
[C#]
- //存储键值对
- IsolatedStorageSettings.ApplicationSettings.Add("Key1", "value1");
- IsolatedStorageSettings.ApplicationSettings.Save();
- //获取之前存储的键值对
- MessageBox.Show(IsolatedStorageSettings.ApplicationSettings["Key1"].ToString());
3)安装文件夹、本地文件夹的路径访问方式
对于使用路径访问的文件操作,URL前缀根据位置、API不同都有所不同。相关的URL前缀整理如下:
Windows 命名空间 | 其他API | |
安装文件夹 | ms-appx:/// | appdata:/ |
本地文件夹 | ms-appdata:/// | isostore:/ |
四、媒体库操作
列举下媒体库的基本操作,以及照片读写操作API:
[C#]
- MediaLibrary mediaLibrary = new MediaLibrary();
- string path = string.Empty;
- if (mediaLibrary.Pictures.Count > 0)
- //取得媒体图片库的绝对路径
- path = Microsoft.Xna.Framework.Media.PhoneExtensions.MediaLibraryExtensions.GetPath(mediaLibrary.Pictures[0]);
- //获取媒体库全部照片
- var Pictures = mediaLibrary.Pictures;
- //把图片库第一张图片的缩略图存到已保存的图片文件夹
- mediaLibrary.SavePicture("myImg.jpg", Pictures[0].GetThumbnail());
- //获取照片库跟目录下包含照片的文件夹集合
- var ImgFolerNames = mediaLibrary.RootPictureAlbum.Albums.Select(x => x.Name).ToArray();
五、本地数据库
在Windows phone 8 提供了类似sqlserver的方式管理数据,这就是本地数据库,本地数据库是文件形式存储的,一般可以存放在两个位置,安装文件夹和本地文件夹。由于安装文件夹只读,所以如果不需要操纵数据,则可以放在这个位置,如果需要对数据进行存取,我们可以放到本地文件夹。本文示例将创建一个数据库,包含一张学生表,并且支持对学生表进行增删改查操作。
首先,我们需要创建一个DataContext:
[C#]
- public class MyDataContext : DataContext
- {
- //定义连接字符串
- public static string DBConnectionString = "Data Source=isostore:/MyDb.sdf";
- public MyDataContext()
- : base(DBConnectionString)
- { }
- /// <summary>
- /// 学生表
- /// </summary>
- public Table<Student> Students;
- }
创建学生数据表:
[C#]
- [Table]
- public class Student : INotifyPropertyChanged, INotifyPropertyChanging
- {
- // 定义ID,主键字段,必备
- private int _id;
- /// <summary>
- /// 编号
- /// </summary>
- [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
- public int Id
- {
- get
- {
- return _id;
- }
- set
- {
- if (_id != value)
- {
- NotifyPropertyChanging("Id");
- _id = value;
- NotifyPropertyChanged("Id");
- }
- }
- }
- private string _name;
- /// <summary>
- /// 学生姓名
- /// </summary>
- [Column]
- public string Name
- {
- get
- {
- return _name;
- }
- set
- {
- if (_name != value)
- {
- NotifyPropertyChanging("Name");
- _name = value;
- NotifyPropertyChanged("Name");
- }
- }
- }
- private int _age;
- /// <summary>
- /// 年龄
- /// </summary>
- [Column]
- public int Age
- {
- get
- {
- return _age;
- }
- set
- {
- if (_age != value)
- {
- NotifyPropertyChanging("Age");
- _age = value;
- NotifyPropertyChanged("Age");
- }
- }
- }
- #region INotifyPropertyChanged Members
- public event PropertyChangedEventHandler PropertyChanged;
- // Used to notify the page that a data context property changed
- private void NotifyPropertyChanged(string propertyName)
- {
- if (PropertyChanged != null)
- {
- PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
- }
- }
- #endregion
- #region INotifyPropertyChanging Members
- public event PropertyChangingEventHandler PropertyChanging;
- // Used to notify the data context that a data context property is about to change
- private void NotifyPropertyChanging(string propertyName)
- {
- if (PropertyChanging != null)
- {
- PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
- }
- }
- #endregion
- }
这里是对学生表进行操作的逻辑:
[XAML]
- <ListBox x:Name="listbox1">
- <ListBox.ItemTemplate>
- <DataTemplate>
- <TextBlock Text="{Binding Name}"/>
- </DataTemplate>
- </ListBox.ItemTemplate>
- </ListBox>
[C#]
- private void Add()
- {
- MyDataContext db = new MyDataContext();
- //创建数据库
- if (!db.DatabaseExists())
- db.CreateDatabase();
- //添加学生
- Student student1 = new Student
- {
- Id = 1,
- Name = "张三",
- Age = 15
- };
- db.Students.InsertOnSubmit(student1);
- List<Student> students = new List<Student>();
- students.Add(new Student { Id = 2, Name = "李四", Age = 16 });
- students.Add(new Student { Id = 3, Name = "王五", Age = 17 });
- db.Students.InsertAllOnSubmit(students);
- db.SubmitChanges();
- }
- private void Show()
- {
- MyDataContext db = new MyDataContext();
- //显示年龄大于15岁的学生
- listbox1.ItemsSource = db.Students.Where(x => x.Age > 15);
- }
- private void Delete()
- {
- MyDataContext db = new MyDataContext();
- //删除姓名为李四的学生
- var query = db.Students.Where(x => x.Name == "李四");
- db.Students.DeleteAllOnSubmit(query);
- db.SubmitChanges();
- }
- private void Update()
- {
- MyDataContext db = new MyDataContext();
- //将所有的学生年龄加一岁
- foreach (var student in db.Students)
- {
- student.Age++;
- }
- db.SubmitChanges();
- }
出处:[Lipan] (http://www.cnblogs.com/lipan/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
Windows phone 8 学习笔记(2) 数据文件操作的更多相关文章
- Windows phone 8 学习笔记(2) 数据文件操作(转)
Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...
- C# 好代码学习笔记(1):文件操作、读取文件、Debug/Trace 类、Conditional条件编译、CLS
目录 1,文件操作 2,读取文件 3,Debug .Trace类 4,条件编译 5,MethodImpl 特性 5,CLSCompliantAttribute 6,必要时自定义类型别名 目录: 1,文 ...
- Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数
文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...
- Python学习笔记七:文件操作
文件操作 对照一个word文件的操作方式,来体会文件操作的内容 打开文件:f=open(“file”),提示编码错误,windows默认是GBK f=open(“file”,encoding=”utf ...
- Hadoop学习笔记之二 文件操作
HDFS分布式文件系统:优点:支持超大文件存储.流式访问.一次写入多次读取.缺点:不适应大量小文件.不适应低时延的数据访问.不适应多用户访问任意修改文件. 1.hadoop用于大数据处理,在数据量较小 ...
- python学习笔记(十)、文件操作
在前面我们了解到了没得模块,其中有一个模块为fileinput,为文件操作模块,不知道小伙伴们是否还记得? 1 打开文件 要打开文件,可以使用fileinput中的fileinput.input函数进 ...
- 【学习笔记】C++文件操作详解(ifstream、ofstream、fstream)
C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstre ...
- vue学习笔记:数据渲染操作
{{xxx}} 基本的插值表达式 插值表达式 使用两个大括号 {{ data中定义的数据名 }} 可以将数据插入到指定的位置 这种写法不仅可以显示data属性里定义的值,也可以书写js中的表达式,可以 ...
- Windows phone 8 学习笔记
Windows phone 8 学习笔记(1) 触控输入 http://www.apkbus.com/android-138547-1-1.html Windows phone 8 学习笔记(2) ...
随机推荐
- boost计算随机数和计算crc32简单示例
boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost计算随机数和计算crc32简单示例 2013-02-18 17:14 10 ...
- SilkTest Q&A 10
92. 如何把单个表达式分两行来写? 答案1: 使用Shift + Enter 答案2: 很容易在online help里面找到答案: 1) line break in code 2) ...
- android.graphics包中的一些类的使用
游戏编程相关参考 Matrix学习系列: http://www.moandroid.com/?p=1781 Android画图学习总结系列: http://www.moandroid.com/?p=7 ...
- 无法安装vmware tools的解决方PLEASE WAIT! VMware Tools is currently being installed on your system. Dependin
VMware安装unbuntu 12.04 LTS时,当你使用VMware的Easy Mode安装时,提示须要安装VMware Tools,屏幕会出现下方的文字: installed unbuntu ...
- C++ 载入dll
1.新建一个项目生成dll 首先我们新建一个项目生成一个Dynamic Library(动态链接库) dll 里面非常简单,只有一个add方法.等下我们就要在其他项目里尝试载入这个dll,调用里面的这 ...
- MongoDB -- 更新
$pull: db.collection.update( <query>, { $pull: { <arrayField>: <query2> } } ) $pul ...
- Delphi xe7并行编程快速入门(三篇)
现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...
- 打造你自己ajax上传图片
今天,我们需要的图片上传插件,但是,互联网不提供符合他们的需要和易于使用的.所以我写了自己. 方法1,只使用jquery代码,.代码例如以下 <p> <label>上传图片&l ...
- POJ 3176:Cow Bowling
Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13464 Accepted: 8897 Desc ...
- 关于PHP的内置服务器的使用
今天刚开始正式学习PHP(之前有一点了解),推荐学习的网站是w3school.一开始不知道tomcat服务器不支持PHP脚本,直接把.php文件放到tomcat里面去运行,结果嵌入的php代码段没有什 ...