【问题标题】:Ionic + sqlite: Cannot access sqlite tables on ios (cordova SQLite)Ionic + sqlite:无法访问 ios 上的 sqlite 表(cordova SQLite)
【发布时间】:2016-08-10 20:15:32
【问题描述】:

我正在使用 Ionic 创建我的混合应用程序。

我使用 sqlite 作为数据库。在 Android 上,我可以毫无问题地访问所有存储的数据,但在 iOS 上它会失败。我在 xcode 调试控制台中检索到以下错误(我正在使用 iPhone 6s Plus 进行测试):

[debug] OPEN database: rcsappmobile.db
[debug] Initializing SQLitePlugin
[debug] Detected docs path: /var/mobile/Containers/Data/Application/<UUID>/Documents
[debug] Detected Library path: /var/mobile/Containers/Data/Application/<UUID>/Library
[debug] no cloud sync at path: /var/mobile/Containers/Data/Application/<UUID>/Library/LocalDatabase
[debug] open full db path: /var/mobile/Containers/Data/Application/<UUID>/Library/LocalDatabase/rcsappmobile.db
[debug] Good news: SQLite is thread safe!
[debug] DB opened: rcsappmobile.db

[debug] SELECT av.id, av.name FROM app_venues av WHERE av.active ORDER BY av.venuename ASC
[debug] result: 
[debug] {"$$state":{"status":0}}
[debug] MultipleResultHandler
[debug] Default Error Handler -> Error processing SQL:  undefined: undefined
[debug] Default Error Handler -> Error processing SQL:  5: a statement error callback did not return false: no such table: app_venues

到目前为止我的问题。

编辑: 似乎我用来将数据库复制到其目标的插件删除了所有预填充的内容!我通过xcode检查了数据库,它是空的!

这是我的代码:

controllers.js:

var dashboardCtrl = function ($scope, $ionicPlatform, $cordovaDevice, DbAccess) {
  console.log('dashboardCtrl');
  $ionicPlatform.ready(function () {
    console.log('dashboard -> platform ready');
      DbAccess.openDb();
  });
};
dashboardCtrl.$inject = ['$scope', '$ionicPlatform', '$cordovaDevice', 'DbAccess'];


var venuesCtrl = function ($scope, $ionicPlatform, $cordovaDevice, VenuesQueries) {
  console.log('venuesCtrl');
  $ionicPlatform.ready(function () {
    console.log('venue -> platform ready');
      VenuesQueries.getVenues().then(function(result) {
        $scope.outputs = result;
        var len = Object.keys(result).length;
        if(len > 0) {
          $scope.outputs = result;
        } else {
          console.log('No records found in database.');
        }
      }, function(error) {
        console.error(error);
      });
  });
};
venuesCtrl.$inject = ['$scope', '$ionicPlatform', '$cordovaDevice', 'VenuesQueries'];

service.js

var DbAccess = function ($q, $cordovaSQLite, $ionicPlatform, $cordovaDevice, $log) {
  var DbAccess = {};
  var db = {};
  var dbName = 'rcsappmobile.db';
  $ionicPlatform.ready(function () {
    console.log('Service: DbAccess -> platform ready');

      var platform = $cordovaDevice.getPlatform();
      // default: Library/LocalDatabase subdirectory - NOT visible to iTunes and NOT backed up by iCloud
      // Library: Library subdirectory - backed up by iCloud, NOT visible to iTunes
      // Documents: Documents subdirectory - visible to iTunes and backed up by iCloud
      var dbLocation = 'default';
      if (platform === 'Android') {
        dbLocation = 'default';
      }
      console.log('dbLocation: ', dbLocation);

      if (window.sqlitePlugin) {

        DbAccess.openDb = function() {
          console.log('Open database '+dbName);
          // open database
          function dbopen() {
            db = window.sqlitePlugin.openDatabase({
              name: dbName,
              iosDatabaseLocation: dbLocation
            });
          }
          dbopen();
        };

        DbAccess.DefaultErrorHandler = function (err) {
          $log.log("Default Error Handler -> Error processing SQL: ", err.code + ": " + err.message);
        };

        DbAccess.promisedQuery = function (query, successCB, errorCB) {
          var deferred = $q.defer();
          db.transaction(function (tx) {
            tx.executeSql(query, [], successCB(deferred), errorCB);
          }, errorCB);
          return deferred.promise;
        };

        DbAccess.SingleResultHandler = function (deferred) {
          return function (tx, results) {
            var len = results.rows.length;
            var output_results = [];
            for (var i = 0; i < len; i++) {
              output_results.push(results.rows.item(i));
            }
            deferred.resolve(output_results[0]);
          };
        };

        DbAccess.MultipleResultHandler = function (deferred) {
          console.log('MultipleResultHandler');
          return function (tx, results) {
            var len = results.rows.length;
            var output_results = [];
            for (var i = 0; i < len; i++) {
              output_results.push(results.rows.item(i));
            }
            deferred.resolve(output_results);
          };
        };

      }    
  });
  return DbAccess;
};
DbAccess.$inject = ['$q', '$cordovaSQLite', '$ionicPlatform', '$cordovaDevice', '$log'];

var VenuesQueries = function (DbAccess) {
  var VenuesQueries = {
    getVenues: getVenues
  };

  function getVenues(orderBy) {
    if(!orderBy) {
      orderBy = 'expires';
    }
    var query = "SELECT av.id, av.name FROM app_venues av WHERE av.active ORDER BY av.venuename ASC";
    return DbAccess.promisedQuery(query, DbAccess.MultipleResultHandler, DbAccess.DefaultErrorHandler);
  }

  return VenuesQueries;
};
VenuesQueries.$inject = ['DbAccess'];

【问题讨论】:

    标签: ios sqlite cordova ionic-framework


    【解决方案1】:

    我解决了。

    问题是:我使用了 2 条不同的路径。 整个解决方案发布在 Github 的插件页面:cordova-plugin-dbcopy

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 2017-12-18
      • 2016-10-24
      • 2015-11-24
      • 2016-11-27
      • 2016-08-15
      • 2021-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多