2011-04-15 68 views
2

我正在開發一個Titanium應用程序,並且構建了一個函數來運行sqlite數據庫查詢並返回一個結果集(數組)。來自數組值的Javascript動態變量名(Appcelerator Titanium)

我不會打擾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') 
     }; 
    } 

好,因此多數民衆贊成一切ok。但它不夠動態。當你想從不同的表中選擇不同的字段時會發生什麼。身份證,姓名,父母和訂單顯然不起作用。

我試圖做的是採取一個數組(我已經有)和使用的值作爲自己的名字,像這樣:

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的大師能夠在這裏伸出援助之手!

乾杯

回答

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(); 
+0

感謝您的迴應雅各布 - 這確實讓更多的意義比我了!儘管如此,我確實似乎遇到了問題。 「fields [i]:resultSet.fieldByName(fields [i])」這一行出現了一個令人討厭的錯誤:「[ERROR] Script Error =表達式結果'results [i]'[undefined]不是一個對象,在builder.js(第45行)。「數據庫絕對是填充的,就像我用一個簡單的警報來替換該行,顯示它的字段名稱,ID和結果。任何想法可能是錯的?我沒有清除緩存/重建/等,但仍然沒有運氣:( – Sk446 2011-04-16 09:37:56

+0

@RickM,嗯,現在怎麼樣? – 2011-04-18 07:45:21

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