2013年10月15日火曜日

TitaniumでSQLiteを簡単に扱うためのライブラリ(クエリビルダー)作ってみた

  • このエントリーをはてなブックマークに追加

Titaniumでデータを貯めたりするのにDatabase(SQLite)を使う必要がある。

そのためのライブラリを作ったという記事を去年書いたけれども、
作ったものだとちょっと使い道が限定されているというかあまりよろしくないなと思ったし、
そもそもソースコードにSQL文を書くのが面倒だし、open()・close()の管理とかも面倒だし、
探してみても全然簡単にSQLiteを扱えるものがないなぁと思って、
新しく今度はクエリビルダーという形で作ってみた。

ちなみにfuelphpのクエリビルダーを参考にというかほぼ同じように作ってみた。
けどinsertの第二引数や、delete()がremove()にといった形で、
一部搭載していない機能もあるので要注意。

ダウンロードはこちらから


■基本的な使い方

var sqliter = require("lib/sqliter").sqliter;

var sqlite = new sqliter("dbname"); //初期化

var data = sqlite.open(function(db){
  //ここで諸々処理を書く
});

まずrequire。
そして使いたいデーターベース名を入れて初期化。
open()の中にdbを引数として無名関数で処理したい内容を書く。
というのが基本的な使い方。

※db = Ti.Database.open(dbname)とdb.close()は処理中に書いてあるので書く必要無しという楽な仕様です


■select

// select()
// select(_column)
// select(Array(_column1,column2...))

var data = sqlite.open(function(db){
  return db.select().from("tbl").execute().as_array();
});
SELECT // SELECT * FROM...
db.select()
db.select("*")
// SELECT hoge,fuga FROM...
db.select("hoge,fuga") //文字列
db.select(["hoge","fuga"]) //配列
// SELECT hoge as h,fuga as f FROM...
db.select("hoge as h,fuga as f") //文字列
db.select(["hoge as h","fuga as f"]) //配列

■distinct

// distinct(_column)
// distinct(Array(_column1,_column2...))

var data = sqlite.open(function(db){
  return db.select().distinct("column1").from("tbl").execute().as_array();
});
DISTINCT // SELECT DISTINCT hoge FROM...
db.distinct("hoge")

■join,on

// join(_table,_type)
// on(_column1,_operator,_column2)

var data = sqlite.open(function(db){
  return db.select().from("tbl1").join("tbl2","left").on("tbl1.id","=","tbl2.id").execute().as_array();
});
JOIN ON // SELECT * FROM hoge INNER JOIN fuga ON (hoge.id = fuga.id)...
db.select().from("hoge").join("fuga","inner").on("hoge.id","=","fuga.id")
// SELECT * FROM hoge LEFT JOIN fuga ON (hoge.id = fuga.id)...
db.select().from("hoge").join("fuga","left").on("hoge.id","=","fuga.id")
// SELECT * FROM hoge RIGHT JOIN fuga ON (hoge.id = fuga.id)...
db.select().from("hoge").join("fuga","right").on("hoge.id","=","fuga.id")

■where

// where(_column1,_operator,_value)
// and_where(_column1,_operator,_value)
// or_where(_column1,_operator,_value)
// where_open()
// where_close()
// and_where_open()
// and_where_close()
// or_where_open()
// or_where_close()
WHERE // SELECT * FROM hoge WHERE "foo" = "bar"...
db.select().from("hoge").where("foo","=","bar")
// SELECT * FROM hoge WHERE "foo" != "bar"...
db.select().from("hoge").where("foo","!=","bar")
// SELECT * FROM hoge WHERE "foo" LIKE "%bar%"...
db.select().from("hoge").where("foo","like","bar")
// SELECT * FROM hoge WHERE "fuga" IN("foo","bar")...
db.select().from("hoge").where("fuga","in",["foo","bar"])
// SELECT * FROM hoge WHERE "fuga" BETWEEN "foo" AND "bar"...
db.select().from("hoge").where("fuga","between",["foo","bar"])
// SELECT * FROM hoge WHERE "fuga" = 1 AND "foo" = "bar"...
db.select().from("hoge").where("fuga","=",1).and_where("foo","=","bar")
// SELECT * FROM hoge WHERE "fuga" = 1 OR "foo" = "bar"...
db.select().from("hoge").where("fuga","=",1).or_where("foo","=","bar")
// SELECT * FROM hoge WHERE ("fuga" = 1 OR "foo" = "bar")...
db.select().from("hoge")
  .where_open()
    .where("fuga","=",1)
    .or_where("foo","=","bar")
  .where_close()
