2012年11月7日水曜日

TitaniumでDB操作する際に便利なINSERT OR REPLACE(SQLite)

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

Titaniumで色んなデータを扱う際にデータをサーバに入れておくけど、
アプリを使っているユーザのデータだけは端末に格納して、
サーバとの通信を抑えて高速化したいといったことがある。
(他のユーザのデータはwindowをopenした際に都度取得してくる)

じゃあそうする場合はどうしたら良いのかっていうのが今回のお話。

そういった場合はSQLiteを使ってデータを格納しておくんだが、
既に存在しているidに対して挿入(INSERT)することは出来ないので、
下記みたいな形で一般的にデータを確認して、挿入もしくは書き換えを行う。

var r = db.execute("SELECT COUNT(id) FROM table1 WHERE id = 1");
if(!r.field(0)){
  //存在していない
  db.execute("INSERT INTO table1 (id,name) VALUES(1,'hoge')");
}
else{
  //存在している
  db.execute("UPDATE table1 SET name = 'hoge' WHERE id = 1");
}
とこんな感じで長ったらしくなってしまって正直面倒。
それに書き換えたいフィールドが増えた場合にSQL文を変更するんだけども面倒。

ということで下記のようなINSERT OR REPLACE文を使って上げる事によって簡単に。
db.execute("INSERT OR REPLACE INTO table1 (id,name) (1,'hoge')");
idが1のデータがなかったら挿入(INSERT)し、あったら削除(DELETE)して挿入(INSERT)という流れ。

ただし、PRIMARY KEY制約を受けるので、
テーブルを作成する際にしっかりとPRIMARY KEYを設定しておかないと動かない。
PRIMARY KEYを使ったテーブルの作り方は下記。
db.execute("CREATE TABLE IF NOT EXISTS table1 (id INT PRIMARY KEY,name TEXT)");
ちなみにSQLiteはPRIMARY KEYはどの型でも問題ないので、
FacebookのユーザIDをTEXT型で格納していてもPRIMARY KEYを付けていればしっかりと動作する。

Adsense