M4: Files and Storage in Windows Phone 8

bawltherapistSoftware and s/w Development

Dec 13, 2013 (3 years and 10 months ago)

109 views

M4: Files and Storage in
Windows Phone 8

Target Agenda | Day 1

Module and

Topic
| 10
-
minute breaks after each session / 60
-
minute “meal break”

Planned

Duration

1a
-

Introducing
Windows Phone 8 Application
Development | Part 1

50:00

1b
-

Introducing Windows Phone 8 Application Development | Part 2

50:00

2
-

Designing

W
indows
Phone
Apps

50:00

3
-

Building Windows Phone Apps

50:00

4
-

Files and Storage on Windows
Phone
8

50:00


Meal Break | 60
-
minutes

60:00

5
-

Windows
Phone 8
Application Lifecycle

50:00

6
-

Background Agents

25:00

7
-

Tiles and Lock Screen Notifications

25:00

8
-

Push Notifications

30:00

9
-

Using Phone Resources on Windows Phone 8

50:00

Target Agenda | Day 2

Module and

Topic
| 10
-
minute breaks after each session / 60
-
minute “meal break”

Planned

Duration

10

-

App to App Communication

35:00

11
-

Network Communication on Windows
Phone
8

50:00

12
-

Proximity Sensors and Bluetooth

35:00

13
-

Speech Input on Windows Phone 8

35:00

14
-

Maps and

Location on Windows Phone 8

35:00

15
-

Wallet Support

25:00

16
-

In App Purchasing

25:00


Meal Break | 60
-
minutes

60:00

17
-

The Windows
Phone
Store

50:00

18
-

Enterprise Applications in Windows Phone 8: Architecture and Publishing

50:00

19
-

Windows 8 and Windows Phone 8 Cross Platform Development

50:00

20


Mobile Web

50:00


WP7.1IsolatedStorage
and IsolatedStorageSettings

APIs


“Local Storage” and “Isolated Storage”


Windows.Storage

(Windows Phone Runtime) programming


Special Folders


Shared/Media


Shared/
ShellContent


Shared/Transfers


Exploring the local folder with ISET

Using Removable SD cards


Module Agenda

Not Covered in this Module…


Local Database


No change from WP 7.1


See these Jump Start modules:


http://channel9.msdn.com/Series/Mango
-
Jump
-
Start/Mango
-
Jump
-
Start
-
08a
-
Application
-
Data
-
Storage
-
on
-
Windows
-
Phone
--
Part
-
1



http://channel9.msdn.com/Series/Mango
-
Jump
-
Start/Mango
-
Jump
-
Start
-
08b
-
Application
-
Data
-
Storage
-
on
-
Windows
-
Phone
-
Part
-
2


SQLite database (native only)

Persistent Storage in
Windows Phone 8

Local Data Storage: Overview



Package Manager installs
all app files into the
Installation Folder


Read
-
only access from app


Read
-
only reference
database




Apps store data in

Local Folder


Settings and properties in
the app dictionary


Unstructured data in
Isolated Storage files


Structured data in
database files



Application

Settings File

App

Application

Files

Package
Manager

Installation
Folder

WP7.1: “App Data”

WP8 Storage
APIs or

WP7
Isolated
Storage APIs

Install

DB

Database file

DB

Database

File (r/o)

File Type/ API

Installation
Folder

Local Folder

Example

Local Database data
context

appdata
:/

isostore
:/

MyDataContext

db

=

new

MyDataContext

(
"
isostore
:/
mydb.sdf
"
)

Files access using
WP7.1 Isolated
Storage API

not supported

StorageFile

and
StorageFolder

APIs

var
isf

=

IsolatedStorageFile
.GetUserStoreForApplication
()

File access using
Windows.Storage


API via URIs

ms
-
appx
:///

ms
-
appdata
:///local/

var

file =
await

Windows.StorageFile.GetFileFromApplicationUriAsync
(

new

Uri
(
"
ms
-
appdata
:///local/AppConfigSettings.xml"
));

File access using
Windows.Storage

API
via
StorageFolder

references

Windows.

ApplicationModel
.

Package.Current
.

InstalledLocation


Windows.Storage
.

ApplicationData
.

Current.

LocalFolder


var

localFolder

=
Windows.Storage.
ApplicationData
.Current.LocalFolder
;


Windows.Storage.
StorageFile

storageFile

=

await

localFolder.GetFileAsync
(
"
CaptainsLog.store
"
);

Different Methods For Addressing Storage Locations


Three ways of getting a reference to the same file:

//
WP7.1
IsolatedStorage

APIs

var

isf

=
IsolatedStorageFile
.GetUserStoreForApplication
();

IsolatedStorageFileStream

