티스토리 뷰

반응형

현재 Windows 8 RP 버전은 로컬 데이터베이스를 지원하지 않는다. 앞으로 지원이 될지도 약간 미지수라 다른 방법을 찾던 중 SQLite를 사용할 수 있다는 이야기를 듣고, 적용을 해 보았는데 간단하게 지원이되어서 오랜만에 포스팅을 하게 되었다.

 

참고 포스트

http://wp.qmatteoq.com/using-sqlite-in-your-windows-8-metro-style-applications/

 

참고 포스트에서는 로컬 저장소에 Database파일을 만들고, Insert, Select를 하는 방법에 다루고 있으니, 약간 응용하면 CRUD도 가능하리라 생각된다. 그리고, 추가로 다음 포스트에서 Database파일을 포함한 앱을 배포하고, 조회하는 방법도 추가하도록 하겠다.

 

1. 준비단계

SQLite의 엔진을 사용하여 WinRT에서 구동이되는 라이브러리를 sqlite-net이라고 하며, 이 라이브러리를 추가해 주어야한다.

 

다운로드 페이지

http://sqlite.org/download.html

위의 페이지에서 sqlite-dll-winrt-x86-3071300.zip, sqlite-dll-winrt-x64-3071300.zip 이 2가지가 WinRT지원 라이브러리이니 다운로드를 받는다.(ARM은 지원하지 않는데, 앞으로 지원할지도...)

 

이 셈플에서는 x86라이브러리를 사용한다.

 

2. 프로젝트 생성

VS2012 RC -> New -> Project -> Windows Metro style -> Blank App (XAML) -> Name : SQLiteSample -> OK

 

 

새로 생성된 프로젝트에 아까 다운로드 받았던 sqlite-dll-winrt-x86-3071300.zip 파일의 압축을 풀고 sqlite3.dll 파일만 복사해서 SQLLiteSample Root에 붙여 넣기를 한다.

 

이제 NuGet을 이용해서 sqlite-net을 다운로드 받는다.

프로젝트에서 오른쪽 마우스 버튼을 눌러서 팝업 메뉴가 나오면 Manage NuGet Packages를 선택한다.

 

 

Online -> All -> 오른쪽 상단 sqlite-net -> Install

이렇게 인스톨을 완료하면 SQLite.cs, SQLiteAsync.cs 2개의 파일이 추가된다.

 

3. 테이블 모델 생성

 

Person.cs를 추가하고 아래와 같이 코딩한다.

 

    public class Person
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }

        [MaxLength(30)]
        public string Name { get; set; }

        [MaxLength(30)]
        public string Surname { get; set; }

        public int Age { get; set; }

        public bool Sex { get; set; }

    }

 

모든 테이블 모델에는 하나의 PrimaryKey가 반드시 존재해야한다.

 

4. MainPage.xaml

간단하게 뷰에 컨트롤을 올린다.

 

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0.5*"/>
            <ColumnDefinition Width="0.5*"/>
        </Grid.ColumnDefinitions>
        <StackPanel>
            <StackPanel Orientation="Horizontal">
                <Button Content="Select" HorizontalAlignment="Left" Width="100" Click="Button_Click_1"/>
            </StackPanel>
            <ListBox x:Name="lbData"/>
        </StackPanel>
    </Grid>

 

5. MainPage.xaml.cs

 

    public sealed partial class MainPage : Page
    {
        //Database이름
        const string people = "people.db";

        public MainPage()
        {
            this.InitializeComponent();

            //DB생성, 테이블 생성
            CreateDatabase();
        }

        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {

        }

        private async void CreateDatabase()
        {
            //로컬저장소 경로에 있는 people.db파일과 연결됨
            SQLiteAsyncConnection conn = new SQLiteAsyncConnection(people);
            //테이블 생성 - 이미 존재하는 경우에는 다시 생성되지 않음
            var result = await conn.CreateTableAsync<Person>();
            //테이블 레코드 카운트
            var cnt = await conn.Table<Person>().CountAsync();
            //초기값 입력
            if (cnt == 0)
            {
                await conn.InsertAsync(new Person { Name = "kaki104", Surname = "Park", Age = 11, Sex = true });
                await conn.InsertAsync(new Person { Name = "kaki105", Surname = "Choi", Age = 22, Sex = false });
                await conn.InsertAsync(new Person { Name = "kaki106", Surname = "Kang", Age = 33, Sex = true });
                await conn.InsertAsync(new Person { Name = "kaki107", Surname = "Nam", Age = 44, Sex = false });
                await conn.InsertAsync(new Person { Name = "kaki108", Surname = "No", Age = 55, Sex = true });
                await conn.InsertAsync(new Person { Name = "kaki109", Surname = "Won", Age = 66, Sex = false });
            }
        }

        private async void Button_Click_1(object sender, RoutedEventArgs e)
        {
            SQLiteAsyncConnection conn = new SQLiteAsyncConnection(people);
            //전체 데이터 조회 - 람다식으로 조건
            var query = conn.Table<Person>().OrderByDescending(p => p.Id);
            //리스트 형태로 반환
            var results = await query.ToListAsync();
            lbData.Items.Clear();
            //각 데이터 출력
            foreach (var item in results)
            {
                lbData.Items.Add(string.Format("{0}: {1} / {2} / {3} / {4}", item.Id, item.Name, item.Surname, item.Age, item.Sex));
            }
        }
    }

 

 

6. Database file위치

소스에서 Break를 걸어서 Immediate Window에 Windows.Storage.ApplicationData.Current.LocalFolder.Path을 입력하면, 자신이 만든 앱이 사용하는 로컬폴더의 경로를 알 수 있다. 탐색기의 주소창에 해당 경로를 입력하면, 자신이 만든 database 파일이 존재하는 것을 볼 수 있다.

 

7. 여기까지 기본적으로 SQLite를 사용하는 방법에 대해서 알아보았다.

CRUD작업은 조금만 응용을 하면 충분히 가능하리라 생각한다.

 

Source

 

SQLiteSample.zip

반응형
댓글