加快检索查看数据?

时间:2014-01-23 21:35:48

标签: titanium dominotogo

我试图从中提取数据的数据库有大约50,000个文档。目前,iOS或Android设备在视图中查询并向移动设备显示数据大约需要90秒。我的代码发布在下面。有什么我可以采取不同的方式来加快速度吗?感谢您的任何提示。

function updateAllPoliciesTable() {
    try {
        var db = Alloy.Globals.dbPolicyInquiry;
        var view = db.getView("AllRecordsByInsured");
        var vec = view.getAllEntriesBySQL("Agent like ? OR MasterAgent like ?", [Ti.App.agentNumber, Ti.App.agentNumber], true);

        var ve = vec.getFirstEntry();
        var data = [];
        while (ve) {
            var unid = ve.getColumnValue("id");
            var row = Ti.UI.createTableViewRow({
                unid : unid,
                height: '45dp',
                rowData: ve.getColumnValue("Insured") + "  " + ve.getColumnValue("PolicyNumber")
            });

            var viewLabel = Ti.UI.createLabel({
                color : '#333',
                font : {
                    fontSize : '16dp'
                },
                text: toTitleCase(ve.getColumnValue("Insured")) + "  " + ve.getColumnValue("PolicyNumber"),
                left: '10dp'
            });

            row.add(viewLabel);
            data.push(row);
            ve = vec.getNextEntry();
        }

        //Ti.API.log("# of policies= " + data.length);

        if(data.length == 0) {
            var row = Ti.UI.createTableViewRow({
                title : "No policies found"
            });
            data.push(row);
        }

        $.AllPoliciesTable.setData(data);
        Alloy.Globals.refreshAllPolicies = false;
        Alloy.Globals.loading.hide();
    } catch (e) {
        DTG.exception("updateAllPoliciesTable -> ", e);
    }
}

2 个答案:

答案 0 :(得分:1)

嗯,与大数据库引擎不同,SQLite数据库引擎更受限制,它运行的设备也是如此。

我要做的是检查提取数据的查询 - 您是否在表中使用索引?你用它们来查询吗?是否有不必要的连接或拉动?

我没有推文询问您应该考虑查看移动noSQL解决方案 - 我知道appcelerator市场上有一些 - 检查它是否适合您的需求以及是否加快了速度。

答案 1 :(得分:1)

在适当的表上创建一个索引,这应该可以加快速度。 您的视图的SQLite表应命名为“view_AllRecordsByInsured”。 为该表创建索引,查看有关“CREATE INDEX”的SQLite文档以获取更多详细信息。

要执行适当的SQL,您可以使用DTGDatabase类,如

var sqldb = new DTGDatabase(Alloy.Globals.dbPolicyInquiry.localdbname);
sqldb.execute("CREATE INDEX IF NOT EXISTS ON view_AllRecordsByInsured (Agent,MasterAgent)")

如果确实提供了足够的速度,请查看SQLite dbs的全文搜索。 下面是一些关于全文索引的示例代码,为您提供一个起点:

CREATE VIRTUAL TABLE ft_view__mobile_companies_ USING fts4(id, customername, customercity)
INSERT INTO ft_view__mobile_companies_(id, customername, customercity) SELECT id, customername, customercity FROM view__mobile_companies_

要查询索引,需要使用MATCH运算符执行SQL(请参阅SQLite文档)。在一个应用程序中,我从Domino视图同步了超过100.000个数据集,并且在SQLite中使用全文搜索进行搜索立即工作。