zoukankan      html  css  js  c++  java
  • Windows Phone 8.1 数据处理

    Windows Phone 8.1 应用的数据存储位置包括:

    1. Installation Folder
    2. ApplicationData
    3. Credential Locker
    4. Known Folders
    5. SD Card
    6. File System
    7. Networks

    附张图:


    (1)Installation Folder

    Installation Folder 也就是开发者在项目里自己添加的文件,只能进行读操作

    比如项目结构为:

    要使用 Images 文件夹里的图片,则可以在 XAML 中这样写:

    <Image x:Name="image" 
           Source="/Images/屏幕截图(157).png"
           Stretch="Uniform"/>

    若要在 C# 代码中使用,则要在文件路径前加 ms-appx:///

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        BitmapImage img = new BitmapImage(new Uri("ms-appx:///Images/屏幕截图(157).png"));
        image.Source = img;
    }

    注意:文件的生成操作为内容

    (2)ApplicationData

    ApplicationData 也就是应用的独立存储,可自由进行读写操作,分为以下三个区域:

    1)Local(Folder,Settings)

    保存在手机端,没有存储限制,更新应用时会保留,包括 Folder 和 Settings。

    使用方法非常简单:

    StorageFolder folder = ApplicationData.Current.LocalFolder;
    ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;

    Folder 的操作也非常简单,当然也可以通过 Stream 来操作,如下:

    StorageFolder folder = ApplicationData.Current.LocalFolder;
    await folder.CreateFileAsync("some.txt");
    await folder.CreateFolderAsync("some");
    await folder.GetFileAsync("some.txt");
    await folder.GetFolderAsync("some");
    await folder.OpenStreamForReadAsync("some.txt");
    await folder.OpenStreamForWriteAsync("some.txt", CreationCollisionOption.FailIfExists);

    而 Settings 是一个键值对数组,用以保存简单数据,类型为 <string, Object>,因此在读取数据时要对值进行拆箱:

    ApplicationDataContainer settings = ApplicationData.Current.LocalSettings;
    
    settings.Values["some"] = "some";
    
    if( settings.Values.ContainsKey("some") )
    {
        string some = (string)settings.Values["some"];
    }

    2)Roaming(Folder,Settings) 

    保存在云端 OneDrive 处,可以跨设备使用,但是有 100Kb 的限制,也包括 Folder 和 Settings。

    Roaming 数据的操作与 Local 的操作一致,需要注意的是那 100kb 的限制,以及当漫游数据发生改变时会触发的事件 DataChanged,比如可以在该事件中更新本地数据:

    public MainPage()
    {
        this.InitializeComponent();
    
        ApplicationData.Current.DataChanged += Current_DataChanged;
    }
    
    private void Current_DataChanged(ApplicationData sender, object args)
    {
        if( localSettings.Values.ContainsKey("test") && roamingSettings.Values.ContainsKey("test") )
        {
            localSettings.Values["test"] = roamingSettings.Values["test"];
        }
    }

    注意:应用必须获取了应用商店的认证才能使用数据漫游。

     

    3)Temp(Folder)

    保存在手机端的临时数据,不能保证何时被删除(如手机存储空间不足时则自动删除),只有 Folder。

    使用方法与 Local 和 Roaming 一致,不同的事它是能使用 Folder。

     

    除了以上的访问 ApplicationData 的方法外,同样的可以使用 Uri 的方式访问上述各 Folder,只需在路径前添加 ms-appdata:///:

    var localFile = StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/some.txt"));
    var roamingFile = StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///roaming/some.txt"));
    var tempFile = StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///temp/some.txt"));

    (3)Credential Locker

    Credential Locak 是一个用来保存用户账号与密码对的一个私密空间,不会被其它应用访问,同时还支持同应用的跨设备漫游。

    使用方法:

    private void saveButton_Click(object sender, RoutedEventArgs e)
    {
        string username = idTextBox.Text.Trim();
        string password = passwordBox.Password.Trim();
    
        PasswordCredential cred = new PasswordCredential("weibo", username, password);
    
        PasswordVault value = new PasswordVault();
        value.Add(cred);
    }
    
    private void loadButton_Click(object sender, RoutedEventArgs e)
    {
        PasswordVault value = new PasswordVault();
        var creds = value.FindAllByResource("weibo");
    
        if( creds.Count != 0 )
        {
            foreach( var cred in creds )
            {
                cred.RetrievePassword();
                messageTextBlock.Text += string.Format("{0}
    {1}
    {2}
    ", cred.Resource, cred.UserName, cred.Password);
            }
        }
    }

    注意:在获取密码的时候必须先调用 RetrievePassword 方法,不然获取的密码为空字符串。

    (4)Known Folders

    Known Folders 也就是手机上特有的几个文件夹,比如音乐视频文件等。

    获取方法为:

    StorageFolder DocumentsLibrary = KnownFolders.DocumentsLibrary;
    StorageFolder MusicLibrary = KnownFolders.MusicLibrary;
    StorageFolder VideosLibrary = KnownFolders.VideosLibrary;
    StorageFolder PicturesLibrary = KnownFolders.PicturesLibrary;
    StorageFolder CameraRoll = KnownFolders.CameraRoll;
    StorageFolder SavedPictures = KnownFolders.SavedPictures;
    StorageFolder RemovableDevices = KnownFolders.RemovableDevices;
    
    StorageFolder HomeGroup = KnownFolders.HomeGroup;
    StorageFolder MediaServerDevices = KnownFolders.MediaServerDevices;

    以上是可获取的所有 Known Folders,其中 HomeGroup 和 MediaServerDevices 文件夹暂时还未开放。

    注意:某些文件夹的读取需要在 appxmanifest 获取权限:

     

    (5)SD Card

    SD Card 的文件读取同样需要在 appxmanifest 获取权限。

    获取方法为:

    var devices = KnownFolders.RemovableDevices;
    var sdCards = await devices.GetFoldersAsync();
    
    if( sdCards.Count == 0 )
        return;
    
    StorageFolder firstCard = sdCards[0];

    要注意的是,对 SD Card 的文件读取需要事先在 appxmanifest 中增加文件类型关联,确定需要读取的文件类型:

    (6)备注

    关于使用 FilePicker API 与 FileSystem 的操作,以及 Networks 的数据操作将在其它随笔中说明。

  • 相关阅读:
    如何获得刚刚插入数据的id
    Ado.net怎么执行存储过程?
    SqlServer存储过程,学习
    视图view
    CTE(公用表表达式)
    事务
    over()的用法
    Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程
    Inno Setup的常用脚本
    跟武哥一起学习Spring Boot
  • 原文地址:https://www.cnblogs.com/xiaoshi3003/p/3754571.html
Copyright © 2011-2022 走看看