原文: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]

  1. <!--ContentPanel - 在此处放置其他内容-->
  2. <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
  3. <StackPanel x:Name="stackPanel" Grid.Row="1">
  4. </StackPanel>
  5. </Grid>

[C#]

  1. //获取字符资源
  2. string myString1 = Resource1.String1;
  3. //获取图片资源
  4. var myResourceImg = Resource1.ResourceImg;
  5.  
  6. Image image = new Image();
  7. BitmapImage bitmapImage = new BitmapImage();
  8. bitmapImage.SetSource(new MemoryStream(myResourceImg));
  9. image.Source = bitmapImage;
  10. stackPanel.Children.Add(image);

2)读取被编译的资源文件

首先,我们设置图片为资源模式,一般的项目中的图片文件的生成操作设置为“内容”,这里设置为“Resource”。添加一张图片到Image/2.png,右键属性,设置生成操作为“Resource”。这个时候我们不能通过直接路径的方式访问图片,我们分别看看在XAML中和代码中如何获取图片。

[XAML]

  1. <Image Source="/PhoneApp1;component/Image/2.png"></Image>

[C#]

  1. Uri uri = new Uri("/PhoneApp1;component/Image/2.png", UriKind.Relative);
  2. //查看安装文件夹中的资源文件
  3. StreamResourceInfo streamResourceInfo = Application.GetResourceStream(uri);
  4. BitmapImage bitmapImage = new BitmapImage();
  5. bitmapImage.SetSource(streamResourceInfo.Stream);
  6. Image image = new Image();
  7. image.Source = bitmapImage;

3)访问安装文件夹

我们通过代码获取安装目录下的所有文件和文件夹。

