【问题标题】:How to organize WebOS SQL code that depends on previous results?如何组织依赖于先前结果的 WebOS SQL 代码?
【发布时间】:2011-05-16 20:23:08
【问题描述】:

我想做一个简单的 WebOS Mojo 应用程序,将日期添加到数据库中,但在此之前它需要通过查询数据库来检查几个条件。鉴于在 WebOS 中访问数据库的异步模式,我想知道编写此类代码的最有效和最简短的方法是什么。

例如,我需要确保新日期不在数据库中。然后我需要获取最接近的日期,以便我可以计算天数的差异,如果差异太小则抛出错误。然后我需要插入新的日期,然后计算一个平均值。

这很容易以同步方式访问数据库,但我不太喜欢在执行的不同 sql 语句的多个成功处理程序中编写部分代码的想法。有没有更优雅的解决方案?

【问题讨论】:

    标签: database webos


    【解决方案1】:

    您可以对 HTML 5 关系数据库函数使用内联回调:

    function createProject(project, onSuccess) { 
    if (project.projectId)
        throw new StorageError("project already exists");
    if (project.path)
        throw new StorageError("project already has a path");
    
    project.projectId = ++Tracker.maxLocalId * 4096;
    project.path = calcNextProjectPath();
    project.normalize();
    
    Tracker.db.transaction(
        function (transaction) {
            transaction.executeSql(
                "INSERT OR ROLLBACK INTO item (dbId, path, hasChildren, kind, summaryText, place, work, responsible, responsibleClass) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
                [project.projectId, project.path, project.hasChildren, project.kind, project.title, project.place, project.work, project.responsible, project.responsibleClass],
    
                function (transaction, resultSet) {
                    Mojo.Log.info("DB: inserted new project item", resultSet.insertId, project.title);
    
                    transaction.executeSql(
                        "INSERT OR ROLLBACK INTO project (projectId, accountId, title, backendKind, backendStatus, backendLastChanged, lastSuccessfulDown) \
                                VALUES (?, ?, ?, ?, ?, ?, ?)",
                        [project.projectId, project.accountId, project.title, project.backendKind, project.backendStatus, project.backendLastChanged, project.lastSuccessfulDown],
    
                        function (transaction, resultSet) {
                            Warn.logInfo("created new project", "projectId=" + resultSet.insertId, project.title);
                            if (onSuccess)
                                onSuccess();
                        },
    
                        function (transaction, sqlError) {
                            Warn.bannerError("create", $L("Quit and reset your phone."), "project row insertion failed: ", sqlError.message, sqlError.code, project);
                            return true;   // abort whole transaction
                        }
                    );
                },
    
                function (transaction, sqlError) {   // failure of insert project item
                    if (sqlError.code === 1 && sqlError.message === "constraint failed" && Mojo.appInfo.id !== "com.outlinetracker.outlinetracker") {
                        upgradeAlert(true);
                    } else {
                        Warn.bannerError("create", $L("Quit and reset your phone."), "project item insertion failed: ", sqlError.message, sqlError.code);
                    }
                    return true;   // abort whole transaction
                }
            );                   
         },   // end transaction function
    
        function (sqlError) {   // seems to only be called for exceptions in callbacks
            Warn.logError($L("Quit and reset your phone."), "transaction 'insert project' failed", sqlError.message, sqlError.code);
        }
    );   // end transaction call
    

    }

    【讨论】:

    • 是的,确实看起来这是唯一的工作方式。我想不出别的。我真的不喜欢太多级别的缩进,但我必须习惯:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2013-04-25
    • 2021-12-14
    • 2020-11-17
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多