본문 바로가기

Application Programming Interface/Universal Windows Platform

Universal Windows Platform (UWP)에서 SQLCipher 사용하기

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

NuGet Package에서 요구하는 버전 때문에 Visual Studio 2017 이상에서만 가능하다. 즉, Visual Studio 2015 이하에서는 안 됨.

 

#1 ~ #3의 과정은 Visual Studio에 확장 기능을 적용하는 것이므로 처음 1회만 하면 이후 새 프로젝트를 생성할 때 또 다시 할 필요가 없음.

1. [도구(T)] - [확장 및 업데이트(U)...]를 클릭한다.

 

2. "확장 및 업데이트" 창에서 [온라인] 메뉴 클릭 후 검색창에 "SQLite"를 검색한다. "SQLite for Universal Windows Platform"를 다운로드한다.


 

3. 테스트해 본 결과 별 문제가 없었다. 안심하고 [예(Y)]를 누른다.

 

4. "솔루션 탐색기"에서 원하는 프로젝트에 참조 추가를 한다. [참조 추가(R)...]를 클릭하여 "참조 관리자" 창을 열고 이전 단계에서 추가한 "SQLite for Universal Windows Platform"을 체크하고 [확인]을 누른다.


 

5. 이제 프로젝트에 SQLite 및 관련 기능 수행을 위한 바이너리가 링크되었다. 닷넷 소스 코드에서 호출하기 위해서는 Wrapper를 추가해야 한다. 추가할 패키지는 다음과 같다.

SQLitePCLRaw.core
C#에서 SQLite 함수를 호출하기 위한 Wrapper 클래스들을 제공한다.
SQLitePCLRaw.provider.sqlcipher.uwp10
C#에서 SQLCipher 기능을 사용하기 위한 Wrapper 클래스들을 제공한다.
SQLitePCLRaw.lib.sqlcipher.windows
Windows에서 사용하기 위한 SQLCipher 바이너리이다.

[도구(T)] - [NuGet 패키지 관리자(N)] - [패키지 관리자 콘솔(O)]을 클릭하여 NuGet 패키지 관리자 콘솔을 연다.

6. 아래 명령어를 차례로 입력하여 각 패키지를 프로젝트에 설치하여 적용시킨다. 이 과정은 프로젝트별로 진행되므로 다음에 새 프로젝트를 생성하면 그 프로젝트에도 똑같이 수행해야 한다.

PM> Install-Package SQLitePCLRaw.core
PM> Install-Package SQLitePCLRaw.provider.sqlcipher.uwp10
PM> Install-Package SQLitePCLRaw.lib.sqlcipher.windows_



7. 이제 C#에서 사용만 하면 된다. SQLitePCL.raw 클래스에 필요한 함수들이 있으며 사용 방법은 C/C++ 버전의 SQLite와 동일하다. 단, 암호를 지정하는 방법은 다음과 같다.

PRAGMA key = "암호";

DB을 열고 이 쿼리를 SQLitePCL.raw.sqlite3_exec 함수로 실행한 후 DB 관련 쿼리를 수행하면 된다.

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    // DB에 설정할 암호
    const string key = "#1q2w3e4r#";
    string query = null;
    string pathLocal = null;
    SQLitePCL.ISQLite3Provider sqlite3Provider = null;
    SQLitePCL.sqlite3 sqlite3 = null;
    
    // C:\Users\<user>\AppData\Local\Packages\<appid>\LocalState에 DB 파일이 저장됨.
    pathLocal = Path.Combine(ApplicationData.Current.LocalFolder.Path, "database.sqlite");

    if (File.Exists(pathLocal)) File.Delete(pathLocal);

    sqlite3Provider = new SQLitePCL.SQLite3Provider_sqlcipher();

    SQLitePCL.raw.SetProvider(sqlite3Provider);

    Debug.Assert(SQLitePCL.raw.sqlite3_open(pathLocal, out sqlite3) == SQLitePCL.raw.SQLITE_OK);
    try
    {
        query = string.Format("PRAGMA key = '{0}';", key);
        Debug.Assert(SQLitePCL.raw.sqlite3_exec(sqlite3, query) == SQLitePCL.raw.SQLITE_OK);

        query = "CREATE TABLE Table1 (id INTEGER PRIMARY KEY NOT NULL, message TEXT);";
        Debug.Assert(SQLitePCL.raw.sqlite3_exec(sqlite3, query) == SQLitePCL.raw.SQLITE_OK);

        query = "INSERT INTO Table1 VALUES (NULL, 'text1');";
        Debug.Assert(SQLitePCL.raw.sqlite3_exec(sqlite3, query) == SQLitePCL.raw.SQLITE_OK);

        query = "INSERT INTO Table1 VALUES (NULL, 'text2');";
        Debug.Assert(SQLitePCL.raw.sqlite3_exec(sqlite3, query) == SQLitePCL.raw.SQLITE_OK);
    }
    finally
    {
        Debug.Assert(SQLitePCL.raw.sqlite3_close(sqlite3) == SQLitePCL.raw.SQLITE_OK);
    }
}


프로젝트를 가져와서 재컴파일하는데 아래와 같은 경고("SQLite.UWP.2015, Version=3.17.0"과 "Microsoft.VCLibs, version=14.0" 라이브러리간 종속성 문제)가 뜨면서 컴파일이 안 된다면 참조 추가에서 Visual C++ 2015 Runtime for Universal Windows Platform을 추가해주면 된다.