2013-12-13 68 views
2

我是钛合金和合金的新手,但使用大约3个月后我感觉很舒服。然而,我对合金中的模型非常陌生,我遇到了一个我无法弄清楚的错误。以下是我的模型和控制器设置的方式(不包括与.XML文件无关的视图)钛合金模型 - 表没有列

Orders.js |型号

exports.definition = { 
config : { 
    columns : { 
     "id_Orders" : "INTEGER PRIMARY KEY AUTOINCREMENT", 
     "reseller_name" : "TEXT", 
     "reseller_invoice_account" : "TEXT" 
    }, 
    adapter : { 
     type : "sql", 
     collection_name : "orders", 
     idAttribute: "id_Orders" 
    } 
} 

Orders.js |控制器

var network = require("network"); 
network.soapRequest("<prem:getResellersRequest/>", function(a) { 
    Ti.API.info("The Soap Server Returned: " + JSON.stringify(a)); 
    Ti.API.info("There are " + a.reseller_name.length + " returned records."); 
    for (var i = 0; a.reseller_name.length > i; i++) { 
     var listModel = Alloy.createModel("orders", { 
      reseller_name: a.reseller_name[i], 
      reseller_invoice_account: a.reseller_invoice_account[i] 
     }); 
     listModel.save(); 
     Alloy.Collections.orders.fetch(); 
    } 
}); 
Alloy.Collections.orders.fetch(); 

在listModel.save会出现错误()行:

错误执行SQL:表订单没有名为RESELLER_NAME柱:,在编译:REPLACE INTO订单(id_Orders,RESELLER_NAME, reseller_invoice_account)VALUES(?,?,?);

网络是一个向web服务器发送SOAP请求并使用soap2json.js将其转换为JSON的库。我确信网络部分没有任何问题。 我很确定返回的JSON对象'a'存在错误。我可以单独输出所有的值并在其他地方使用 - 当我试图将模型保存到集合时发生错误。

我错过了什么吗?

回答

4

通常会在第一次运行应用程序后修改模型定义时发生,可能是您并在此之后添加了reseller_name列。您必须重新生成表格。

当它发生在我身上,我处于开发阶段时,我通常会在alloy.js文件的开头做一个DROP表。试试这个:

var db = Ti.Database.open ('_alloy_'); 
    db.Execute ('DROP TABLE IF EXISTS orders;'); 
    db.close(); 

显然,这会破坏表中的任何数据,但合金再生与新定义的表,你instancies集合或模型中的第一次。

,如果你需要将自己的数据来处理这些变化的正确方式是使用migrations

+2

这样看来,的确如此 - 在设备上已经存在的数据库丢失我后来加列。我克服这个问题的最简单方法是进入应用程序的设备信息并清除应用程序的数据。我认为这与删除表格的效果相同,但要容易得多。 –