我使用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:
first run
table created
当我想在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浏览器中,此项目正常运行。
答案 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")
或者只是使用任何其他名称。