¿Cómo organizar el código SQL de WebOS que depende de resultados anteriores?

Quiero hacer una aplicación WebOS Mojo simple que agregue fechas a una base de datos, pero antes de eso, necesita verificar algunas condiciones interrogando la base de datos. Dado el modo asincrónico de acceder a la base de datos en WebOS, me pregunto cuál es la forma más eficiente y corta de escribir dicho código.

Por ejemplo, necesito asegurarme de que la nueva fecha no esté ya en la base de datos. Luego, necesito obtener la fecha más cercana para poder calcular la diferencia en días y arrojar un error si la diferencia es demasiado pequeña. Luego necesito insertar la nueva fecha y luego calcular un promedio.

Esto sería fácil de hacer de una manera síncrona para acceder a la base de datos, pero realmente no me gusta la idea de escribir partes del código en múltiples controladores de éxito de las diferentes declaraciones SQL ejecutadas. ¿Existe una solución más elegante?

preguntado el 16 de mayo de 11 a las 20:05

1 Respuestas

Puede utilizar devoluciones de llamada en línea a las funciones de la base de datos relacional 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

}

Respondido el 28 de junio de 11 a las 01:06

Sí, de hecho parece que esta es la única forma de trabajar. No pude pensar en otra cosa. Realmente no me gustan demasiados niveles de sangría, pero tendré que acostumbrarme :) - rslite

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.