AIRでAirRecord越しにSQLiteを使う

AIRでローカルDBのSQLiteを使う際に、直接使わずにO/Rマッパーを通して使ってみようということで、AirRecord を使ってみました。

Adobe Developer Connection の記事 を見ながらサンプルコードを書いてみました。

DBConfig.as

package  {
   public class DBConfig {
      /** ここに指定した文字列 + ".db" というファイル名でdbファイルが作成される。*/
      public static const DB_NAME:String = "myDB";

      /** .dbファイルを置くパス */
      public static const PATH:String = "app-storage:/";

      /** DB接続ユーザー名 */
      public static const USER:String = "hogehoge";

      /** DB接続に使用するパスワード */
      public static const PASSWORD:String = "hugahuga";

      /** 接続時に実行させるクエリ  配列要素順に実行 */
      public static const DDL:Array = [
         Bookmarks.DDL
      ];

      public function DBConfig() {
      }
   }
}

Bookmarks.as

package  {
   import jp.cre8system.framework.airrecord.model.ARModel;

   public class Bookmarks extends ARModel {
      /** 対応させるテーブル名 */
      public static const TABLE_NAME:String = "bookmarks";

      /** テーブル定義 */
      public static const DDL:String =
            "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + 
            "   id         INTEGER PRIMARY KEY, " +
            "   name   TEXT, " + 
            "   url      TEXT" +
            ");";

      public var id:Number;
      public var name:String = "";
      public var url:String = "";

      public function Bookmarks() {
         super();
         this.__table = TABLE_NAME;   //テーブル名を渡す
      }
   }
}

AirRecordText.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
                  xmlns:s="library://ns.adobe.com/flex/spark" 
                  xmlns:mx="library://ns.adobe.com/flex/mx" 
                  creationComplete="init(event);" 
                  fontFamily="Meiryo, MS PGothic, Osaka" 
                  showStatusBar="false">
   <s:layout>
      <s:VerticalLayout verticalAlign="middle"/>
   </s:layout>

   <fx:Script>
      <![CDATA[
         import jp.cre8system.framework.airrecord.db.ARDatabase;
         import mx.collections.ArrayCollection;

         [Bindable]
         public var selectedData:ArrayCollection = null;   //SELECTしてきたデータの格納先

         private function init(event:Event):void {
            //DBへの接続
            var db:ARDatabase = ARDatabase.instance;
            db.add(
               DBConfig.USER, 
               DBConfig.PASSWORD, 
               DBConfig.DB_NAME, 
               DBConfig.DDL, 
               "",    //コネクション識別名
               DBConfig.PATH
            );
            db.connect();

            selectData();
         }

         //SELECTしてきてDataGridに渡す
         private function selectData():void {
            var bookmarks:Bookmarks = new Bookmarks();
            var result:Array = bookmarks.find(null, "id DESC");   //findメソッドでSELECTできる
            selectedData = new ArrayCollection(result);
         }

         //データ追加
         private function insertData(name:String, url:String):void {
            var bookmarks:Bookmarks = new Bookmarks();
            bookmarks.name = nameInput.text;
            bookmarks.url = urlInput.text;
            bookmarks.insert();
            //bookmarksのフィールドに代入してinsert()を呼ばずに
            //bookmarks.insert({name: nameInput.text, url:urlInput.text});
            //でもOK
         }

         //追加ボタンクリック時
         private function onClick(event:MouseEvent):void {
            if (nameInput.text == "" || urlInput.text == "") return;
            insertData(nameInput.text, urlInput.text);
            selectData();
         }
      ]]>
   </fx:Script>

   <s:HGroup width="100%" horizontalAlign="center" verticalAlign="middle">
      <s:Label text="サイト名" width="80" textAlign="right" paddingRight="5" />
      <s:TextInput id="nameInput" width="400"/>
   </s:HGroup>
   <s:HGroup width="100%" horizontalAlign="center" verticalAlign="middle">
      <s:Label text="URL" width="80" textAlign="right" paddingRight="5" />
      <s:TextInput id="urlInput" width="400"/>
   </s:HGroup>
   <s:HGroup width="100%" horizontalAlign="center" verticalAlign="middle">
      <mx:Spacer width="410" />
      <s:Button id="addButton" label="追加" click="onClick(event);" />
   </s:HGroup>

   <mx:Spacer width="100" height="50"/>

   <s:HGroup width="100%" horizontalAlign="center">
      <mx:Spacer width="30" />
      <mx:DataGrid width="450" dataProvider="{selectedData}">
         <mx:columns>
            <mx:DataGridColumn headerText="id" dataField="id" width="40"/>
            <mx:DataGridColumn headerText="name" dataField="name"/>
            <mx:DataGridColumn headerText="url" dataField="url"/>
         </mx:columns>
      </mx:DataGrid>
   </s:HGroup>

</s:WindowedApplication>

DB使ってるって気がしなくて楽ちんですね。

コメントを残す