このチュートリアルでは、Entity Framework Core を使用して SQLite データベースに対してデータ アクセスを実行する Xamarin.Forms アプリケーションを作成します。
チュートリアルに従うには、Windows 上の Visual Studio または Visual Studio for Mac を使用します。
アドバイス (if "Tip" refers to advice) チップ (if "Tip" refers to a gratuity) (Note: Only one of these should be selected based on the appropriate context.)
この記事の サンプルは、GitHubで確認できます。
前提 条件
次のいずれかをインストールします。
- Visual Studio 2019 バージョン 16.3 以降 、このワークロードで します。
- .NET を使用したモバイル開発
- Visual Studio for Mac
この ドキュメントでは、各プラットフォームに 詳細なインストール手順について説明します。
サンプル プロジェクトをダウンロードして実行する
このサンプル アプリケーションを実行して調べるには、GitHub でコードをダウンロードします。
ダウンロードしたら、Visual Studio または Visual Studio for Mac で EFGettingStarted.sln
ソリューション ファイルを開き、任意のプラットフォームでアプリケーションを実行します。
アプリが最初に起動すると、ローカルの SQLite データベースにブログを表す 2 つのエントリが設定されます。
のスクリーンショット
ツール バーの [ 追加] ボタンをクリックします。
新しいブログに関する情報を入力できる新しいページが表示されます。
すべての情報を入力し、ツール バー [ 保存] をクリックします。 新しいブログはアプリの SQLite データベースに保存され、一覧に表示されます。
リスト内のいずれかのブログ エントリをクリックすると、そのブログの投稿を確認できます。
のスクリーンショット
ツール バー [ の追加] をクリックします。
その後、新しいブログ投稿に関する情報を入力できるページが表示されます。
のスクリーンショット
すべての情報を入力し、ツール バーの [保存] をクリックします。
新しい投稿は、前の手順でクリックしたブログ投稿に関連付けられ、アプリの SQLite データベースに保存され、一覧に表示されます。
ブログリストページに戻ります。 ツールバー [すべての を削除]をクリックします。 その後、すべてのブログとそれに対応する投稿がアプリの SQLite データベースから削除されます。
コードを調べる
次のセクションでは、Xamarin.Forms で EF Core を使用して SQLite データベースからデータを読み取り、作成、更新、および削除するサンプル プロジェクトのコードについて説明します。
Xamarin.Forms のトピックデータを表示する とページ間を移動するについて理解していることを前提としています。
大事な
Entity Framework Core ではリフレクションを使用して、リリース モードの構成中に Xamarin.iOS リンカーが取り除く可能性がある関数を呼び出します。 これは、2 つの方法のいずれかで回避できます。
- 1 つ目は、iOS Build オプションで 追加の mtouch 引数に
--linkskip System.Core
を追加します。 - または、Xamarin.iOS リンカーの動作 を iOS Build オプションで
Don't Link
に設定します。 この記事では、Xamarin.iOS で動作を設定する方法など、Xamarin.iOS リンカー の詳細について説明します。 (このアプローチは、ストアからの拒否につながる可能性があるため、理想的ではありません)。
Entity Framework Core NuGet パッケージ
EF Core で Xamarin.Forms アプリを作成するには、対象とする EF Core データベース プロバイダーのパッケージを Xamarin.Forms ソリューション内のすべてのプロジェクトにインストールします。 このチュートリアルでは、SQLite プロバイダーを使用します。
Xamarin.Forms ソリューションの各プロジェクトには、次の NuGet パッケージが必要です。
Microsoft.EntityFrameworkCore.Sqlite
モデル クラス
EF Core を介してアクセスされる SQLite データベース内の各テーブルは、クラスでモデル化されます。 このサンプルでは、Models
フォルダーにある Blog
と Post
の 2 つのクラスを使用します。
モデル クラスは、データベース内のモデル列のプロパティのみで構成されます。
Blog.cs
using System; using System.Collections.Generic; namespace EFGetStarted { public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } = new List<Post>(); } }
Posts
プロパティは、Blog
とPost
の間の親子関係を定義します。Post.cs
using System; namespace EFGetStarted { public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } }
BlogId
プロパティとBlog
プロパティは、Post
のインスタンスの親Blog
オブジェクトに関連付けられます。
データ コンテキスト
BloggingContext
クラスは Services
フォルダーにあり、EF Core DbContext
クラスから継承されます。
DbContext
は、データベースクエリと変更をグループ化するために使用されます。
using System;
using System.IO;
using Microsoft.EntityFrameworkCore;
using Xamarin.Essentials;
namespace EFGetStarted
{
public class BloggingContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
public BloggingContext()
{
SQLitePCL.Batteries_V2.Init();
this.Database.EnsureCreated();
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
string dbPath = Path.Combine(FileSystem.AppDataDirectory, "blogs.db3");
optionsBuilder
.UseSqlite($"Filename={dbPath}");
}
}
}
-
DbSet
型のこのクラスの両方のプロパティは、ブログと投稿を表す基になるテーブルの操作に使用されます。 - iOS で SQLite を開始するには、コンストラクターで
SQLitePCL.Batteries_V2.Init()
が必要です。 -
OnConfiguring
関数は、物理デバイス上の SQLite データベースの場所を設定します。
作成、読み取り、更新、削除 &
EF Core を使用して SQLite にアクセスするアプリのインスタンスを次に示します。
お読みください
すべてのレコードを返します。
BlogsPage.xaml.cs
のOnAppearing
関数は、すべてのBlog
レコードを返し、それらをList
変数に格納します。using (var blogContext = new BloggingContext()) { var theBlogs = blogContext.Blogs.ToList(); }
特定のレコードを返します。
PostsPage.xaml.cs
のOnAppearing
関数は、特定のBlogId
を含むレコードPost
返します。using (var blogContext = new BloggingContext()) { var postList = blogContext.Posts .Where(p => p.BlogId == BlogId) .ToList(); }
創造する
- 新しいレコードを挿入します。
AddBlogPage.xaml.cs
のSave_Clicked
関数は、SQLite データベースに新しいBlog
オブジェクトを挿入します。var blog = new Blog { Url = blogUrl.Text }; using (var blogContext = new BloggingContext()) { blogContext.Add(blog); await blogContext.SaveChangesAsync(); }
更新
- 既存のレコードを更新します。
AddPostPage.xaml.cs
のSave_Clicked
関数は、既存のBlog
オブジェクトを新しいPost
で更新します。var newPost = new Post { BlogId = BlogId, Content = postCell.Text, Title = titleCell.Text }; using (var blogContext = new BloggingContext()) { var blog = await blogContext .Blogs .FirstAsync(b => b.BlogId == BlogId); blog.Posts.Add(newPost); await blogContext.SaveChangesAsync(); }
削除
- 子レコードへの連鎖を持つすべてのレコードを削除します。
BlogsPage.xaml.cs
のDeleteAll_Clicked
関数は、SQLite データベース内のすべてのBlog
レコードを削除し、その削除をすべてのBlog
子Post
レコードにカスケードします。using (var blogContext = new BloggingContext()) { blogContext.RemoveRange(blogContext.Blogs); await blogContext.SaveChangesAsync(); }
次の手順
この概要では、Xamarin.Forms アプリケーションを使用して Entity Framework Core を使用して SQLite データベースにアクセスする方法について説明しました。