0

我正在使用钛合金并针对 android 模拟器进行测试 - 但也欢迎任何与 iOs 相关的建议!

我正在尝试将钛与数据库一起使用。我正在使用 firefox sql lite 插件来制作我的数据库 - 所以我制作了它,然后我去了

database > export database > to a location in my titanium app project that is under "Resources" folder

好的,整洁。

然后我有这个代码:

var db = Ti.Database.install('/db/wibbler.sql','wibbler');

function getLanguages(){
var sql = 'select * from language order by name desc';

var results = [];

var resultSet = db.execute(sql);

while (resultSet.isValidRow()){
    results.push({
        name: resultSet.fieldByName('name'),
        id: resultSet.fieldByName('id'),
        desctiption: resultSet.fieldByName('description')
    });
    reultSet.next();
}
resultSet.close();
return results;
}

如您所见,文件的位置是

Resources/db

数据库文件名为“wibbler.sql”

问题是,当我运行我的应用程序时,它抱怨我正在使用的 sql 引用了一个不存在的表 - 即:

未捕获的错误:没有这样的表

什么是交易?

4

2 回答 2

1

首次运行var db = Ti.Database.install('/db/wibbler.sql','wibbler');时,数据库文件Resources/db/wibbler.sql将安装在私人文档 (iOS) 或内部或外部存储 (Android) 中。db 的这个新副本是您的 var db 将指向的位置。 文档

当您第二次运行该应用程序时,由于数据库已经安装,它只会打开该副本。因此,如果您运行该应用程序,然后在 下的数据库文件中添加一个表,则References该新表将不会反映在 db.xml 的副本中。

要解决此问题,您可以执行以下操作之一:

于 2012-08-29T21:01:58.167 回答
0

好的,所以答案有点混杂——亚当建议的一些东西,以及我没有意识到的其他一些东西

首先:我的文件只是一个导出的 sqllite 数据库。这是不对的 - 该文件应该是实际的数据库文件(所以,你知道,firefox 创建的数据库的“位置”应该位于 Resources 文件夹中的某个位置,并且 Titan 应该指向那个)。

本教程澄清了这一点:http: //blogs.usask.ca/the_bolt/archive/2010/12/titanium_tutorial_database.html

如教程中所述,它已过时 - 但我只需要知道我在钛代码中使用了错误的文件。

接下来,正如亚当所提到的,android 将继续使用旧的数据库——你每次都可以清理它,但这很麻烦。试试这个:

var db = Ti.Database.open('wibbler');
db.remove();
db = Ti.Database.install('/db/wibbler.sqlite','wibbler');

找到数据库,杀死它,然后重新安装它。另请注意,我现在指向的是 sqlite 文件,而不是 sql 文件。

万岁!

于 2012-08-30T14:03:51.587 回答