Xamarin.Forms 로컬 데이터베이스Xamarin.Forms Local Databases

샘플 다운로드 샘플 다운로드Download Sample Download the sample

Xamarin.Forms는 SQLite 데이터베이스 엔진을 사용하여 데이터베이스 기반 애플리케이션을 지원하기 때문에 공유 코드로 개체를 로드하고 저장할 수 있습니다. 이 문서에서는 Xamarin.Forms 애플리케이션이 SQLite.Net을 사용하여 데이터를 읽고 로컬 SQLite 데이터베이스에 데이터를 기록하는 방법을 설명합니다.Xamarin.Forms supports database-driven applications using the SQLite database engine, which makes it possible to load and save objects in shared code. This article describes how Xamarin.Forms applications can read and write data to a local SQLite database using SQLite.Net.

개요Overview

Xamarin.Forms 애플리케이션은 SQLite.NET PCL NuGet 패키지를 사용하여 NuGet에서 제공되는 SQLite 클래스를 참조하여 데이터베이스 작업을 공유 코드에 통합할 수 있습니다.Xamarin.Forms applications can use the SQLite.NET PCL NuGet package to incorporate database operations into shared code by referencing the SQLite classes that ship in the NuGet. 데이터베이스 작업은 Xamarin.Forms 솔루션의.NET 표준 라이브러리 프로젝트에서 정의할 수 있습니다.Database operations can be defined in the .NET Standard library project of the Xamarin.Forms solution.

함께 제공되는 애플리케이션 예제는 간단한 할 일 목록 애플리케이션입니다.The accompanying sample application is a simple Todo-list application. 다음 스크린샷에서는 각 플랫폼에서 샘플이 어떻게 나타나는지를 보여 줍니다.The following screenshots show how the sample appears on each platform:

Xamarin.Forms 데이터베이스 예제 스크린샷 Xamarin.Forms 데이터베이스 예제 스크린샷Xamarin.Forms database example screenshots Xamarin.Forms database example screenshots

SQLite 사용Using SQLite

Xamarin.Forms .NET 표준 라이브러리에 SQLite 지원을 추가하려면 NuGet의 검색 기능을 사용하여 sqlite-net-pcl을 찾고 최신 패키지를 설치합니다.To add SQLite support to a Xamarin.Forms .NET Standard library, use NuGet's search function to find sqlite-net-pcl and install the latest package:

NuGet SQLite.NET PCL 패키지 추가Add NuGet SQLite.NET PCL Package

비슷한 이름의 NuGet 패키지가 여러 개 있으며 정확한 패키지는 다음 특성을 포함합니다.There are a number of NuGet packages with similar names, the correct package has these attributes:

  • 만든 사람: Frank A. KruegerCreated by: Frank A. Krueger
  • ID: sqlite-net-pclId: sqlite-net-pcl
  • NuGet 링크: sqlite-net-pclNuGet link: sqlite-net-pcl

참고

패키지 이름에도 불구하고 .NET 표준 프로젝트에서도 sqlite-net-pcl NuGet 패키지를 사용합니다.Despite the package name, use the sqlite-net-pcl NuGet package even in .NET Standard projects.

참조가 추가되었으면 데이터베이스를 저장하기 위해 로컬 파일 경로를 반환하는 App 클래스에 속성을 추가합니다.Once the reference has been added, add a property to the App class that returns a local file path for storing the database:

static TodoItemDatabase database;

public static TodoItemDatabase Database
{
  get
  {
    if (database == null)
    {
      database = new TodoItemDatabase(
        Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "TodoSQLite.db3"));
    }
    return database;
  }
}

아래에 표시된 것처럼 TodoItemDatabase 생성자는 데이터베이스 파일에 대한 경로를 인수로 사용합니다.The TodoItemDatabase constructor, which takes the path for the database file as an argument, is shown below:

public TodoItemDatabase(string dbPath)
{
  database = new SQLiteAsyncConnection(dbPath);
  database.CreateTableAsync<TodoItem>().Wait();
}

데이터베이스를 싱글톤으로 노출하면 애플리케이션이 실행되는 동안 열린 상태로 유지되는 단일 데이터베이스 연결이 생성되므로 데이터베이스 작업이 수행될 때마다 데이터베이스 파일을 열거나 닫는 비용을 피할 수 있는 이점이 있습니다.The advantage of exposing the database as a singleton is that a single database connection is created that's kept open while the application runs, therefore avoiding the expense of opening and closing the database file each time a database operation is performed.

TodoItemDatabase 클래스의 나머지 부분에는 플랫폼 간 실행되는 SQLite 쿼리가 포함됩니다.The remainder of the TodoItemDatabase class contains SQLite queries that run cross-platform. 예제 쿼리 코드는 아래와 같습니다(구문에 대한 자세한 내용은 SQLite.NET with Xamarin.iOS 사용에서 확인 가능).Example query code is shown below (more details on the syntax can be found in Using SQLite.NET with Xamarin.iOS.

public Task<List<TodoItem>> GetItemsAsync()
{
  return database.Table<TodoItem>().ToListAsync();
}

public Task<List<TodoItem>> GetItemsNotDoneAsync()
{
  return database.QueryAsync<TodoItem>("SELECT * FROM [TodoItem] WHERE [Done] = 0");
}

public Task<TodoItem> GetItemAsync(int id)
{
  return database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
}

public Task<int> SaveItemAsync(TodoItem item)
{
  if (item.ID != 0)
  {
    return database.UpdateAsync(item);
  }
  else {
    return database.InsertAsync(item);
  }
}

public Task<int> DeleteItemAsync(TodoItem item)
{
  return database.DeleteAsync(item);
}

참고

비동기 SQLite.Net API를 사용하면 데이터베이스 작업이 백그라운드 스레드로 전환된다는 이점이 있습니다.The advantage of using the asynchronous SQLite.Net API is that database operations are moved to background threads. 또한 API에서 대신 처리하므로 동시성 처리 코드를 추가로 작성할 필요가 없습니다.In addition, there's no need to write additional concurrency handling code because the API takes care of it.

요약Summary

Xamarin.Forms는 SQLite 데이터베이스 엔진을 사용하여 데이터베이스 기반 애플리케이션을 지원하기 때문에 공유 코드로 개체를 로드하고 저장할 수 있습니다.Xamarin.Forms supports database-driven applications using the SQLite database engine, which makes it possible to load and save objects in shared code.

이 문서에서는 Xamarin.Forms를 사용하여 SQLite 데이터베이스에 액세스하는 것을 중점적으로 설명합니다.This article focused on accessing a SQLite database using Xamarin.Forms. SQLite.Net 자체로 작업하는 방법은 Android에서 SQLite.NET 또는 iOS에서 SQLite.NET 설명서를 참조하세요.For more information on working with SQLite.Net itself, refer to the SQLite.NET on Android or SQLite.NET on iOS documentation.