2011-02-16 12 views
3

PhoneGap + jQuery Mobileを使用してAndroid Appを構築しているときにHTML5データベースにアクセスしようとしています。次のコードでは異なる結果が得られることは奇妙です。 Galaxy S 2.2(chris、lulu、chris)では正しい結果を得ることができますが、Cliq TX(Android 2.1)ではアプリが壊れてしまい(最後の警告はcreateTable()です)、Emulator 2.3では最初の警告でアプリがクラッシュしました。私はデータベースを取り出し、正しく作成されていることがわかりました。これらの問題を説明するのは難しいと思います。そのような単純なコードがなぜ多くの問題を引き起こすのですか?誰かがデータベースへのアクセスに成功しましたか?PhoneGap + jQuery Mobile access HTML5 AndroidでのSqliteデータベースの問題

ありがとうございます。

function init() { 
    alert('init()'); 
    document.addEventListener("deviceready", onDeviceReady, false); 
} 

function onDeviceReady() { 
    if (!window.openDatabase) { 
     alert('Local Databases are not supported.'); 
    } else { 
     db = window 
       .openDatabase("YCHW", "1.0", "YCHW", 200000); 
    } 
    dropTable(); 
    createTable(); 
    insertData(); 
    selectData(); 
} 

function dropTable(){ 
    alert('dropTable()'); 
    db.transaction(
     function (transaction) { 
      transaction.executeSql("DROP TABLE measurements;", [], nullDataHandler, errorHandler); 
     } 
    ); 
    console.log("Table 'measurements' has been dropped."); 
    // location.reload(); 
} 

function createTable(){ 
    alert('createTable()'); 
    db.transaction(
     function (transaction) { 
      transaction.executeSql('CREATE TABLE IF NOT EXISTS measurements(id INTEGER NOT NULL PRIMARY KEY, user TEXT NOT NULL, date TEXT NOT NULL, height INTEGER NOT NULL, weight INTEGER NOT NULL, bmi REAL NOT NULL, abnormal INTEGER NOT NULL);', [], nullDataHandler, errorHandler); 
     } 
    ); 
    console.log("Table 'measurements' has been created."); 
} 

function insertData(){ 
    alert('insertData()'); 
    db.transaction(
     function (transaction) { 
      var data = ['1','chris','2000-02-22 00:00:00.000','170','60', '20', '0']; 
      transaction.executeSql("INSERT INTO measurements(id, user, date, height, weight, bmi, abnormal) VALUES (?, ?, ?, ?, ?, ?, ?)", [data[0], data[1], data[2], data[3], data[4], data[5], data[6]]); 
      data = ['2','lulu','2000-02-22 00:00:00.000','170','60', '20.12', '0']; 
      transaction.executeSql("INSERT INTO measurements(id, user, date, height, weight, bmi, abnormal) VALUES (?, ?, ?, ?, ?, ?, ?)", [data[0], data[1], data[2], data[3], data[4], data[5], data[6]]); 
      data = ['3','chris','2222-02-22 00:00:00.000','170','60', '20.12', '1']; 
      transaction.executeSql("INSERT INTO measurements(id, user, date, height, weight, bmi, abnormal) VALUES (?, ?, ?, ?, ?, ?, ?)", [data[0], data[1], data[2], data[3], data[4], data[5], data[6]]); 
     } 
    ); 
    console.log("Data has been inserted."); 
} 

function selectData(){ 
    alert('selectData()'); 
    db.transaction(
     function (transaction) { 
      transaction.executeSql('SELECT * FROM measurements;', [], dataSelectHandler, errorHandler); 
     } 
    ); 
    console.log("Data has been selected."); 
} 

function dataSelectHandler(transaction, results){ 
    alert('dataSelectHandler()'); 
    for (var i=0; i<results.rows.length; i++) { 
     var row = results.rows.item(i); 
     var measurement = new Object(); 
     measurement.id = row['id']; 
     measurement.user = row['user']; 
     alert(measurement.user); 
    } 
} 

function nullDataHandler(){ 
    alert('nullDataHandler()'); 
    console.log("nullDataHandler()"); 
} 

function errorHandler(transaction, error){ 
    alert('errorHandler()'); 
    if (error.code==1){ 
     // DB Table already exists 
     alert('DB Table already exists'); 
    } else { 
     // Error is a human-readable string. 
     console.log('Oops. Error was '+error.message+' (Code '+error.code+')'); 
     alert('Oops. Error was '+error.message+' (Code '+error.code+')'); 
    } 
    return false; 
} 

答えて

2

私は同様の問題があったが、私の解決策は、このような何かを入れていた:

の代わりに、このやって:

dropTable(); 
createTable(); 
insertData(); 
selectData(); 

を、私はこのように、それらをチェーンになります。

function (transaction) { 
      transaction.executeSql("DROP TABLE measurements;", [], nullDataHandler, errorHandler); 
     }, errorHandler, createTable 

関数(トランザクション)もコールバックハンドラを使用できるため、以前のステートメントが完全に実行されました。お役に立てれば。

+0

こんにちはノースクリエイティブ、ご返信ありがとうございますが、私はあなたをかなり理解していません。なぜあなたはerrorHandlerを置くのですか?より詳細な答えを教えてください。ありがとうございました!クリス – ThinkChris

+0

ああ、申し訳ありません - うさぎ。 errorHandlerは、エラーが発生した場合のコールバックです。これを削除するか、コードに追加することができます。function errorHandler(トランザクション、エラー){console.log( 'エラーが発生しました');} ' – TNC

関連する問題