【问题标题】:How can I install a database in a titanium alloy project?如何在钛合金项目中安装数据库?
【发布时间】:2017-01-29 07:19:27
【问题描述】:

我一直在尝试使用文档中的代码将一个小型简单数据库安装到我的钛项目中,并尝试根据各种来源的建议进行不同的调整。但我无法让它工作,我得到像“没有这样的表”或结果集为空的错误。目前我的代码如下所示:

var db = Ti.Database.install('../assets/exercises.db', 'exercisesDB');
Ti.API.info('installed '+ db.getName()  );
db.close();
Ti.API.info('closed db'  );
db = Ti.Database.open('exercisesDB');
Ti.API.info('reopened db'  );
//Ti.API.info(db.getName()  );
var exercisesDBRS = db.execute('SELECT id,name FROM exercise');

我已尝试将数据库文件exercises.db 放在资产文件夹和资源文件夹中,但我没有找到任何地方。我在 OSX Sierra 上使用“DB Browser for SQLite”ver 3.9.1 创建了 db 文件 - 它与 appcelerator 合金项目兼容吗?我当前的代码在执行调用时产生错误“没有这样的表”。我向你保证 db 文件有一个练习表。

PS,新项目 index.js 文件中的完整代码如下:

var db = Ti.Database.install('exercises.sqlite', 'exercisesDB');
Ti.API.debug('installed '+ db.getName()  );
db.close();
Ti.API.debug('closed db'  );
db = Ti.Database.open('exercisesDB');
Ti.API.debug('reopened db'  );
var exercisesDBRS = db.execute('SELECT id, name FROM exercise');
Ti.API.debug('executed select');
Ti.API.debug(' rowcount== '+   exercisesDBRS.rowCount);

while (exercisesDBRS.isValidRow()) {
    var exId = exercisesDBRS.fieldByName('id');
    var exName = exercisesDBRS.fieldByName('name');

    Ti.API.debug("Exercise: "+exId + ' ' + exName  );
    exercisesDBRS.next();
}
exercisesDBRS.close();
db.close(); 

function doClick(e) {
    alert($.label.text);
}

$.index.open();

新项目,但代码相同,并且在 app/lib 文件夹中具有相同数据库文件的副本。同样的错误 - 在 android 中测试时执行行上没有这样的表,在 iOS sim 中工作正常。

【问题讨论】:

    标签: sqlite titanium appcelerator titanium-alloy


    【解决方案1】:

    根据文档,您的外部数据库应位于运行以下代码的同一位置:

    var db = Ti.Database.install('../assets/exercises.db', 'exercisesDB');

    1. 没有必要使用 ../assets/。您可以在没有它的情况下简单地引用数据库,因为您放置在 assets 文件夹中的所有内容都会移动到相应的 Resources->iphone/android 文件夹中。

    2. 您始终可以对外部数据库使用 Ti.Database.install 方法,因为在安装一次数据库后,它的行为类似于 Ti.Database.open('exercisesDB') 方法。

    回到您最关心的问题,您始终可以安全地将数据库文件放在 app -> lib 文件夹中(创建 lib 文件夹,如果它不存在,然后将 db 文件放在那里)。

    将 db 文件放在那里后,您可以随时使用以下代码:

    var db = Ti.Database.install('exercises.db', 'exercisesDB');

    不过,我从来没有使用过 .db 扩展名,而是一直使用 .sqlite 格式(因为文档也说 SQLite 数据库)并且它 100% 正确每次。

    所以你可以通过将数据库格式更改为.sqlite并将其放入app->lib文件夹来尝试此过程。它肯定会起作用,在验证您可以在使用 .db 文件时使用相同的代码并查看它是否受支持。

    在 Android 上:按照以下步骤操作:

    1- 在您的 PC 中,进入项目的根目录,删除 buildResources 文件夹。

    2-在设备上,从“设置”中清除应用数据,然后删除该应用。

    3- 现在使用与我在此处提到的相同的代码和流程再次安装应用程序。

    如果它适用于 iOS sim,那么它也应该适用于 Android(只有一些清理问题存在或您以前的数据库仍然存在)。

    【讨论】:

    • 谢谢,但我尝试了 lib 文件夹和脚本文件夹,但得到了同样的错误。尝试使用和不使用“/”,同样的错误。顺便说一句,我可以使用 sql 创建表,然后运行查询而不会出错,但当然也不会返回任何行。
    • 顺便说一句,我还尝试了 db 文件的完整绝对路径,我尝试将其作为 .db 和 .sqlite。到目前为止没有运气。
    • 一些进展,在清理项目并从 iOS 模拟器中删除应用程序后,它可以工作。但是,相同的过程在我的 android 设备上不起作用,仍然得到相同的 no such table 错误。我猜旧数据库仍在设备上。尝试清除应用数据,但仍然没有成功。
    • 即使在新的 android 模拟器上也会出现同样的错误。我重试了安装命令,没有你说的完整路径,现在它似乎在 iOS sim 中工作,但我在 android 上仍然无处可去。
    • 我已经编辑了我的答案,添加了一些步骤以在 Android 上正确运行应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多