fs

=
new

IsolatedStorageFileStream
(
"
CaptainsLog.store
"
,
FileMode
.Open
,
isf
));

...


// WP8 Storage APIs using URI

StorageFile

storageFile

=
await

Windows.Storage.
StorageFile
.GetFileFromApplicationUriAsync
(


new

Uri
(
"
ms
-
appdata
:///local/
CaptainsLog.store

"
));

...


// WP8 Storage APIs

Windows.Storage.
StorageFolder

localFolder

=
Windows.Storage.
ApplicationData
.Current.LocalFolder
;

Windows.Storage.
StorageFile

storageFile

=
await

localFolder.GetFileAsync
(
"
CaptainsLog.store
"
);

...


WP8 File Access Alternatives

Storing Data using WP7.1
Isolated Storage APIs

Isolated Storage Classes


The
IsolatedStorage

classes are all in the
System.IO.IsolatedStorage

namespace


IsolatedStorageFile


Represents an isolated storage area containing files and directories


IsolatedFileStream


Exposes a file stream access to a file stored within isolated storage


IsolatedStorageSettings


Dictionary<(Of <(
TKey
,
TValue
>)>) that stores key
-
value pairs

in isolated storage

Saving Data

private

void

saveGameToIsolatedStorage(
string

message)

{


using

(
IsolatedStorageFile

isf =


IsolatedStorageFile
.GetUserStoreForApplication
())


{


using

(
IsolatedStorageFileStream

rawStream

=
isf.CreateFile
(
"
MyFile.store
"
))


{


StreamWriter

writer =
new

StreamWriter
(
rawStream
);


writer.WriteLine
(message);
// save the message


writer.Close
();


}


}

}

Loading Data

private string

loadString
()

{


string

result =
null
;


using

(
IsolatedStorageFile

isf

=
IsolatedStorageFile
.GetUserStoreForApplication
())


{


if

(
isf.FileExists
(
"
Myfile.store
"
)


{


using

(
IsolatedStorageFileStream

rawStream

=
isf.OpenFile
(filename,


System.IO.
FileMode
.Open
))


{



StreamReader

reader =
new

StreamReader
(
rawStream
);


result
=
reader.ReadLine
();


reader.Close
();


}


}


}


return

result;

}

Demo 1: Using

Isolated Storage

Application Settings


If you just want to store setting information


Username = “Fred”


TextColor

= “Green”


Y
ou can use the
ApplicationSettings

object in Isolated Storage


You use this as you would a dictionary


You then write the object to persistent storage

Saving Data in Settings


The storage works as a dictionary


But you have to remember to call Save when you have finished adding keys

void

saveString(
string

message,
string

name
)

{



IsolatedStorageSettings
.ApplicationSettings
[name
]
=
message;


IsolatedStorageSettings
.ApplicationSettings.Save();

}


Loading from Settings


Test for the key before you try to find it or you will get an exception thrown

string

loadString(
string

name)

{



if

(
IsolatedStorageSettings
.ApplicationSettings.Contains
(name
))



{



return

(
string
)
IsolatedStorageSettings
.ApplicationSettings
[name
];


}


else



{


return

null
;



}

}

Demo 2: Using

Settings Storage

Using Windows Phone
Runtime Storage

Windows.Storage

Classes


Windows Phone Runtime
storage classes are in the
Windows.Storage

namespace


StorageFolder


Represents
a storage
area containing files and directories


StorageFile


Represents a
file and provides methods for manipulating them


Not supported on Windows Phone 8:


ApplicationData.LocalSettings


Use custom file or
IsolatedStorageSettings

Saving Data


Using
StorageFolder

using

System.IO;

using

Windows.Storage
;




private

async

void

saveToLocalFolderAsync
(
string

message)

{



//
Get a reference to the Local Folder


StorageFolder

localFolder

=
ApplicationData
.Current.LocalFolder
;



//
Create the file in the local folder, or if it already exists, just open it


StorageFile

storageFile

=
await

localFolder.CreateFileAsync
(
"
Myfile.store
"
,


CreationCollisionOption
.OpenIfExists
);




Stream

writeStream

=
await

storageFile.OpenStreamForWriteAsync
();


using

(
StreamWriter

writer =
new

StreamWriter
(
writeStream
))


{



await

writer.WriteAsync
(
logData
);


}

}

Loading Data

using

System.IO;

using

Windows.Storage
;




private
async

string

loadStringAsync
()

{


string

theData

=
string
.Empty
;




//
Get a reference to the
file in the Local
Folder



StorageFolder

localFolder

=
ApplicationData
.Current.LocalFolder
;


StorageFile

storageFile

=
await

localFolder.GetFileAsync
(

Myfile.store
"
));



// Open
it and read the contents


Stream

readStream

=
await

storageFile.OpenStreamForReadAsync
();


using

(
StreamReader

reader =
new

StreamReader
(
readStream
))


{


theData

=
await

reader.ReadToEndAsync
();


}



return

theData
;

}

