Windows Phone 8.1 數據處理

Windows Phone 8.1 應用的數據存儲位置包括:html

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

附張圖:數組


 

(1)Installation Folderapp

Installation Folder 也就是開發者在項目裏本身添加的文件,只能進行讀操做ide

好比項目結構爲:this

要使用 Images 文件夾裏的圖片,則能夠在 XAML 中這樣寫:spa

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

若要在 C# 代碼中使用,則要在文件路徑前加 ms-appx:///code

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

注意:文件的生成操做爲內容orm

 

(2)ApplicationData視頻

ApplicationData 也就是應用的獨立存儲,可自由進行讀寫操做,分爲如下三個區域:htm

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}\n{1}\n{2}\n", 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 的數據操做將在其它隨筆中說明。

相關文章
相關標籤/搜索