我正在开发Titanium应用程序并构建一个函数来运行sqlite数据库查询并返回结果集(数组)。
我不会费心去深入了解Titaniums的细节,因为它不应该对我面临的问题产生太大的影响。
基本上任何查询都可以使用此函数执行,因此一旦执行它就需要一个与某些数据库列名对应的数据数组。这是我遇到问题的地方。通过钛系统的工作方式,我需要将结果推送到结果数组中,如下所示:
var resultSet = conn.execute('SELECT * FROM some_table WHERE parent = ?', parent);
if (resultSet.isValidRow()) {
result = {
id: resultSet.fieldByName('id'),
name: resultSet.fieldByName('name'),
parent: resultSet.fieldByName('parent'),
order: resultSet.fieldByName('order')
};
}
好的,一切都好。但它不够动态。当您想要从具有不同字段的不同表中进行选择时会发生什么。 id,name,parent和order显然不起作用。
我要做的是拿一个数组(我已经有了)并使用这些值作为它们的名字,如下所示:
var resultSet = conn.execute(<!-- SQL IS IN HERE -->);
var fieldCount = resultSet.fieldCount();
var fields = [];
for(i=0;i<fieldCount;i++) {
fields.push(resultSet.fieldName(i));
};
// At this point we have an array 'fields' which contains all the field names.
var results = [];
while (resultSet.isValidRow()) {
results.push({
// START OF PROBLEM
for(i=0; i < fields.length; i++)
{
fields[i]: resultSet.fieldByName(fields[i]);
}
// END OF PROBLEM
});
resultSet.next();
};
resultSet.close();
上面注释的开头/结尾显示了问题代码。我意识到它的错误,但无法弄清楚它应该如何。让我们说字段数组包含'id'和'name',我需要变量来覆盖它们中的两个,但它们必须是动态的 - 我想避免为每个表创建一个新的javascript函数。
我应该指出我是一个PHP人,我在JS方面的经验非常有限。我一直用这个作为学习的机会,但是我无法理解这个!真的很抱歉,如果它没有得到足够清楚的解释,并希望JS大师可以在这里伸出援助之手!
干杯
答案 0 :(得分:4)
你几乎得到它,除了你试图遍历对象文字中的字段数组,这完全无效 - 你只能拥有键值对在对象文字中。
var resultSet = conn.execute(<!-- SQL IS IN HERE -->);
var fieldCount = resultSet.fieldCount;
var fields = [];
for(var i = 0; i < fieldCount;i++) {
fields.push(resultSet.fieldName(i));
};
var results = [];
while (resultSet.isValidRow()) {
for(var i=0; i < fields.length; i++) {
results[i] = {};
results[i][fields[i]] = resultSet.fieldByName(fields[i]);
}
resultSet.next();
};
resultSet.close();
答案 1 :(得分:0)
试试这个
Ti.UI.backgroundColor= 'white';
var win= Titanium.UI.createWindow();
var db= Titanium.Database.open('MY_DB');
db.execute('CREATE TABLE IF NOT EXISTS USERS1 (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, PHONE_NUMBER, IL TEXT)');
db.execute('DELETE FROM USERS1');
db.execute('INSERT INTO USERS1(NAME, PHONE_NUMBER, IL) VALUES(?, ?, ?)', 'SALIH-1','1-SALIH', 'RIZE-1');
db.execute('INSERT INTO USERS1(NAME, PHONE_NUMBER, IL) VALUES(?, ?, ?)', 'AHMET-2','2-AHMET', 'RIZE-2');
db.execute('INSERT INTO USERS1(NAME, PHONE_NUMBER, IL) VALUES(?, ?, ?)', 'HAKAN-3','3-HAKAN', 'RIZE-3');
db.execute('INSERT INTO USERS1(NAME, PHONE_NUMBER, IL) VALUES(?, ?, ?)', 'GALIP-4','4-GALIP', 'RIZE-4');
var resultSet = db.execute('SELECT * FROM USERS1');
var fieldCount = resultSet.fieldCount();
var fields = [];
for(var i = 0; i < fieldCount;i++) {
fields.push(resultSet.fieldName(i));
};
var i=0;
var results = [];
while (resultSet.isValidRow()) {
results[i] = {};
for (var j=0; j < fieldCount; j++) {
results[i][fields[j]] = resultSet.fieldByName(fields[j]);
};
resultSet.next();
i++;
};
// Get ALL DATA
alert(results);
// Get row 0
alert(results[0]);
// get row 0 - column Name
alert(results[0]['NAME']);
resultSet.close();
win.open();