当前位置:首页 > 操作系统 > Windows

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 中这样写:

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

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

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

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

 

(2)ApplicationData

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

1)Local(Folder,Settings)

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

使用方法非常简单:

StorageFolder folder =<span> ApplicationData.Current.LocalFolder;
ApplicationDataContainer settings </span>= ApplicationData.Current.LocalSettings;

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

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

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

ApplicationDataContainer settings =<span> ApplicationData.Current.LocalSettings;

settings.Values[</span><span>"</span><span>some</span><span>"</span>] = <span>"</span><span>some</span><span>"</span><span>;

</span><span>if</span>( settings.Values.ContainsKey(<span>"</span><span>some</span><span>"</span><span>) )
{
    </span><span>string</span> some = (<span>string</span>)settings.Values[<span>"</span><span>some</span><span>"</span><span>];
}</span>

 

2)Roaming(Folder,Settings) 

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

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

            <span>public</span>
            <span> MainPage()
{
    </span>
            <span>this</span>
            <span>.InitializeComponent();

    <span>ApplicationData.Current.DataChanged </span></span>
            <span>+=</span>
            <span>
                <span> Current_DataChanged;</span>
}

</span>
            <span>private</span>
            <span>void</span> Current_DataChanged(ApplicationData sender, <span>object</span><span> args)
{
    </span><span>if</span>( localSettings.Values.ContainsKey(<span>"</span><span>test</span><span>"</span>) && roamingSettings.Values.ContainsKey(<span>"</span><span>test</span><span>"</span><span>) )
    {
        localSettings.Values[</span><span>"</span><span>test</span><span>"</span>] = roamingSettings.Values[<span>"</span><span>test</span><span>"</span><span>];
    }
}</span>

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

 

3)Temp(Folder)

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

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

 

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

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

 

(3)Credential Locker

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

使用方法:

            <span>private</span>
            <span>void</span> saveButton_Click(<span>object</span><span> sender, RoutedEventArgs e)
{
    </span><span>string</span> username =<span> idTextBox.Text.Trim();
    </span><span>string</span> password =<span> passwordBox.Password.Trim();

    PasswordCredential cred </span>= <span>new</span> PasswordCredential(<span>"</span><span>weibo</span><span>"</span><span>, username, password);

    PasswordVault value </span>= <span>new</span><span> PasswordVault();
    value.Add(cred);
}

</span><span>private</span><span>void</span> loadButton_Click(<span>object</span><span> sender, RoutedEventArgs e)
{
    PasswordVault value </span>= <span>new</span><span> PasswordVault();
    </span><span>var</span> creds = value.FindAllByResource(<span>"</span><span>weibo</span><span>"</span><span>);

    </span><span>if</span>( creds.Count != <span>0</span><span> )
    {
        </span><span>foreach</span>( <span>var</span> cred <span>in</span><span> creds )
        {
            cred.RetrievePassword();
            messageTextBlock.Text </span>+= <span>string</span>.Format(<span>"</span><span>{0}n{1}n{2}n</span><span>"</span><span>, cred.Resource, cred.UserName, cred.Password);
        }
    }
}</span>

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

 

(4)Known Folders

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

获取方法为:

StorageFolder DocumentsLibrary =<span> KnownFolders.DocumentsLibrary;
StorageFolder MusicLibrary </span>=<span> KnownFolders.MusicLibrary;
StorageFolder VideosLibrary </span>=<span> KnownFolders.VideosLibrary;
StorageFolder PicturesLibrary </span>=<span> KnownFolders.PicturesLibrary;
StorageFolder CameraRoll </span>=<span> KnownFolders.CameraRoll;
StorageFolder SavedPictures </span>=<span> KnownFolders.SavedPictures;
StorageFolder RemovableDevices </span>=<span> KnownFolders.RemovableDevices;

StorageFolder HomeGroup </span>=<span> KnownFolders.HomeGroup;
StorageFolder MediaServerDevices </span>= KnownFolders.MediaServerDevices;

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

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

 

(5)SD Card

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

获取方法为:

            <span>var</span> devices =<span> KnownFolders.RemovableDevices;
</span><span>var</span> sdCards = <span>await</span><span> devices.GetFoldersAsync();

</span><span>if</span>( sdCards.Count == <span>0</span><span> )
    </span><span>return</span><span>;

StorageFolder firstCard </span>= sdCards[<span>0</span>];

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

 

(6)备注

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

原文:http://www.cnblogs.com/xiaoshi3003/p/3754571.html


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:254677821)!

相关教程推荐

其他课程推荐