[C#]

  1. //获取安装文件夹
  2. StorageFolder installedLocation = Package.Current.InstalledLocation;
  3. //获取安装文件夹下的子文件夹集合
  4. var folders = await installedLocation.GetFoldersAsync();
  5. var folderNames = folders.Select(x => x.Name).ToArray();
  6. //获取安装文件夹下的文件集合
  7. var files = await installedLocation.GetFilesAsync();
  8. var fileNames = files.Select(x => x.Path).ToArray();

另外,我们还可以通过路径的方式访问安装文件夹,如下操作将访问图片文件,并展示到图片控件。

[C#]

  1. Image image = new Image();
  2. StorageFile storageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///1.jpg"));
  3. var c = await storageFile.OpenReadAsync();
  4. BitmapImage bitmapImage = new BitmapImage();
  5. bitmapImage.SetSource(c.AsStream());
  6. image.Source = bitmapImage;
  7. this.stackPanel.Children.Add(image);

三、本地文件夹(独立存储空间)

1)在本地文件夹中操作文件

    WP7:

[C#]

  1. //WP7中存取独立存储空间(本地文件夹)的方法
  2. using (IsolatedStorageFile storageFile = IsolatedStorageFile.GetUserStoreForApplication())
  3. {
  4. //获取本地文件夹下所有的文件名集合
  5. var fileNames = storageFile.GetFileNames();
  6. //操作文件
  7. var storageFileStrem = storageFile.OpenFile("test.txt", FileMode.OpenOrCreate);
  8. }

    WP8:

[C#]

  1. //WP8中存取本地文件夹(独立存储空间)的方法
  2. //获取本地文件夹
  3. var localFolder = Windows.Storage.ApplicationData.Current.LocalFolder;
  4. //操作文件
  5. var file = await localFolder.GetFileAsync("test.txt");
  6. var fileRandomAccessStream = await file.OpenAsync(FileAccessMode.Read);
  7. var fileStream = fileRandomAccessStream.AsStream();
  8. var path = localFolder.Path;

2)存取键值对

ApplicationSettings用于存储当应用程序退出后需要保存的轻量级数据。下面是使用方法:

[C#]

  1. //存储键值对
  2. IsolatedStorageSettings.ApplicationSettings.Add("Key1", "value1");
  3. IsolatedStorageSettings.ApplicationSettings.Save();
  4. //获取之前存储的键值对
  5. MessageBox.Show(IsolatedStorageSettings.ApplicationSettings["Key1"].ToString());

3)安装文件夹、本地文件夹的路径访问方式

对于使用路径访问的文件操作,URL前缀根据位置、API不同都有所不同。相关的URL前缀整理如下:

  Windows 命名空间 其他API
安装文件夹 ms-appx:/// appdata:/
本地文件夹 ms-appdata:/// isostore:/

四、媒体库操作

列举下媒体库的基本操作,以及照片读写操作API:

[C#]

  1. MediaLibrary mediaLibrary = new MediaLibrary();
  2. string path = string.Empty;
  3. if (mediaLibrary.Pictures.Count > 0)
  4. //取得媒体图片库的绝对路径
  5. path = Microsoft.Xna.Framework.Media.PhoneExtensions.MediaLibraryExtensions.GetPath(mediaLibrary.Pictures[0]);
  6. //获取媒体库全部照片
  7. var Pictures = mediaLibrary.Pictures;
  8. //把图片库第一张图片的缩略图存到已保存的图片文件夹
  9. mediaLibrary.SavePicture("myImg.jpg", Pictures[0].GetThumbnail());
  10. //获取照片库跟目录下包含照片的文件夹集合
  11. var ImgFolerNames = mediaLibrary.RootPictureAlbum.Albums.Select(x => x.Name).ToArray();

五、本地数据库

在Windows phone 8 提供了类似sqlserver的方式管理数据,这就是本地数据库,本地数据库是文件形式存储的,一般可以存放在两个位置,安装文件夹和本地文件夹。由于安装文件夹只读,所以如果不需要操纵数据,则可以放在这个位置,如果需要对数据进行存取,我们可以放到本地文件夹。本文示例将创建一个数据库,包含一张学生表,并且支持对学生表进行增删改查操作。

首先,我们需要创建一个DataContext:

[C#]

  1. public class MyDataContext : DataContext
  2. {
  3. //定义连接字符串
  4. public static string DBConnectionString = "Data Source=isostore:/MyDb.sdf";
  5.  
  6. public MyDataContext()
  7. : base(DBConnectionString)
  8. { }
  9.  
  10. /// <summary>
  11. /// 学生表
  12. /// </summary>
  13. public Table<Student> Students;
  14. }

创建学生数据表:

[C#]

  1. [Table]
  2. public class Student : INotifyPropertyChanged, INotifyPropertyChanging
  3. {
  4. // 定义ID,主键字段,必备
  5. private int _id;
  6. /// <summary>
  7. /// 编号
  8. /// </summary>
  9. [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)]
  10. public int Id
  11. {
  12. get
  13. {
  14. return _id;
  15. }
  16. set
  17. {
  18. if (_id != value)
  19. {
  20. NotifyPropertyChanging("Id");
  21. _id = value;
  22. NotifyPropertyChanged("Id");
  23. }
  24. }
  25. }
  26.  
  27. private string _name;
  28. /// <summary>
  29. /// 学生姓名
  30. /// </summary>
  31. [Column]
  32. public string Name
  33. {
  34. get
  35. {
  36. return _name;
  37. }
  38. set
  39. {
  40. if (_name != value)
  41. {
  42. NotifyPropertyChanging("Name");
  43. _name = value;
  44. NotifyPropertyChanged("Name");
  45. }
  46. }
  47. }
  48.  
  49. private int _age;
  50. /// <summary>
  51. /// 年龄
  52. /// </summary>
  53. [Column]
  54. public int Age
  55. {
  56. get
  57. {
  58. return _age;
  59. }
  60. set
  61. {
  62. if (_age != value)
  63. {
  64. NotifyPropertyChanging("Age");
  65. _age = value;
  66. NotifyPropertyChanged("Age");
  67. }
  68. }
  69. }
  70.  
  71. #region INotifyPropertyChanged Members
  72.  
  73. public event PropertyChangedEventHandler PropertyChanged;
  74.  
  75. // Used to notify the page that a data context property changed
  76. private void NotifyPropertyChanged(string propertyName)
  77. {
  78. if (PropertyChanged != null)
  79. {
  80. PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  81. }
  82. }
  83.  
  84. #endregion
  85.  
  86. #region INotifyPropertyChanging Members
  87.  
  88. public event PropertyChangingEventHandler PropertyChanging;
  89.  
  90. // Used to notify the data context that a data context property is about to change
  91. private void NotifyPropertyChanging(string propertyName)
  92. {
  93. if (PropertyChanging != null)
  94. {
  95. PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
  96. }
  97. }
  98.  
  99. #endregion
  100. }

这里是对学生表进行操作的逻辑:

[XAML]

  1. <ListBox x:Name="listbox1">
  2. <ListBox.ItemTemplate>
  3. <DataTemplate>
  4. <TextBlock Text="{Binding Name}"/>
  5. </DataTemplate>
  6. </ListBox.ItemTemplate>
  7. </ListBox>

[C#]

  1. private void Add()
  2. {
  3. MyDataContext db = new MyDataContext();
  4. //创建数据库
  5. if (!db.DatabaseExists())
  6. db.CreateDatabase();
  7.  
  8. //添加学生
  9. Student student1 = new Student
  10. {
  11. Id = 1,
  12. Name = "张三",
  13. Age = 15
  14. };
  15. db.Students.InsertOnSubmit(student1);
  16.  
  17. List<Student> students = new List<Student>();
  18. students.Add(new Student { Id = 2, Name = "李四", Age = 16 });
  19. students.Add(new Student { Id = 3, Name = "王五", Age = 17 });
  20. db.Students.InsertAllOnSubmit(students);
  21. db.SubmitChanges();
  22. }
  23. private void Show()
  24. {
  25. MyDataContext db = new MyDataContext();
  26. //显示年龄大于15岁的学生
  27. listbox1.ItemsSource = db.Students.Where(x => x.Age > 15);
  28. }
  29.  
  30. private void Delete()
  31. {
  32. MyDataContext db = new MyDataContext();
  33. //删除姓名为李四的学生
  34. var query = db.Students.Where(x => x.Name == "李四");
  35. db.Students.DeleteAllOnSubmit(query);
  36. db.SubmitChanges();
  37. }
  38.  
  39. private void Update()
  40. {
  41. MyDataContext db = new MyDataContext();
  42. //将所有的学生年龄加一岁
  43. foreach (var student in db.Students)
  44. {
  45. student.Age++;
  46. }
  47. db.SubmitChanges();
  48. }
作者:李盼(Lipan)
出处:[Lipan]http://www.cnblogs.com/lipan/
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。

Windows phone 8 学习笔记(2) 数据文件操作的更多相关文章

  1. Windows phone 8 学习笔记(2) 数据文件操作(转)

    Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方.本节主要讲解它们的用法以及相关限制性.另外包括本地数据库的使用方式 ...

  2. C# 好代码学习笔记(1):文件操作、读取文件、Debug/Trace 类、Conditional条件编译、CLS

    目录 1,文件操作 2,读取文件 3,Debug .Trace类 4,条件编译 5,MethodImpl 特性 5,CLSCompliantAttribute 6,必要时自定义类型别名 目录: 1,文 ...

  3. Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

    文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() ...

  4. Python学习笔记七:文件操作

    文件操作 对照一个word文件的操作方式,来体会文件操作的内容 打开文件:f=open(“file”),提示编码错误,windows默认是GBK f=open(“file”,encoding=”utf ...

  5. Hadoop学习笔记之二 文件操作

    HDFS分布式文件系统:优点:支持超大文件存储.流式访问.一次写入多次读取.缺点:不适应大量小文件.不适应低时延的数据访问.不适应多用户访问任意修改文件. 1.hadoop用于大数据处理,在数据量较小 ...

  6. python学习笔记(十)、文件操作

    在前面我们了解到了没得模块,其中有一个模块为fileinput,为文件操作模块,不知道小伙伴们是否还记得? 1 打开文件 要打开文件,可以使用fileinput中的fileinput.input函数进 ...

  7. 【学习笔记】C++文件操作详解(ifstream、ofstream、fstream)

    C++ 通过以下几个类支持文件的输入输出: ofstream: 写操作(输出)的文件类 (由ostream引申而来) ifstream: 读操作(输入)的文件类(由istream引申而来) fstre ...

  8. vue学习笔记:数据渲染操作

    {{xxx}} 基本的插值表达式 插值表达式 使用两个大括号 {{ data中定义的数据名 }} 可以将数据插入到指定的位置 这种写法不仅可以显示data属性里定义的值,也可以书写js中的表达式,可以 ...

  9. Windows phone 8 学习笔记

    Windows phone 8 学习笔记(1) 触控输入  http://www.apkbus.com/android-138547-1-1.html Windows phone 8 学习笔记(2) ...

随机推荐

  1. boost计算随机数和计算crc32简单示例

    boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost计算随机数和计算crc32简单示例 2013-02-18 17:14 10 ...

  2. SilkTest Q&A 10

    92. 如何把单个表达式分两行来写? 答案1: 使用Shift + Enter 答案2: 很容易在online help里面找到答案: 1)      line break in code 2)    ...

  3. android.graphics包中的一些类的使用

    游戏编程相关参考 Matrix学习系列: http://www.moandroid.com/?p=1781 Android画图学习总结系列: http://www.moandroid.com/?p=7 ...

  4. 无法安装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 ...

  5. C++ 载入dll

    1.新建一个项目生成dll 首先我们新建一个项目生成一个Dynamic Library(动态链接库) dll 里面非常简单,只有一个add方法.等下我们就要在其他项目里尝试载入这个dll,调用里面的这 ...

  6. MongoDB -- 更新

    $pull: db.collection.update( <query>, { $pull: { <arrayField>: <query2> } } ) $pul ...

  7. Delphi xe7并行编程快速入门(三篇)

    现在多数设备.计算机都有多个CPU单元,即使是手机也是多核的.但要在开发中使用多核的优势,却需要一些技巧,花费时间编写额外的代码.好了,现在可以使用Delphi做并行编程了. 在Delphi.C++ ...

  8. 打造你自己ajax上传图片

    今天,我们需要的图片上传插件,但是,互联网不提供符合他们的需要和易于使用的.所以我写了自己. 方法1,只使用jquery代码,.代码例如以下 <p> <label>上传图片&l ...

  9. POJ 3176:Cow Bowling

    Cow Bowling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13464   Accepted: 8897 Desc ...

  10. 关于PHP的内置服务器的使用

    今天刚开始正式学习PHP(之前有一点了解),推荐学习的网站是w3school.一开始不知道tomcat服务器不支持PHP脚本,直接把.php文件放到tomcat里面去运行,结果嵌入的php代码段没有什 ...