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を用意する方がよいかも。以上です。