0

我试图从中提取数据的数据库有大约 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);
    }
}
4

2 回答 2

1

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

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

如果您未能发布查询,您可能应该考虑查看移动 noSQL 解决方案 - 我知道 appcelerator 市场上有一些解决方案 - 检查它是否适合您的需求以及它是否加快了速度。

于 2014-01-24T18:11:00.253 回答
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 文档)。在一个应用程序中,我有超过 100,000 个从 Domino 视图同步的数据集,并且在 SQLite 中使用全文搜索进行搜索可以立即工作。

于 2014-01-27T15:10:22.667 回答