Titanium Alloy中的SQLite更新查询

时间:2014-09-17 06:42:02

标签: android ios sqlite titanium-alloy

你好Titanium开发者。

我是Titanium Alloy开发的新手,但不是Javascript。我在Titanium Alloy应用程序中遇到了SQLite更新查询的问题并寻求帮助。

我的控制器js文件如下。

var items = [];
var db = Ti.Database.open('listDB');
//db.file.setRemoteBackup(false);

db.execute('CREATE TABLE IF NOT EXISTS liststatus(id INTEGER PRIMARY KEY, name TEXT, value INTEGER);');
var my_result_set = db.execute('SELECT * FROM liststatus');
var records = my_result_set.rowCount;

Ti.API.info(records);
if(records == 0){
    db.execute('INSERT INTO liststatus(id, name, value) VALUES (1, "Node #1", 0)');
    db.execute('INSERT INTO liststatus(id, name, value) VALUES (2, "Node #2", 0)');
    db.execute('INSERT INTO liststatus(id, name, value) VALUES (3, "Node #3", 1)');
}

var rows = db.execute('SELECT * FROM liststatus');

while (rows.isValidRow())
{
    if(rows.fieldByName('value') == 1){
        var truVal = "true";
    }else{
        var truVal = "false";
    }
    items.push({"id": rows.fieldByName('id'), "label":{text: rows.fieldByName('name')},"switchVal":{value: truVal}, "template": "title_only"});
    rows.next();
};

$.dynamicListView.sections[0].setItems(items);

var itemsUpdate = [];

function outputState(e){
    var section = $.dynamicListView.sections[e.sectionIndex];
    var item = section.getItemAt(e.itemIndex);
    //itemsUpdate.push({"id": item.id, "value": e.value});
    var val = e.value;
    var itemId = item.id;
    //db.execute('UPDATE liststatus SET value=? WHERE id=?',1,1);
    db.execute('UPDATE liststatus SET value=? WHERE id=?',val,itemId);
}
rows.close();
db.close();

我的观点xml看起来像这样。

<Alloy>
    <Window class="container" id="dbWin">
        <!--<Toolbar top="0" platform="ios">
            <Items>
                <Button id="button" onClick="saveData">Save</Button>
            </Items>
     </Toolbar>-->
        <ListView id="dynamicListView">
            <Templates>
                <ItemTemplate name="title_only">
                    <View layout="horizontal">
                        <Label class="label" bindId="label"/>
                        <Switch bindId="switchVal" onChange="outputState" />
                    </View>
                </ItemTemplate>
            </Templates>
            <ListSection/>
        </ListView>
    </Window>
</Alloy>

问题是当切换切换更改时,更新查询根本不会触发。我该如何解决这个问题?我在这里做的不是什么?非常感谢您的帮助!

问候。

Shreerang

1 个答案:

答案 0 :(得分:1)

我不知道为什么它不会被触发,但我会先将Ti.Api.info添加到该函数中,然后查看它是否被调用。

现在,您的代码中存在一些基本错误(与javascript而非Titanium相关的错误)可能会导致问题和内存泄漏。

  1. 您正在函数范围之外创建db变量(控制器的范围)。因为它正在函数内部使用,所以js引擎会保留对它的引用 - 并且由此将其保存在内存中 - 因此存在内存泄漏。
  2. 执行一些代码,关闭db。当您调用该函数时,您的数据库连接应该已经关闭 - 我会在Titanium控制台中查找有关该更新执行的错误。
  3. 你应该做的是在函数范围内创建,打开和关闭数据库的新实例。

    希望有所帮助