// SELECT * FROM hoge WHERE "fuga" = 1 OR ("fuga" = 2 AND foo != "bar")...
db.select().from("hoge").where("fuga","=",1)
  .or_where_open()
    .where("fuga","=",2)
    .and_where("foo","!=","bar")
  .or_where_close()

■having

// having(_column1,_operator,_value)
// and_having(_column1,_operator,_value)
// or_having(_column1,_operator,_value)
// having_open()
// having_close()
// and_having_open()
// and_having_close()
// or_having_open()
// or_having_close()

※whereと使い方はほぼ同じなので割愛


■order by

// order_by(_column,_order)

var data = sqlite.open(function(db){
  return db.select().from("tbl").order_by("id","asc").execute().as_array();
});
ORDER // SELECT * FROM hoge ORDER BY id ASC...
db.select().from("hoge").order_by("id","asc")
// SELECT * FROM hoge ORDER BY id DESC...
db.select().from("hoge").order_by("id","desc")

■group by

// group_by(_column)

var data = sqlite.open(function(db){
  return db.select().from("tbl").group_by("name").execute().as_array();
});
GROUP // SELECT * FROM hoge GROUP BY name...
db.select().from("hoge").group_by("name")

■limit,offset

// limit(_value)
// offset(_value)

var data = sqlite.open(function(db){
  return db.select().from("tbl").limit(10).offset(5).execute().as_array();
});
LIMIT,OFFSET // SELECT * FROM hoge limit 10 offset 5...
db.select().from("hoge").limit(10).offset(5);

■insert

// insert(_table)
// set({_column:_value,_column:_value...})
// columns(_columns)
// values(_values)

sqlite.open(function(db){
  db.insert("tbl").set({
    id:1,
    name:"hoge"
  }).execute();
})
INSERT // INSERT INTO hoge (id,name) VALUES("foo","bar")...
db.insert("hoge").set({
  id:"foo",
  name:"bar"
})
// INSERT INTO hoge (id,name) VALUES("foo","bar")...
db.insert("hoge").columns(["id","name"]).values(["foo","bar"]);

■update

// update(_table)
// set(_columns)
// value(_column,_value)

sqlite.open(function(db){
  db.update("tbl").set({
    name:"hoge",
    year:2000
  }).where("id","=",1).execute();
})
UPDATE // UPDATE hoge SET foo = "bar",fuga = 2...
db.update("hoge").set({
  foo:"bar",
  fuga:2
})
// UPDATE hoge SET foo = "bar",fuga = 2...
db.update("hoge").value("foo","bar").value("fuga",2)

■delete

// remove(_table)

sqlite.open(function(db){
  db.remove("tbl").where("id","=",1).execute()
});

※delete()にしようとしたけど、deleteはTitaniumでの予約語?らしいので使用できず。なのでremove()に


■drop

// drop(_table)

sqlite.open(function(db){
  db.drop("tbl").execute();
});

■query,execute,as_array

// query(_string)
// execute()
// as_array()

sqlite.open(function(db){
  db.query("SELECT * FROM tbl").execute().as_array();
});

直接クエリ文を書きたい場合はquery()を使うとOK
※基本的にexecute()を書かないと実行されない
また結果を取り出したい場合はas_array()を記述する必要あり


■getResult,getCount,getFieldCount

// getResult()
// getCount()
// getFieldCount()

var count = sqlite.open(function(db){
  var result = db.select().from("tbl").execute();
  return result.getCount();
});

var fieldNum = sqlite.open(function(db){
  var result = db.select().from("tbl").execute();
  return result.getFieldCount();
});

ということで今回真面目にライブラリというかクエリビルダーを作ってみた。
実際にこれを使う事でソースコードも綺麗に記述出来るし、
open()やclose()のし忘れでエラーが出るという事も無く安心。

ちなみに注意点としてはexecute()を最後に書いてあげないと動作しないということ。
それと処理された結果を受け取りたい場合はas_array()を書いてあげる必要があるということ。

これでアプリ内でデータ貯めるとかそういう場合に楽に書けるようになるのでよかったら使ってみてください的な。

Adsense