2

iPad で使用するために、HTML5 Web SQL データベースを作成する必要があります (非推奨であることは認識しています)。iOS 6 では、50 MB のデータベースをすぐに作成できました。しかし、現在 iOS 7 にはバグが導入されています (この記事を参照してください)。) これにより、50 MB のデータベースが作成されなくなります。このバグの回避策は、小さなデータベースを作成し、必要に応じて拡張することだと理解しています。Safari では、ユーザーは 10 MB、25 MB、50 MB で拡張するように求められます。ただし、ユーザーがデータベースのサイズを増やすように求められると、データを挿入する JavaScript コードの実行が停止します。私は何を間違っていますか?(これは iOS 6 および 7 で発生します。) 私が知る限り、エラーはスローされません。ユーザーがデータベースを拡張するように求めた後、挿入を続行するにはどうすればよいですか? 私の Web SQL 挿入コードは次のとおりです (簡潔にするために一部のコードは省略されています)。

db.transaction(function (tx) {
   var insertSQL = 'insert into ...';

   for (var i = 0; i < len; i++) {
        var items = [{}]; // the items to insert

        tx.executeSql(insertSQL, items, function (tx, results) {
             // When all items are inserted, fire the callback method if there is one
             if ((++itemsInserted === itemsToInsert) && $.isFunction(callback)) {
                  callback();
             }
        }, function (tx, error) {
             if (console && $.isFunction(console.warn)) {
                  console.warn(error.message);
             }
        });
     }
});

データベースが最初に 50 MB で作成された場合、上記のコードは iOS 6 で正常に動作します。ただし、データベースが最初から小さい場合、このコードは機能しなくなります。お時間をいただきありがとうございます。

ありがとう、

アンディ

4

2 に答える 2

1

OK、これを行う1つの方法を見つけました。少しずさんですが、うまくいきます。以下のコードでは、iOS 7 をテストし、setInterval を介してタイマーを開始しています。15 秒の遅延の後、データがローカル テーブルに作成されていない場合は、DB サイズを増やすように求めるプロンプトによってユーザーが停止したため、機能しなかったと思います。次に、挿入を再試行し、2 回目の試行で成功するはずです。

// loadData hits a server endpoint to retrieve data and inserts that data into the Web SQL database
function loadData(config) {
    $.ajax({
        url: 'the url',
        //...other properties for the ajax request omitted...
        success: function (data) {
            // Kick off the insert of data into the local DB
            insertLocalData();

            // workaround for iOS 7 - verify whether the insert method's success callback was called
            if (/iphone|ipad/i.test(navigator.userAgent) && navigator.userAgent.indexOf('Version/7') !== -1) {
                config.timerId = setInterval(function () {
                    if (!config.dataInserted) {
                        insertLocalData();
                    }
                    else {
                        clearInterval(config.timerId);
                    }
                }, 15000);
            }

            function insertLocalData() {
                // db is a reference to the local DB and insert is the custom method whose guts can be found in the original question above
                config.db.insert(config.TableName, data.Data, function () {
                    config.dataInserted = true;
                    // Execute callback function if one was given
                    if ($.isFunction(config.successCallback)) {
                        config.successCallback(config);
                    }
                });
            }
        }
    });
}

Apple がこの Web SQL バグを修正してくれることを願っていますが、それまでの間、これが誰かの助けになるかもしれません。

ありがとう、

アンディ

于 2013-10-02T20:57:43.617 に答える
1

仕様で定義されているように、トランザクション メソッドのエラー コールバックを使用できるはずです。

database.transaction(
    function (tx) {
        tx.executeSql('INSERT INTO mytable (x, y) VALUES (?, ?)', [x, y], function() {}, function() {});
    }, 
    function (error) {
        if (error.code === 4) {
            // Quota exceeded
        }
    }
);

iOS 6 および 7 では、ユーザーがデータベース サイズを増やすように求められた後、常に QUOTA_ERR コードでこのエラー コールバックが呼び出されます。データベースの書き込みが 50 MB のハード リミットを超えた場合にも、この同じエラーが表示されます。

データベースがハード リミットに達したかどうか、またはユーザーが DB サイズを増やすように求められたかどうかを判断する良い方法があるかどうかはわかりません。ユーザーが DB サイズを増やしたり、増やすことを許可しない場合、これと同じエラーが表示されます。

于 2013-11-07T21:25:35.697 に答える