سؤال

بدلاً من القيام بكل حلقة على ملف JSON الذي يحتوي على قائمة بإحصاءات SQL وتمريرها واحدًا في وقت واحد ، هل من الممكن مع تخزين جانب عميل Safari ببساطة لف البيانات في "Begin Transaction" إلى نظام قاعدة البيانات في مكالمة واحدة؟ يتطلب حلقات أكثر من 1000 بيانات الكثير من الوقت.

تكرار معاملة واحدة حاليًا في وقت واحد:

$j.getJSON("update1.json",
  function(data){
    $j.each(data, function(i,item){
            testDB.transaction(
                function (transaction) {
                    transaction.executeSql(data[i], [], nullDataHandler, errorHandler);
                }
            );
   });
});

محاولة معرفة كيفية إجراء مكالمة واحدة فقط:

$j.getJSON("update1.json",
  function(data){
            testDB.transaction(
                function (transaction) {
                    transaction.executeSql(data, [], nullDataHandler, errorHandler);
                }
            );
});

هل حاول أي شخص هذا بعد ونجح؟

هل كانت مفيدة؟

المحلول

يبدو أن كل مثال يمكنني العثور عليه في الوثائق يظهر واحدًا فقط SQL بيان لكل executeSql يأمر. أود أن أقترح فقط إظهار رسم "Ajax Spinner" تحميل رسومات وتنفيذ SQL في حلقة. يمكنك إبقاء كل شيء داخل المعاملة ، لكن الحلقة ستظل بحاجة إلى أن تكون هناك:

$j.getJSON("update1.json",
    function(data){
       testDB.transaction(
           function (transaction) {
               for(var i = 0; i < data.length; i++){
                   transaction.executeSql(data[i], [], nullDataHandler, errorHandler);
               }
           }
       );
    }
);

تحريك الحلقة داخل المعاملة واستخدام for i = يجب أن تساعد في الحصول على مزيد من السرعة من حلقتك. $.each جيد لأقل من 1000 تكرار ، بعد ذلك المواطن for(var = i... ربما تكون أسرع.

ملحوظة باستخدام الكود الخاص بي ، إذا كانت أي من عبارات SQL الخاصة بك ترمي الأخطاء ، فسوف تفشل المعاملة بأكملها. إذا لم يكن هذا هو نيتك ، فستحتاج إلى الحفاظ على الحلقة خارج المعاملة.

نصائح أخرى

لم أكن أفسد من أي وقت مضى مع تخزين قاعدة بيانات HTML5 (مع محلي/SessionStorage) وأفترض أنه من الممكن تشغيل سلسلة واحدة من العبارات. يستخدم data.join(separator here) للحصول على تمثيل سلسلة من data مجموعة مصفوفة.

نعم ، من الممكن معالجة مجموعة كاملة من العبارات ضمن معاملة واحدة مع WebSQL. أنت في الواقع لا تحتاج حتى إلى استخدام البداية أو الالتزام ، يتم الاعتناء بذلك تلقائيًا طالما أنك تقوم بجميع مكالمات ActureSQL الخاصة بك من نفس المعاملة. طالما أنك تفعل هذا يتم تضمين كل عبارة في المعاملة.

هذا يجعل العملية أسرع بكثير ويجعلها أيضًا بحيث عندما يكون أحد عباراتك يخطئ ، فإنه يعيد المعاملة بأكملها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top