「SQLiteをWindows Mobileで動かそう!!しかも.NETで!!!」

我々は死んではいません!(←ってどっかの瀕死なOSSプロジェクトページに書いてあったw
さてさて久しぶりの更新になっちゃいましたが。


今回はSQLiteをWindowsMobileで動かそう!!しかも.NETで!!!」企画w(はい、みんな元気よく!!!


とりあえず日本でググってもSQLiteをCEで動かそうという使用シーンを想像しがたい技にわざわざ挑む、クレイジーはほぼ皆無。
少なくとも組み込み用に書いてる人がいなかったので、海外のフォーラムを読み読みしつつ弄ってみた。



使用したのはADO.NET Data Provider for SQLiteという、SQLiteのARM用ビルド向けの.NETラッパー

ADO.NET Data Provider for SQLite


ここで、ARM用のパッケージ(このときの最新版はSQLite.NET.0.21_armv4_dll.zip)をダウンロードしてー


展開。(あんじっぷー!)


Visual Basicスマートデバイスプロジェクトを作ってー


参照の追加から「SQLite.NET.dll」を指定。


そいでテキトーにソースを書く。
(主要なとこだけ抜粋してみる。Finisar.SQLiteと同じだから、本家を参照)

Finisar.SQLite

    Dim conn As New SQLiteConnection("Version=3;Data Source=test.db;New=True;Compress=True;")
    Dim cmd As SQLite.SQLiteCommand
  
  cmd = conn.CreateCommand
  conn.Open()

    cmd.CommandText = "CREATE table list (test_num INT, test_text TEXT)"
    cmd.ExecuteNonQuery()

  cmd.CommandText = "INSERT INTO list values(1,'おっぱいおっぱい')"
    cmd.ExecuteNonQuery()

    conn.close()

先ほど展開した残りのDLLファイル郡(SQLite3.dllとか)をパスが通るところに置いとく。
今回は実行ファイルと同じフォルダに配置
(初めての実行だと、フォルダが生成されてないかもなので、なければこのあとの実行を先に一度やっとく方がいいかもね。)


そいで、ビルド&デバイスへの配置、実行。


はい、できました。


とりあえずこんな感じでW-ZERO3内のファイルリストを作ってみた。
これでファイル検索がSQLでできるぞーw

    Private Function Execute(ByVal directory_path As String) As Boolean
        Try
            Dim extension As String
            Dim created As Date
            Dim modified As Date
            Dim filesize As Integer

            For Each filepath As String In IO.Directory.GetFiles(directory_path)
                extension = System.IO.Path.GetExtension(filepath)
                created = System.IO.File.GetCreationTime(filepath)
                modified = System.IO.File.GetLastWriteTime(filepath)
                Dim fi As New FileInfo(filepath)
                filesize = fi.Length

                addlist(filepath, filesize, extension, created, modified)
            Next

            For Each directory As String In IO.Directory.GetDirectories(directory_path)
                Me.Execute(directory)
            Next

            Execute = True
        Catch ex As Exception
            Execute = False
        End Try
    End Function

    Private Sub addlist(ByVal filepath As String, ByVal filesize As Integer, ByVal extension As String, ByVal created As Date, ByVal modified As Date)
        Try
            Dim path As String = filepath.Replace("\", "\\")
            cmd.CommandText = "INSERT INTO list values('" + path + "'," + filesize.ToString + ",'" + extension.ToString + "','" + created.ToString + "','" + modified.ToString + "')"
            cmd.ExecuteNonQuery()
        Catch ex As SQLiteException
            MessageBox.Show("データベース追加エラー")
        End Try
    End Sub


いつも思うけど再帰って気持ちいいよねw


さてさて、なにに使うよーww


実用的には図書館の蔵書検索システムなんかにWindowsCEバイスを使うのがいいかもね。
だって、PDAを持って、蔵書を探せるんだよ?
それが無理だとしても、つけっぱなしのWindowsPC端末よりかはWindowsCE端末の方が消費電力が小さくていい!!




追記
2008/02/26現在、「Windows Mobile SQLite」でググって(co.jp)みたところ、WEB全体でもトップに来ます。
よほど少ないんですね。
これを機になにか作ってみたいところです。