Cordova 的 SQLite 插件:代码 运行 向后

SQLite plugin for Cordova: Code running backwards

我是 Cordova 和移动开发的新手,但我的代码中有一个非常奇怪的行为。我正在使用带 ngCordova 的 SQLite 插件(我正在使用 Ionic),我想做的很简单:如果 table 存在,则删除它,如果不存在则创建它。

我已经为数据库操作创建了一个服务(我不知道这是否是最好的方法,但它使这种逻辑与控制器分离)。

逻辑是这样的:

app.js

angular.module('starter', ['ionic', 'ngCordova', 'starter.controllers', 'starter.services'])
.run(function($ionicPlatform, $ionicLoading, $timeout, initialService) {
    $ionicPlatform.ready(function() {
        if (!initialService.hasUsers()) { // If there's no table called Usuarios
            initialService.createDefaultUser(); // Create table and a record
        } else {
            $ionicLoading.show({
                template: 'Restableciendo...'
            });
            initialService.resetDatabase(); // Droping table

            $timeout(function() {
                $ionicLoading.hide();
            }, 3000);
      }
  });
})

services.js

angular.module('starter.services', ['ionic', 'ngCordova']).service('initialService', function($cordovaSQLite, $ionicPopup) {
    return {

        // Check if Usuarios table exists
        hasUsers: function() {
            if (ionic.Platform.isAndroid()) {
                db = $cordovaSQLite.openDB({
                    name: "com.pos.db",
                    iosDatabaseLocation: 'default'
                });
            } else {
                db = $cordovaSQLite.openDB({
                    name: "com.pos.db",
                    location: 2,
                    createFromLocation: 1
                });
            }

            var returnValue;
            db.transaction(
                function(tx) {
                    tx.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name='Usuarios'", [], function(tx, result) {
                        console.log('Existen ' + result.rows.length + ' tablas con el nombre Usuarios');
                        returnValue = (result.rows.length) ? true : false;
                    });
                }
            );
            return returnValue;

        },

        // Creates the Usuarios table and a testing record
        createDefaultUser: function() {
            var returnValue;
            console.log("creando tabla de usuarios");
            if (ionic.Platform.isAndroid()) {
                db = $cordovaSQLite.openDB({
                    name: "com.pos.db",
                    iosDatabaseLocation: 'default'
                });
            } else {
                db = $cordovaSQLite.openDB({
                    name: "com.pos.db",
                    location: 2,
                    createFromLocation: 1
                });
            }

            db.sqlBatch([
                'DROP TABLE IF EXISTS Usuarios',
                'CREATE TABLE Usuarios (idUsuario INTEGER PRIMARY KEY AUTOINCREMENT, usuario TEXT NOT NULL, tipoUsuario NUMERIC NOT NULL DEFAULT 0, password TEXT)',
                "INSERT INTO Usuarios (idUsuario,usuario,tipoUsuario,password) VALUES (1,'mike',0,'123');",
            ], function() {
                returnValue = true;
            }, function(error) {
                returnValue = false;
            });
            return returnValue;
        },

        // Drops the table
        resetDatabase: function() {
            var returnValue = false;
            console.log("Eliminando tabla de usuarios");
            db.transaction(
                function(tx) {
                    tx.executeSql("DROP TABLE IF EXISTS Usuarios", [], function(tx, result) {
                        returnValue = true;
                    });
                }
            );
            return returnValue;
        }
    };
});

我正在用我的手机和 chrome 控制台调试,代码的顺序与执行顺序不一样:

如何确保所有这些操作都按正确的顺序进行?

我想你的项目嵌入了 jquery。

如果您想按需要链接查询的执行,则必须使用 $.deferred()(和 promise())(先阅读它以了解基本知识)。

那我建议你使用JS对象方式

JS Object approach and $.deferred apply to WebSQL (quite similar to SQLite) are shown as an answer to the question in this link.