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

时间:2016-09-19 00:28:17

标签: cordova ionic-framework cordova-plugins ngcordova

我一般都使用Cordova和Mobile开发,但我的代码中有一个非常奇怪的行为。我正在使用带有ngCordova的SQLite插件(我使用Ionic),我想做的事情非常简单:如果存在表格,则删除它或创建它是否存在。< / p>

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

逻辑是:

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控制台进行调试,代码的顺序与执行顺序不同:

Error

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

1 个答案:

答案 0 :(得分:0)

我想你的项目嵌入了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