Cordova - WebSQL数据库无法在我的手机中运行

时间:2015-06-12 08:53:19

标签: cordova web-sql

我使用Cordova创建了一个Android应用程序。我在这个项目中使用了WebSQL数据库。我的代码是:

    function onDeviceReady(){
        var db = window.openDatabase("Database", "1.0", "Cordova Demo", 200000);
        //for create tables and default data records after the project instaling (for first run)
        if (typeof window.localStorage.getItem('firstTime') === 'undefined' || window.localStorage.getItem('firstTime') == null)
        {
            alert('first run');
            db.transaction(populateDB);
            window.localStorage.setItem('firstTime', 0);
        }
        db.transaction(applySetting);
    }
    function populateDB(tx) {
        tx.executeSql('DROP TABLE IF EXISTS setting');
        tx.executeSql('CREATE TABLE IF NOT EXISTS setting (title text, value text)');
        tx.executeSql('insert into setting(title, value) values("font_family", "nazanin")');
        tx.executeSql('insert into setting(title, value) values("font_size", "19")');
        alert('table created');
        return true;
    }
function applySetting(tx)
{
    tx.executeSql('select * from setting where title = "font_family"', [], function(tx, results){
        if(results.rows.length)
        {
            alert(results.rows.length);
            $('.content').css('font-family', results.rows[0].value);
            if($.mobile.activePage.attr('id') == 'setting')
            {
                $('input[name="font-family"]').prop( "checked", false ).checkboxradio( "refresh" );
                $('input#font-' + results.rows[0].value).prop( "checked", true).checkboxradio( "refresh" );
            }
        }
    });

在第一次运行期间,警告apear:

  1. first run
  2. table created
  3. 当我想在alert(results.rows[0].value) Android monitor program AndroidManifest.xml之前提醒其中一条记录时出现此错误:

      

    未捕获的TypeError:无法读取属性'值'未定义的

    要使用数据库,需要<?xml version='1.0' encoding='utf-8'?> <manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" package="com.shia.main" xmlns:android="http://schemas.android.com/apk/res/android"> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" /> <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.Black.NoTitleBar" android:windowSoftInputMode="adjustResize"> <intent-filter android:label="@string/launcher_name"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> </manifest> 文件中的特殊权限吗?

    AndroidManifest.xml内容:

    {{1}}

    在Chrome浏览器中,此项目正常运行。

1 个答案:

答案 0 :(得分:1)

问题可能是cordova和sqlite查询的异步性质。第一个 db.transaction 调用可能尚未完成。您可以尝试在populateDB中调用 applySetting 并将其放在最后 tx.executeSql 调用的回调中:

function populateDB(tx) {

    tx.executeSql('DROP TABLE IF EXISTS setting');
    tx.executeSql('CREATE TABLE IF NOT EXISTS setting (title text, value text)');

    tx.executeSql('insert into setting(title, value) values("font_family", "nazanin")',[], function(tx, res) {

        tx.executeSql('insert into setting(title, value) values("font_size", "19")',[], function(tx, res) {

           applySetting(tx);

        });

    });

}

我使用此plugin并且仍然可以推荐它。您可以找到一个非常相似的示例(具有事务级嵌套的示例here 希望这会有所帮助。

此外,请看一下这些陈述:

 CREATE TABLE IF NOT EXISTS setting (title text, value text)
 insert into setting(title, value) values("font_family", "nazanin")
 insert into setting(title, value) values("font_size", "19")

它们可能正常工作,但属性名称​​ value 可能在sqlite中保留,因此可能无法创建具有名为 value 的属性的表。您是否尝试将其重命名为:

 CREATE TABLE IF NOT EXISTS setting (title text, val text)
 insert into setting(title, val) values("font_family", "nazanin")

或者只是使用任何其他名称。