来自数组值的Javascript动态变量名称(Appcelerator Titanium)

时间:2011-04-15 21:53:39

标签: javascript variables dynamic titanium appcelerator

我正在开发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大师可以在这里伸出援助之手!

干杯

2 个答案:

答案 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();