SQLCipherでSQLitePluginを使用できるように、最近2.2.0にアップグレードされたPhoneGap1.0.0用に作成されたiOSアプリに取り組んでいます。SELECT
そこにデータがあることを知っていても、ステートメントが結果を返さないという問題があります。
要約は次のとおりです。
- データベースは次のコードで作成されます。
THDatabase.DatabaseConnection = sqlitePlugin.openDatabase(THDatabase.name, THDatabase.currentVersion, THDatabase.displayName, THDatabase.size);
THDatabase.DatabaseConnection.transaction(THDatabase.CreateUsersTable, THDatabase.FatalErrorCallback);
THDatabase.DatabaseConnection.transaction(THDatabase.CreateCentersTable, THDatabase.FatalErrorCallback);
...
- ユーザーが登録すると、CentersテーブルとUsersテーブルにデータが挿入されます。
- ログイン画面が読み込まれると、データベースにセンターとユーザーが照会されます。
/* Centers */
LoadCenters: function LoadCenters() {
console.log("LoadCenters");
THDatabase.DatabaseConnection.transaction(THDatabase.LoadCentersImpl, THDatabase.FatalErrorCallback);
console.log('THDB.LoadCenters called from: ' + arguments.callee.caller.name);
},
LoadCentersImpl: function(tx) {
console.log("Loading centers.");
tx.executeSql('SELECT * FROM Centers', [], THDatabase.LoadCentersParse, THDatabase.RecoverableErrorCallback);
},
LoadCentersParse: function(tx, results) {
console.log('parsing centers');
var dataArray = [];
var len = results.rows.length;
...
},
/* Users */
LoadUsers: function LoadUsers() {
console.info("THDB.LoadUsers");
THDatabase.DatabaseConnection.transaction(THDatabase.LoadUsersImpl, THDatabase.FatalErrorCallback);
},
LoadUsersImpl: function (tx) {
console.info("Loading users...");
tx.executeSql('SELECT * FROM Users', [], THDatabase.LoadUsersParse, THDatabase.RecoverableErrorCallback);
},
LoadUsersParse: function (tx, results) {
console.info('parsing users...');
var dataArray = [];
var len = results.rows.length;
console.log(len);
...
}
...
私が抱えている問題は、LoadUsersImpl()
実行後、ステートメントLoadUsersParse()
の結果が得られないことです。SELECT
console.logは「ユーザーの読み込み中...」で停止します。私はまだアプリにログインできますが、データベースからの読み取りを必要とするものは何も機能しません。
呼び出しをLoadUsersParse()
無名関数でラップして、を渡してみましたが、機能tx, results
しません。を渡すだけ results
で、呼び出しの結果はコンソールログに表示されますが、「ユーザーの解析...」が表示された直後に停止します。
これと同じコードは、PhoneGapにSQLitePluginがインストールされていなくても正常に機能しますが、問題の原因がどこにあるのかわかりません。
「ユーザーを読み込んでいます...」の直後にDEBUGをオンにすると、ログが記録されます。
SQLitePlugin.backgroundExecuteSqlBatch: {"executes":[{"query":["BEGIN"],"path":"ThinkHealthDBs.db","callback":"cb55"},{"query":["SELECT * FROM Users"],"path":"ThinkHealthDBs.db","callback":"cb56"}]}
これは、SQLCipherが使用されている場合と使用されていない場合、およびPhoneGap /Cordova2.1.0で発生する問題です。