Accessing Files Using
ms
-
appdata
:///local/
or
ms
-
appx
:///


//
There's no
FileExists

method in
WinRT
, so have to try to
open it
and catch
exception
instead


StorageFile

storageFile

=
null
;


bool

fileExists

=
false
;



try


{


// Try to open file using URI


storageFile

=
await

StorageFile
.GetFileFromApplicationUriAsync
(


new

Uri
(
"
ms
-
appdata
:///
local/
Myfile.store
"
));



fileExists

=
true
;


}


catch

(
FileNotFoundException
)


{


fileExists

=
false
;


}



if

(!
fileExists
)



{


await

ApplicationData
.Current.LocalFolder.CreateFileAsync
(
"
Myfile.store
"
,


CreationCollisionOption
.FailIfExists
);



}



...


Windows Phone 8 implementation of
Windows.Storage

is a subset of Windows 8
WinRT


All data storage uses the
LocalFolder

(equivalent to WP7.1
IsolatedStorage
)


Not Supported:


Roaming Data Store:
ApplicationData.Current.RoamingFolder


Temporary Data Store:
ApplicationData.Current.TemporaryFolder


Local Settings:
ApplicationData.Current.LocalSettings


Roaming Settings:
ApplicationData.Current.RoamingSettings

Windows Phone 8


Windows 8 Compatibility

Only
LocalFolder

Supported


In Windows 8, you can programmatically load an Image file that you have included in your
app package into a XAML <Image> element using the URI syntax, as follows:



RecipeImage.Source

=
new

System.Windows.Media.Imaging.
BitmapImage
(



new

Uri
(
@"
ms
-
appx
:///Images/
french
/French_1_600_C.jpg"
,
UriKind
.RelativeOrAbsolute
));


In Windows Phone 8, you cannot use the URI syntax in this way. Continue to use the
relative path to the image, as in Windows Phone OS 7.1:



RecipeImage.Source

=


new

System.Windows.Media.Imaging.
BitmapImage
(
"/Images/
french
/French_1_600_C.jpg"
);




Windows Phone 8


Windows 8 Compatibility

Programmatically Accessing Image Files

Demo 3: Using

Windows.Storage

Special Folders

Local Folder


All read
-
write I/O operations restricted to

local folder


Create a files and folder structure hierarchy


Use Isolated Settings storage to store
application settings

Reserved Folders


In addition to general data storage, the local folder is
used for the following special
-
use scenarios:


Shared/Media
-

Apps can use this folder to display
album art in the Universal Volume Control (UVC)
while playing background audio


Shared/
ShellContent

-

Background images for Tiles
can be stored in isolated storage, but must be
located in this folder or a subfolder of it


Shared/Transfers


Storage area used by the
Background File Transfer service

Data Serialization

and Deserialization

Data Serialization


Data persistence and the app lifecycle


App Launch


Deserialize

data from Isolated Storage


App being dormant/
tombstoned


Serialize persistent data to Isolated Storage


App being reactivated


Deserialize

data from Isolated Storage


App being terminated


Serialize persistent data to Isolated Storage

Not running

Launching

Running

Deactivated
/Closing

Why Serialize?


Serializers

write the properties of a collection of objects
into a file so they can be stored in persistent storage


Deserializers

reverse this: read data out of a file and use it
to ‘re
-
hydrate’ a collection of in
-
memory objects


Many different
serializers

are available:


XmlSerializer


DataContractSerializer


DataContractJsonSerializer


Third party…

Serialization using DataContractSerializer



public

class

MyDataSerializer
<
TheDataType
>


{


public

static

async

Task

SaveObjectsAsync
(
TheDataType

sourceData
,
String

targetFileName
)


{


StorageFile

file =
await

ApplicationData
.Current.LocalFolder.CreateFileAsync
(


targetFileName
,
CreationCollisionOption
.ReplaceExisting
);


var

outStream

=
await

file.OpenStreamForWriteAsync
();



DataContractSerializer

serializer

=
new

DataContractSerializer
(
typeof
(
TheDataType
));


serializer.WriteObject
(
outStream
,
sourceData
);


await

outStream.FlushAsync
();


outStream.Close
();


}



...


}

List
<
MyDataObjects
>
myObjects

= ...

await

MyDataSerializer
<
List
<
MyDataObjects
>>.
SaveObjectsAsync
(
myObjects
,
"
MySerializedObjects.xml
"
);


