[SQLite.NET] Xamarin에서 SQLite사용하기

2017. 5. 21. 03:00Mobile/Xamarin

  1. SQLite.NET를 통해 Xamarin에서 SQLite를 손쉽게 사용할 수 있습니다. Nget Package에서 sqlite-net-pcl 모듈을 설치하면 이용하실 수 있습니다. (WPF, WinForm, ASP.NET 등은 sqlite-net를 이용하며 SQLite공식 사이트에서 Precompiled Binaries for Windows를 다운로드 하여 bin 폴더에 넣어주어야 합니다.)
  2. SQLiteConnection를 통해서 DB를 생성할 수 있습니다.
    using (SQLiteConnection db1 = new SQLiteConnection("dbPath.s3db"))
    {
        ...
    }
    
  3. 비동기 기능을 활용할 수 있는 SQLiteAsyncConnection도 사용할 수 있지만 Thread 동기화에 대한 처리가 필요하며, 실수나 잘못된 Thread 동기화 처리는 Deadlock을 유발합니다. 비동기는 Task.Run()을 통해서도 구현할 수 있으므로 비동기 구현이 꼭 필요한지 고려가 필요합니다.
  4. 테이블 조회 방법 및 성능은 아래와 같습니다. (전체 컬럼 조회 시 Table<T>()가 가장 빠름)
    //1. Table 전체 조회 (조회시간: 11264.5281)
    DateTime dtStart = DateTime.Now;
    for (int i = 0; i <= 1000; i++)
    {
        resultList = db.Table<Grades>().ToList();
    }
    resultTime1 = (DateTime.Now - dtStart).TotalMilliseconds;
    
    //2. SQL String으로 조회 (조회시간: 4358.483)
    int personId = 1
    string query = "SELECT * FROM Grades WHERE NotToDoItemId = " + personId.ToString();
    dtStart = DateTime.Now;
    for (int i = 0; i <= 1000; i++)
    {
        resultList = db.Query<Grades>(query);
    }
    resultTime2 = (DateTime.Now - dtStart).TotalMilliseconds;
    
    //3. Talbe로 조회 (조회시간: 106.2154)
    dtStart = DateTime.Now;
    for (int i = 0; i <= 1000; i++)
    {
        resultList = db.Table<Grades>().Where(t => t.PersonId == personId).ToList();
    }
    resultTime3 = (DateTime.Now - dtStart).TotalMilliseconds;
    
  5. 테이블의 일부정보만 로드 혹은 집계합수 등 (Table<T>()는 특정 컬럼만 조회하는 것이 아니라 전체 컬럼을 로드하는 듯) 일부 컬럼만 조회할 경우 SQL String으로 실행하는 것이 가장 빠른 것으로 파악됩니다.
    //1. SQL String으로 집계 (조회시간: 1362.4988)
    DateTime dtStart = DateTime.Now;
    for (int i = 0; i <= 1000; i++)
    {
        result = db.Query<QueryResult>("SELECT NotToDoItemId AS Id, SUM(EvaluationResult) AS Sum FROM Grades GROUP BY NotToDoItemId");
    }
    resultTime1 = (DateTime.Now - dtStart).TotalMilliseconds;
    
    //2. Table<T> + GroupBy 집계 (조회시간: 11790.8675)
    dtStart = DateTime.Now;
    for (int i = 0; i <= 1000; i++)
    {
        result = db.Table<Grades>().GroupBy(t => t.PersonId).Select(t => new QueryResult { Id = t.Key, Sum = t.Sum(s => s.EvaluationResult ?? 0) }).ToList();
    }
    resultTime2 = (DateTime.Now - dtStart).TotalMilliseconds;
    
    //3. Table<T>로 전체 로드 후 GroupBy 집계 (조회시간: 12075.4998)
    dtStart = DateTime.Now;
    for (int i = 0; i <= 1000; i++)
    {
        result = db.Table<Grades>().ToList().GroupBy(t => t.PersonId).Select(t => new QueryResult { Id= t.Key, Sum = t.Sum(s => s.EvaluationResult ?? 0) }).ToList();
    }
    resultTime3 = (DateTime.Now - dtStart).TotalMilliseconds;