Xamarin逆引きTips
Plugins for Xamarinを使いこなすには?(ファイルシステム編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、簡単にファイルの入出力が行える「PCL Storage」プラグインを説明する。
皆さんは、Xamarin.Formsでデバイス固有の機能を簡単に利用できるライブラリ群がプラグインとして提供されているのをご存じだろうか? 「Plugins for Xamarin」と呼ばれるそれらのプラグインは、最初に2014年末に開催されたXamarin Plugin Contestで募集されたことにより数が増え、そのときの成果物を含めて現在では多数のプラグインがGitHub上で公開されている。
今回から複数回にわたり、Plugins for Xamarinの中からいくつかのプラグインを紹介していこうと思う。これらのプラグインは全てPCL(ポータブル・クラス・ライブラリ)で用意されている。PCLについては「インサイドXamarin: 第13回 Xamarinと、ポータブル・クラス・ライブラリ(PCL)」を参照してほしい。
PCLStorageの経緯
初回である今回は、簡単にファイルの入出力ができる、PCL Storage(GitHub)を紹介する*1。
- *1 本稿のサンプルは、Windows 10 Pro上のVisual Studio 2015 Update 1を使用している。
作者によると、このライブラリを作成した背景は、アプリケーションのローカルストレージ領域にアクセスするAPIが.NETプラットフォーム間で異なることにあるようだ。具体的には、フルの.NETではSystem.IO
名前空間のAPI、SilverlightやWindows PhoneではSystem.IO.IsolatedStorage
名前空間のAPI、WinRTではWindows.Storage
名前空間のAPIというように、プラットフォームごとに異なるAPIを利用しなければならず、コードを共通化できないという課題がある。
また、「TIPS:Xamarin.iOS/Androidでアプリの設定情報を保存するには?」でも紹介されているように、iOS/Android向けのXamarin開発では.NET APIのIsolatedStorage
が使用できるものの、PCLに含めることはできない。PCLでストレージにアクセスするために各OSネイティブAPIのNSUserDefaults
/SharedPreference
を使用する場合には、「TIPS:Xamarin.Formsからプラットフォーム固有の機能を利用するには?(DependencyService利用)」で説明されているように、DependencyService
を使用する必要があり、手間がかかる(※参考: DependencyService
を使用してストレージへのアクセスを共通化する方法は「Xamarinの開発者向けドキュメント(英語)」を参照してほしい)。
PCLStorageは、そういった「プラットフォーム間のAPIの違い」という課題を乗り越え、「PCLでDependencyService
を使用する」という手間を解消してくれる。
PCLStorageのインストール
まずは、各プロジェクトにPCLStorageをインストールしよう。これはNuGetを使って簡単にできる。
Visual StudioでXamarin.Formsのプロジェクトを開き、一番上のソリューションアイコンを右クリックして(表示されたコンテキストメニューの)[ソリューションの NuGet パッケージの管理]をクリックする(図1)。
[参照]タブで「PCLStorage」を検索し、PCLStorageを全てのプロジェクトに[インストール]する(図2)。
図3のような確認ダイアログが表示されるので[OK]ボタンをクリックすると、各プロジェクトにライブラリがインストールされる。
以上でインストールは完了だ。
次に、PCLStorageを使ったファイルの保存と読み込み方法を説明しよう。
ファイルの保存
次のコードでファイルの保存ができる(※使われている各クラス/インターフェースはPCLStorage
名前空間に所属する)。
using PCLStorage;
IFolder rootFolder = FileSystem.Current.LocalStorage; //<- 1
IFile file = await rootFolder.CreateFileAsync("data.txt", CreationCollisionOption.ReplaceExisting); // <- 2
await file.WriteAllTextAsync("保存するテキスト");
|
コードは難しくないので詳細な説明は割愛し、注意してほしいポイントだけ説明しておこう。
1のFileSystem.Current.LocalStorage
プロパティでローカルストレージとなるフォルダー(=IFolder
オブジェクト)を取得する。なおWinRTではFileSystem.Current.RoamingStorage
プロパティ(=ローミングデータ用のストレージ)も利用できる。
2のIFolder
オブジェクトのCreateFileAsync(string desiredName, CreationCollisionOption option)
メソッド(戻り値はTask<IFile>
型)でファイルを作成する。作成時にファイル名が衝突した際の挙動を決めるオプションであるCreationCollisionOption
列挙体には、
GenerateUniqueName
: 「name (2).txt」という形式でユニークな名前を付けてファイルを作成するReplaceExisting
: 新規の空のファイルで、既存のファイルを置き換えるFailIfExists
: 既存のファイルが存在する場合は例外を投げるOpenIfExists
: 既存のファイルが何であれ、それを開く
という値が用意されている。
ファイルの読み込み
次のコードでファイルの読み込みができる。
using PCLStorage;
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFile file = await rootFolder.GetFileAsync("data.txt");
string saveddata = await file.ReadAllTextAsync();
|
こちらも注意してほしいポイントだけ説明する。
IFolder
オブジェクトのGetFileAsync
メソッドを呼び出したとき、対象のファイルが存在しない場合は例外が発生する。これを回避するために、
ExistenceCheckResult res = await rootFolder.CheckExistsAsync("data.txt");
というコードで事前にファイルの有無をチェックをしておくとよいだろう。戻り値の型となっているExistenceCheckResult
列挙体には、
NotFound
: 指定された名前/パスのファイルが存在しないFileExists
: 指定された名前/パスのファイルが存在するFolderExists
: 指定された名前/パスのフォルダーが存在する
という値が用意されている。
まとめ
PCLStorageを使用することで、iOS/Android/UWP/Windows Phoneなどでファイルの保存、読み込み、削除、更新、リネーム、移動などがPCLの単一コードで簡単に行えるようになる。保存・読み込み以外のAPIについてはGitHubのReadme(英語)を参照してほしい。
参考までに、iOS/Android/UWP/Windows PhoneアプリとPCLで構成されるサンプルコードを、下記のリンク先にアップしているので、ぜひ参照してほしい。
以下に各プラットフォームでの実行例の画面を示しておく。
※以下では、本稿の前後を合わせて5回分(第60回~第64回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
60. XamarinのUIやコードの実行結果を簡単に確認できる「Sketches」を使うには?
Xamarin.Formsのレイアウトなどを、ビルドすることなくREPL環境で手軽に確認できるSketchesの使い方を紹介する。
62. 【現在、表示中】≫ Plugins for Xamarinを使いこなすには?(ファイルシステム編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、簡単にファイルの入出力が行える「PCL Storage」プラグインを説明する。
63. Plugins for Xamarinを使いこなすには?(GPS編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinを複数回にわたって紹介していく。今回は、GPSの機能を使える「Geolocator」プラグインを説明する。
64. Plugins for Xamarinを使いこなすには?(Device Motion ― 加速度センサー/ジャイロスコープセンサー編)
デバイス固有の機能に簡単にアクセスできるPlugins for Xamarinの一つ、「Device Motion Plugin」プラグインを紹介。今回は、Accelerometer(加速度)センサー、Gyroscope(ジャイロスコープ)センサーの機能を使う方法を説明する。