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 的数据操作将在其它随笔中说明。

  • 相关阅读:
    PHP基本的语法以及和Java的差别
    Linux 性能測试工具
    【Oracle 集群】Linux下Oracle RAC集群搭建之Oracle DataBase安装(八)
    【Oracle 集群】Oracle 11G RAC教程之集群安装(七)
    【Oracle 集群】11G RAC 知识图文详细教程之RAC在LINUX上使用NFS安装前准备(六)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之缓存融合技术和主要后台进程(四)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)
    Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之ORACLE集群概念和原理(二)
    【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
  • 原文地址:https://www.cnblogs.com/xiaoshi3003/p/3754571.html
Copyright © 2011-2022 走看看