2016-09-19 2 views
1

Я новичок в разработке Кордовы и мобильных устройств в целом, но у меня очень странное поведение в моем коде. Я использую плагин SQLite с ngCordova (я использую Ionic), и то, что я хочу сделать, очень просто: если таблица существует, то отбросьте ее или создайте, если она не существует.Плагин SQLite для Кордовы: код работает в обратном направлении

Я создал службу для операций с базой данных (я не знаю, если это лучший способ сделать это, но он держит такую ​​логику отдельно от контроллеров).

Логика такова:

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; 
     } 
    }; 
}); 

Я отладки с моим мобильным телефоном и хромированной консолью и порядок кода не совпадает с порядком исполнения:

Error

Как я могу убедиться, что все эти операции выполняются в правильном порядке?

+0

Посмотрите на ответ, который я предоставил для этого вопроса: http://stackoverflow.com/questions/39526355/unable-to-create-sqlite-tables-using-javascript-in-for-loop/39528291#39528291 – nyluje

+0

I подумайте, что ваша проблема схожа, вам нужно использовать '$ .deferred()', чтобы поймать, когда событие закончено. – nyluje

+0

Я видел это в обертке [ngCordova] (https://github.com/driftyco/ng-cordova/blob/master/src/plugins/sqlite.js), они используют '$ .defer', но я не нашел чего-то подобного внутри кода плагина cordova. Они должны сделать это как-то ... – MikeVelazco

ответ

0

Я предполагаю, что ваш проект встраивается в jquery.

Вы должны использовать $ .deferred() (и prom()), если хотите связать выполнение запросов по своему желанию (сначала прочитайте об этом, чтобы понять основные).

Затем я предлагаю вам использовать подход JS-объекта.

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

+0

Только в качестве комментария для любого, кто ищет решение с угловым разрешением, проверьте [$ q Docs] (https://docs.angularjs.org/api/ng/service/$q) – MikeVelazco

Смежные вопросы