ionic(cordova)でsqliteを使う - ngCordova
はじめに
今回やりたかったのはsqliteを使う際に共通の処理とかはどこかにまとめておきたかった。接続とSELECT、INSERT、UPDATE、DELETEあたりをまとめられればよいかなという方針で。次回簡単に使えるようにメモしておく。
インストール
$ bower install ngCordova
index.htmlで読み込む
・・・ <script src="lib/ngCordova/dist/ng-cordova.js"></script> ・・・
実装
services/db.js
angular.module('myApp')
.factory("dbService", ['$cordovaSQLite', '$q', function($cordovaSQLite, $q) {
var dbService = {};
var db = null;
var query = null;
dbService.initialize = function() {
if (window.cordova) {
db = $cordovaSQLite.openDB({name: 'example.db', location: 'default'});
} else {
db = window.openDatabase('example.db', '1.0', '', -1);
}
// データベースの初期化
query = "create table if not exists example (id integer primary key, name text)";
$cordovaSQLite.execute(db, query);
};
/**
* 1件取得
* @param string query
* @param object params
*/
dbService.get = function(query, params) {
var deffered = $q.defer();
$cordovaSQLite.execute(db, query, params)
.then(function(result) {
if (0 < result.rows.length){
deffered.resolve(result.rows.item(0));
} else {
deffered.resolve(null);
}
}, function(err) {
deffered.reject(err);
});
return deffered.promise;
};
/**
* 全件取得
* @param string query
* @param object params
*/
dbService.getAll = function(query, params) {
var deffered = $q.defer();
$cordovaSQLite.execute(db, query, params)
.then(function(result) {
var result2 = [];
for (var i = 0; i < result.rows.length; i++) {
result2.push(result.rows.item(i));
}
deffered.resolve(result2);
}, function(err) {
deffered.reject(err);
});
return deffered.promise;
};
/**
* 登録
* @param string table
* @param object data
*/
dbService.insert = function(table, data) {
var deffered = $q.defer(),
params = [],
fields = "",
values = "";
Object.keys(data).forEach(function(key) {
fields += key + ",";
values += "?,";
params.push(data[key]);
});
query = "insert into " + table + " (";
query += fields.substr(0, fields.length - 1) + ") values (";
query += values.substr(0, values.length - 1) + ")";
$cordovaSQLite.execute(db, query, params)
.then(function(result) {
deffered.resolve(result.insertId);
}, function(err) {
deffered.reject(err);
});
return deffered.promise;
};
/**
* 更新
* @param string query
* @param object params
*/
dbService.update = function(query, params) {
var deffered = $q.defer();
$cordovaSQLite.execute(db, query, params)
.then(function(result) {
deffered.resolve(result.rowsAffected);
}, function(err) {
deffered.reject(err);
});
return deffered.promise;
};
/**
* 削除
* @param string table
* @param int id
*/
dbService.delete = function(table, id) {
var deffered = $q.defer();
query = "delete from " + table + " where id = ?";
$cordovaSQLite.execute(db, query, [id])
.then(function(result) {
deffered.resolve(result.rowsAffected);
}, function(err) {
deffered.reject(err);
});
return deffered.promise;
};
return dbService;
}]);呼び出し側 今回はコントローラから直接呼ぶ
angular.module('myApp')
.controller("SampleCtrl", function($scope, dbService) {
// データベース初期化
dbService.initialize();
// SELECT
var sql = "select * from example where id = ?";
var params = [1];
dbService.get(sql, params)
.then(function(result) {
// result -> 結果
});
// INSERT
dbService.insert("example", {
name: "hoge"
})
.then(function(result) {
// result -> 結果
});
// UPDATE
var sql = "update example set name = ? where id = ?";
var params = ["fuga", 2];
dbService.update(sql, params)
.then(function(result) {
// result -> 結果
});
// DELETE
dbService.delete("example", 2)
.then(function(result) {
// result -> 結果
});
});
おわりに
コントローラに直接書かずにテーブルごとにserviceを用意する方がよいかも。以上です。