2013-12-13 4 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 (?,?,?);

Сеть - это lib, которая отправляет SOAP-запрос на веб-сервер и преобразует его в JSON с помощью soap2json.js. Я убежден, что нет ничего плохого в сетевой части. Я уверен, что с возвращенным объектом JSON 'a' не замечается. Я могу вывести все значения по отдельности и использовать его в другом месте - ошибка возникает, когда я пытаюсь сохранить модель в коллекции.

Я что-то упустил?

ответ

4

Это обычно происходит, когда вы изменяете определение модели после первого запуска приложения, возможно, вы и после этого добавили столбец reseller_name. Вы должны восстановить таблицу.

Когда это происходит со мной, и я нахожусь на стадии разработки, я обычно делаю DROP таблицы в начале файла alloy.js. Попробуйте это:

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

Очевидно, что это разрушает все данные в таблице, но сплав регенерировать таблицу с новым определением в первый раз, когда вы instancies коллекции или модели.

Правильный способ справиться с этими изменениями, если вам нужно, чтобы сохранить ваши данные использовать migrations

+2

Похоже, что это действительно так - уже существующая база данных на устройстве не хватает колонки я добавил позже. Проще всего я преодолел эту проблему, перейдя в информацию о приложении на устройстве и очистив данные приложения. Я предполагаю, что это имеет тот же эффект, что и падение таблицы, но гораздо легче сделать. –

Смежные вопросы