To use:

Deserialization
using
DataContractSerializer



public

class

MyDataSerializer
<
TheDataType
>


{



public

static

async

Task
<
TheDataType
>
RestoreObjectsAsync
(
string

fileName
)


{


StorageFile

file =
await

ApplicationData
.Current.LocalFolder.GetFileAsync
(
fileName
);


var

inStream

=
await

file.OpenStreamForReadAsync
();



//
Deserialize

the objects.


DataContractSerializer

serializer

=


new

DataContractSerializer
(
typeof
(
TheDataType
));


TheDataType

data = (
TheDataType
)
serializer.ReadObject
(
inStream
);


inStream.Close
();



return

data;


}


...


}

List
<
MyDataObjects
>
myObjects


=
await

MyDataSerializer
<
List
<
MyDataObjects
>>.
RestoreObjectsAsync
(
"MySerializedObjects.xml
"
);


To use:

Demo 4: Serialization

to Local Folder

Tools: Isolated

Storage Explorer

Isolated Storage Explorer


Isolated Storage Explorer is a command
-
line tool you use to list, copy, and replace files and
directories in Isolated Storage


Can be used on emulator or device


Can be used for applications that target Windows Phone OS 7.0, 7.1 and 8.0


Located at Program Files (x86)
\
Microsoft SDKs
\
Windows Phone
\
v8.0
\
Tools
\
IsolatedStorageExplorerTool



Syntax:


ISETool.exe <
ts|rs|dir
[:device
-
folder]> <
xd|de
> <Product GUID> [<desktop
-
path>]


ts


Take snapshot


rs


Restore snapshot


dir


Lists the files or

directories


xd



target the emulator


de


target device


from the WPAppManifest.xml

file for
the app


Desktop
-
path


directory on your
computer where isolated storage
files are written t o or copied from

Isolated Storage
Explorer Example

Accessing SD Cards

External Storage (SD Card)


Windows Phone 8 devices support SD cards


App can discover what files are stored on a storage card


Must declare the ID_CAP_REMOVABLE_STORAGE capability in the application

manifest file


Cannot write files
-

Access is Read Only


Can only open file types for which your app has registered a file association in
WMAppManifest.xml


You can only open files for which you have declared a File Association in WMAppManifest.xml


Edit WMAppManifest.xml using the XML editor, not the
M
anifest editor


Add a
FileTypeAssociation

element inside the
Extensions

element


The
Extensions

element must follow immediately after the
Tokens

element


Note that the
ContentType

attribute on the
FileType

element is required

<
Extensions
>


<
FileTypeAssociation

Name
=

foo
"

TaskID
=
"
_default
"

NavUriFragment
=
"
fileToken
=%s
"
>


<
SupportedFileTypes
>


<
FileType

ContentType
="
application/foo"
>
.foo
</
FileType
>


</
SupportedFileTypes
>


</
FileTypeAssociation
>

</
Extensions
>


Declare a File Association to WMAppManifest.xml

API

Description

ExternalStorageDevice


Represents an SD card. Use the
ExternalStorageDeviceExternalStorageID
()
property to uniquely identify a card.

ExternalStorage.GetExternalStorage
DevicesAsync
()

Returns a collection of SD cards that are inserted in the phone.

This collection will contain no more than one SD card.

ExternalStorageFolder


Represents a folder on the SD card. Use the
ExternalStorageFolderPath
()
property to access the folder later.

ExternalStorageFile


Represents a file on the SD card. Use the
ExternalStorageFilePath
()
property to access the file later.

ExternalStorageDeviceGetFile

Async
() and
ExternalStorageDeviceGetFolder

Async
()

Obtain a file or folder directly from the external storage device object.

External Storage APIs

Best Practices

Quota Management


There are no quotas on Windows Phone!


Applications must make careful use of space


Use only is necessary


Be transparent about storage usage


Manage application data


Delete temporary data and files when no longer required


Consider synchronizing or archiving data to the cloud to reduce device storage

Serialization and Threads


If your status information is a complex object you can easily save the object by

serializing it


Serialization may slow down the saving and loading of data


You should consider the use of threading in this situation


Perform your loading and saving on a separate thread so that the application

stays responsive

The information herein is for informational
purposes only an represents the current view of
Microsoft Corporation as of the date of this
presentation. Because Microsoft must respond
to changing market conditions, it should not be
interpreted to be a commitment on the part of
Microsoft, and Microsoft cannot guarantee the
accuracy of any information provided after the
date of this presentation.

© 2012
Microsoft Corporation.

All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or tra
dem
arks in the U.S. and/or other countries.

MICROSOFT
MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE IN
FORMATION
IN THIS PRESENTATION.