Xamarin.Forms ローカル データベースのチュートリアル
このチュートリアルを試行する前に、以下を正常に完了しておく必要があります。
- 初めての Xamarin.Forms アプリのビルドに関するクイックスタート。
- StackLayout のチュートリアル。
- Button のチュートリアル。
- Entry のチュートリアル。
- CollectionView のチュートリアル。
このチュートリアルでは、以下の内容を学習します。
- NuGet パッケージ マネージャーを使用して、SQLite.NET を Xamarin.Forms プロジェクトに追加する。
- データ アクセス クラスを作成する。
- データ アクセス クラスを使用する。
ローカルの SQLite.NET データベースにデータを格納する方法を示す簡単なアプリケーションを作成するには、Visual Studio 2019 または Visual Studio for Mac を使用します。 次のスクリーンショットは、最終的なアプリケーションです。
SQLite.NET を追加する
このチュートリアルを完了するには、 .NET によるモバイル開発ワークロードがインストールされた、Visual Studio 2019 (最新リリース) が必要です。 さらに、iOS でチュートリアル アプリケーションを構築するには、ペアリング済みの Mac が必要になります。 Xamarin プラットフォームのインストールについては、「Xamarin のインストール」を参照してください。 Mac ビルド ホストへの Visual Studio 2019 の接続については、「Xamarin.iOS 開発のために Mac とペアリングする」を参照してください。
Visual Studio を起動し、LocalDatabaseTutorial という名前の新しい空の Xamarin.Forms アプリを作成します。
重要
このチュートリアルの C# スニペットと XAML スニペットでは、LocalDatabaseTutorial という名前のソリューションが必要です。 別の名前を使用すると、コードをこのチュートリアルからソリューションにコピーするときに、ビルド エラーが発生します。
作成される .NET Standard ライブラリの詳細については、Xamarin.Forms クイック スタート Deep Dive の「Xamarin.Forms アプリケーションの構造」を参照してください。
ソリューション エクスプローラーで、LocalDatabaseTutorial プロジェクトを選択し、右クリックして [NuGet パッケージの管理...] を選択します。
NuGet パッケージ マネージャーで、 [参照] タブを選択し、pcl-sqlite-net NuGet パッケージを検索して選択し、 [インストール] ボタンをクリックしてプロジェクトに追加します。
Note
類似した名前を持つ NuGet パッケージが多数あります。 正しいパッケージには、次の属性があります。
- 作成者: SQLite-net
- NuGet リンク: sqlite-net-pcl
パッケージ名に関係なく、この NuGet パッケージは .NET Standard プロジェクトで使用できます。
このパッケージは、データベース操作をアプリケーションに組み込むために使用されます。
重要
SQLite.NET は、praeclarum/sqlite-net リポジトリからサポートされているサードパーティ製ライブラリです。
エラーがないようにソリューションを構築してください。
データ アクセス クラスを作成する
この演習では、データ アクセス クラスを LocalDatabaseTutorialプロジェクト追加します。これは、人に関するデータをデータベースに保持するために使用されます。
ソリューション エクスプローラーの [LocalDatabaseTutorial] プロジェクトで、
Person
という名前の新しいクラスをプロジェクトに追加します。 次に、Person.cs のテンプレート コードをすべて削除し、次のコードに置き換えます。using SQLite; namespace LocalDatabaseTutorial { public class Person { [PrimaryKey, AutoIncrement] public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } } }
このコードは、各人に関するデータをアプリケーションに格納する
Person
クラスを定義します。 データベース内の各Person
インスタンスが SQLite.NET によって付与される一意の ID 持つようにするため、ID
プロパティがPrimaryKey
とAutoIncrement
の属性によってマークされます。ソリューション エクスプローラーの [LocalDatabaseTutorial] プロジェクトで、
Database
という名前の新しいクラスをプロジェクトに追加します。 次に、Database.cs のテンプレート コードをすべて削除し、次のコードに置き換えます。using System.Collections.Generic; using System.Threading.Tasks; using SQLite; namespace LocalDatabaseTutorial { public class Database { readonly SQLiteAsyncConnection _database; public Database(string dbPath) { _database = new SQLiteAsyncConnection(dbPath); _database.CreateTableAsync<Person>().Wait(); } public Task<List<Person>> GetPeopleAsync() { return _database.Table<Person>().ToListAsync(); } public Task<int> SavePersonAsync(Person person) { return _database.InsertAsync(person); } } }
このクラスには、データを読み書きするデータベースを作成するためのコードが含まれます。 このコードでは、データベース操作をバックグラウンドのスレッドに移動する非同期 SQLite.Net API が使用されています。 さらに、
Database
コンストラクターがデータベース ファイルのパスを引数として受け取ります。 このパスは次の演習でApp
クラスによって提供されます。ソリューション エクスプローラーの [LocalDatabaseTutorial] プロジェクトで、 [App.xaml] を展開し、 [App.xaml.cs] をダブルクリックして開きます。 次に、App.xaml.cs のテンプレート コードをすべて削除し、次のコードに置き換えます。
using System; using System.IO; using Xamarin.Forms; namespace LocalDatabaseTutorial { public partial class App : Application { static Database database; public static Database Database { get { if (database == null) { database = new Database(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "people.db3")); } return database; } } public App() { InitializeComponent(); MainPage = new MainPage(); } protected override void OnStart() { // Handle when your app starts } protected override void OnSleep() { // Handle when your app sleeps } protected override void OnResume() { // Handle when your app resumes } } }
このコードは、新しい
Database
インスタンスをシングルトンとして作成するDatabase
プロパティを定義します。 データベースを格納する場所を表すローカル ファイル パスとファイル名は、引数としてDatabase
クラス コンストラクターに渡されます。重要
データベースをシングルトンとして公開することの利点は、アプリケーションが実行されている間、開いたままになる単一のデータベース接続が作成されることです。そのため、データベース操作が実行されるときにデータベース ファイルを毎回開いて閉じる労力を避けることができます。
エラーがないようにソリューションを構築してください。
データ アクセス クラスを使用する
この演習では、以前に作成したデータ アクセス クラスを使用するためのユーザー インターフェイスを作成します。
ソリューション エクスプローラーの [LocalDatabaseTutorial] プロジェクトで、 [MainPage.xaml] をダブルクリックして開きます。 次に、 [MainPage.xaml] のテンプレート コードをすべて削除し、次のコードに置き換えます。
<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="LocalDatabaseTutorial.MainPage"> <StackLayout Margin="20,35,20,20"> <Entry x:Name="nameEntry" Placeholder="Enter name" /> <Entry x:Name="ageEntry" Placeholder="Enter age" /> <Button Text="Add to Database" Clicked="OnButtonClicked" /> <CollectionView x:Name="collectionView"> <CollectionView.ItemTemplate> <DataTemplate> <StackLayout> <Label Text="{Binding Name}" FontSize="Medium" /> <Label Text="{Binding Age}" TextColor="Silver" FontSize="Small" /> </StackLayout> </DataTemplate> </CollectionView.ItemTemplate> </CollectionView> </StackLayout> </ContentPage>
このコードでは、
StackLayout
の中の 2 つのEntry
インスタンス、Button
、およびCollectionView
から構成される、ページのユーザー インターフェイスを宣言によって定義します。 各Entry
にはそのPlaceholder
プロパティが設定されており、これにより、ユーザー入力の前に表示されるプレースホルダー テキストが指定されます。Button
ではそのClicked
イベントを、次の手順で作成されるOnButtonClicked
という名前のイベント ハンドラーに設定します。CollectionView
ではそのItemTemplate
プロパティがDataTemplate
に設定されます。その場合、StackLayout
と 2 つのLabel
オブジェクトを使用して、CollectionView
の各行の外観が定義されます。Label
オブジェクトではそのText
プロパティが、各Person
オブジェクトのName
とAge
のプロパティにそれぞれバインドされます。さらに、
Entry
インスタンスとCollectionView
には、x:Name
属性で指定された名前があります。 これにより、分離コード ファイルは割り当てられた名前を使用して、これらのオブジェクトにアクセスできます。ソリューション エクスプローラーの [LocalDatabaseTutorial] プロジェクトで [MainPage.xaml] を展開し、 [MainPage.xaml.cs] をダブルクリックして開きます。 次に、 [MainPage.xaml.cs] で、
OnAppearing
オーバーライドとOnButtonClicked
イベント ハンドラーをクラスに追加します。protected override async void OnAppearing() { base.OnAppearing(); collectionView.ItemsSource = await App.Database.GetPeopleAsync(); } async void OnButtonClicked(object sender, EventArgs e) { if (!string.IsNullOrWhiteSpace(nameEntry.Text) && !string.IsNullOrWhiteSpace(ageEntry.Text)) { await App.Database.SavePersonAsync(new Person { Name = nameEntry.Text, Age = int.Parse(ageEntry.Text) }); nameEntry.Text = ageEntry.Text = string.Empty; collectionView.ItemsSource = await App.Database.GetPeopleAsync(); } }
OnAppearing
メソッドでは、データベースに格納されたデータをCollectionView
に設定します。Button
がタップされたときに実行される、OnButtonClicked
メソッドでは、両方のEntry
インスタンスをクリアし、CollectionView
のデータを更新する前に、データベースに入力されたデータを保存します。Note
OnAppearing
メソッドのオーバーライドは、ContentPage
がレイアウトされた後、それが表示される直前に実行されます。 したがって、これは Xamarin.Forms ビューのコンテンツを設定するのに適した場所です。Visual Studio ツール バーで、 [開始] ボタン ([再生] ボタンに似た三角形のボタン) を押し、選択したリモート iOS シミュレーターまたは Android エミュレーター内でアプリケーションを起動します。
データの各項目の
Button
をタップして、データのいくつかの項目を入力します。 これにより、データベースにデータが保存され、CollectionView
にデータベースのすべてのデータが再設定されます。Visual Studio で、アプリケーションを停止します。
Xamarin.Forms のローカル データベースの詳細については、「Xamarin.Forms ローカル データベース (ガイド)」を参照してください
おめでとうございます。
これでこのチュートリアルは完了です。ここでは以下の方法を学習しました。
- NuGet パッケージ マネージャーを使用して、SQLite.NET を Xamarin.Forms プロジェクトに追加する。
- データ アクセス クラスを作成する。
- データ アクセス クラスを使用する。
次の手順
Xamarin.Forms を使用してモバイル アプリケーションを作成する基本についてさらに学習するには、Web Services のチュートリアルに進んでください。
関連リンク
このセクションに問題がある場合 このセクションを改善できるよう、フィードバックをお送りください。