我有一个应用程序,使用Lite4Cordova插件。在第一次运行应用程序时,它会从一些文档中填充虚拟SQLite FS4表。它在模拟设备上正确运行,但在具有SQL错误的真实设备上失败。
要打开数据库,我这样做:
var db;
var shortName = 'linienDB';
var version = '1.0';
var displayName = 'linienDB';
var maxSize = 65535;
db = window.sqlitePlugin.openDatabase({name: shortName, version: version, displayName: displayName, maxSize: maxSize});
alert("OpenDB is " + db)
警报让我在模拟器和真实设备上“OpenDB是[object Object]”。
创建表代码是这样的:
db.transaction(function(tx){
tx.executeSql( 'CREATE VIRTUAL TABLE IF NOT EXISTS guidelines USING FTS4 (category, id, chapter, header, content)',[],defaultNullHandler,defaultErrorHandler);
},defaultErrorHandler);
在模拟设备上,运行正常。数据库被创建&填充正确,&我可以对它运行查询。但是在我的真实设备上,defaultErrorHandler
被db.transaction
触发,我得到警告“错误处理SQL:未定义”。控制台上的错误是:
12-18 17:39:08.948: V/executeSqlBatch(4375): SQLitePlugin.executeSql[Batch](): Error=near "NOT": syntax error: , while compiling: CREATE VIRTUAL TABLE IF NOT EXISTS guidelines USING FTS4 (category, id, chapter, header, content)
如果我切换回标准的WebSQL DB打开,如下所示:
db = openDatabase(shortName, version, displayName, maxSize);
然后OpenDB警报为OpenDB is [object Database]
,加载序列完成 - 但当然没有构建表,因为创建FS4虚拟表是SQLite命令,而不是WebDB命令。
更新:
在LogCat发生错误后,“Not”附近出现错误,我从Create Table语句中删除了“IF NOT EXISTS”,并且只有:
db.transaction(function(tx){
tx.executeSql( 'CREATE VIRTUAL TABLE guidelines USING FTS4 (category, id, chapter, header, content)',[],defaultNullHandler,defaultErrorHandler);
},defaultErrorHandler);
现在可以在设备上完美运行。令人讨厌的是不能使用IF NOT EXISTS语法,但是对于有用的错误仍然赞成Android SDK。