実際のソースコードはまだ拝見していないため、以下は募集文に記載いただいたエラー文をもとにした「よくあるパターン」としての一般的な診断です。
安藤様は募集文で「Web SQLの廃止、またはdeviceready イベントの制御が原因かもしれません」と的確に推測されていました。実はその通りで、ほぼ間違いなくWeb SQLの廃止が本質的な原因です。 jQuery / Onsen UI / AngularJS の読み込み順の警告は、同時に出ている「別件の軽い注意」である可能性が高く、切り分けて対応する必要があります。
| 時期 | Android WebView / Chrome | window.openDatabase(Web SQL) |
|---|---|---|
| 〜2022年頃 | 旧バージョン | 動作していた |
| 2023年以降 | 最新のWebView / Chrome | 廃止・undefinedに |
※ Web SQL(openDatabase)はブラウザの標準仕様から正式に廃止された古いAPIです。数年前に作られたMonaca/Cordovaアプリで特によく見られる症状です。
アプリ起動時に、相談履歴の画面やアプリ全体のスクリプトが読み込まれます。
window.openDatabase(...) が呼ばれる相談記録を保存するタイミングで、昔ながらのWeb SQL用の命令が実行されます。
openDatabase が存在しないwindow.openDatabase が undefined になっているため、その先の .openDatabase を読もうとして「Cannot read properties of undefined (reading 'openDatabase')」というエラーが発生します。
データベース接続自体が失敗しているため、相談記録の保存も一覧の更新も行われません。
実際のコードを拝見していないため、あくまで典型的な修正パターンのイメージです。多くの場合、以下のように置き換えることで解決します。
// ページ読み込み直後に実行してしまっている var db = window.openDatabase( 'consultations.db', '1.0', 'Nyao DB', 2 * 1024 * 1024 ); db.transaction(function (tx) { tx.executeSql('INSERT INTO ...'); });
// deviceready 発火後に実行する document.addEventListener('deviceready', function () { var db = window.sqlitePlugin.openDatabase({ name: 'consultations.db', location: 'default' }); db.transaction(function (tx) { tx.executeSql('INSERT INTO ...'); }); }, false);
ポイントは2つです。①ブラウザ標準から廃止された window.openDatabase の代わりに、Cordovaの定番プラグイン cordova-sqlite-storage(window.sqlitePlugin.openDatabase)を使う。②アプリが完全に起動し終わった合図である deviceready イベントの後にDB処理を実行する。この2点を直せば、多くの場合エラーは解消します。
こちらはWeb SQLの件とは別に、スクリプトタグの並び順に関する注意です。Onsen UIやAngularJSは、内部でjQueryやAngularの機能を前提にしている部分があるため、読み込み順が崩れると警告や予期しない挙動が出ることがあります。
基本の正しい順序は次の通りです。
1. jquery.min.js 2. angular.min.js 3. angular-*(AngularJSの拡張系) 4. onsenui.js / angular-onsenui.js 5. cordova.js(Monaca/Cordovaの本体) 6. 自作の app.js(deviceready処理を含む)
ソースコード拝見後、実際の <script> タグの並びを確認し、必要であれば正しい順序に整理いたします。
もしこの説明でしっくりきていただけたら、あとは実際のコードを拝見して確定させるだけです。私の対応方針と強みも、よろしければご覧ください。
対応方針・強みを見る →