Хобрук: Ваш путь к мастерству в программировании

Ionic Local Storage - сохранить базу данных $http на устройство

У меня проблемы с локальным хранилищем и моим приложением Ionic. Дело довольно простое - я хотел бы сохранить на устройстве все данные из базы данных sql, а затем отобразить их, когда устройство не подключено к сети.

Таким образом, код, из которого я получаю свои данные, выглядит так:

контроллеры.js:

 $http.get('http://someurl.php?type=json')
    .success(function(data) {

        $scope.info = data;

    })

    .error(function(response) {

        $scope.info = "Error";

    });

Так может ли кто-нибудь помочь мне с этим?

Благодарю вас!


Ответы:


1

Я могу предложить вам использовать какой-нибудь плагин для БД, но с локальным хранилищем вы должны передать (и установить) это:

angular-local-storage

а затем используйте его в своем JS, например:

$http.get('http://someurl.php?type=json')
    .success(function(data) {



      //test if is online or offline and the do something
        if($rootScope.isOnLine)
        localStorageService.set("nameofkey", { data:data  }); //here you store in your localstorage ... remeber to inject it as dependency
        $scope.info = data;

    })

    .error(function(response) {

        $scope.info = "Error";

    });

затем, если вы хотите узнать, находится ли ваше ионное приложение в сети или в автономном режиме, вы можете использовать этот плагин: http://ngcordova.com/docs/plugins/network/

"use strict";

// Ionic Starter App
angular.module("myapp", ["ionic",
                            "ionic.service.core",
                            "ngCordova",
                            "ionic.service.push",
                            "ngResource",
                            "LocalStorageModule",
                            "ionic-native-transitions",
                            "angularMoment"])

.run(["$ionicPlatform", "authService", "$rootScope", "$timeout", "$cordovaSpinnerDialog", "$window", "$cordovaNetwork", "$state", "ScanService", "$cordovaToast", "localStorageService", "DB",
function ($ionicPlatform, authService, $rootScope, $timeout, $cordovaSpinnerDialog, $window, $cordovaNetwork, $state, ScanService, $cordovaToast, localStorageService, DB) {
    $ionicPlatform.ready(function () {

        $rootScope.isOnLine = true;

        // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
        // for form inputs)
        if (ionic.Platform.isIPad() &&
            window.cordova &&
            window.cordova.plugins &&
            window.cordova.plugins.Keyboard) {
            cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
            cordova.plugins.Keyboard.disableScroll(true);
        }
        if (window.StatusBar) {
            // org.apache.cordova.statusbar required
            StatusBar.styleDefault();
        }





        // CONNECTION STATE /////////////////////////////////////////////
        if ($cordovaNetwork) {

            //listen for OnLine event
            $rootScope.$on('$cordovaNetwork:online', function (event, networkState) {
                var onlineState = networkState;
                $rootScope.isOnLine = true;


            });


            // listen for Offline event
            $rootScope.$on('$cordovaNetwork:offline', function (event, networkState) {
                var offlineState = networkState;
                $rootScope.isOnLine = false;


            });
        }

        //////////////////////////////////////////////////////////////////




    });
}]);

Это пример службы, использующей ее для вызова http или из локальной сети, если нет соединения:

"use strict";

angular
    .module('gestione')
    .factory("ScanService", ["$q", "$resource", "enviroment", "$rootScope", "localStorageService", "DB",
        function ($q, $resource, enviroment, $rootScope, localStorageService, DB) {
            var self = this;

            // Private Fileds
            var _serviceBase = "api/Scan/";
            var _serviceBaseBarScan = "api/BarScan/";
            var _serviceBaseCount = "api/Scan/Count";
            var _serviceBaseLast = "api/Scan/Last";
            var _serviceBaseAll = "api/Scan/All";

            // Private Method
            var _resource = $resource(enviroment.apiUrl + _serviceBase, { skip: '@skip', take: '@take' }, {
                query: { method: "GET", isArray: true },
                create: { method: "POST", isArray: false }

            });

            var _resourceLast = $resource(enviroment.apiUrl + _serviceBaseLast, {}, {
                query: { method: "GET", isArray: false }

            });

            var _resourceAll = $resource(enviroment.apiUrl + _serviceBaseAll, {}, {
                create: { method: "POST", isArray: true }

            });

            var _resourceCount = $resource(enviroment.apiUrl + _serviceBaseCount, {}, {
                query: { method: "GET", isArray: false }
            });

            var _resourceBar = $resource(enviroment.apiUrl + _serviceBaseBarScan, {}, {
                query: { method: "GET", isArray: true },
                create: { method: "POST", isArray: false }

            });


            return {
                Get: function (skip, take) {
                    var deferred = $q.defer();

                    // IS ONLINE
                    if ($rootScope.isOnLine) {
                        _resource.query({ skip, take }).$promise.then(function (resp) {
                            deferred.resolve(resp);
                        }).catch(function (err) {
                            deferred.reject(err);
                        });
                    } else { // OffLine
                        DB.Query("SELECT * FROM Scan ORDER BY ROWID DESC ;").then(function (result) {
                            var scan = DB.fetchAll(result);
                            deferred.resolve(scan);
                        }, function (err) {
                            deferred.reject(err);
                        });
                    }

                    return deferred.promise;
                },
                GetLast: function () {
                    var deferred = $q.defer();

                    // IS ONLINE
                    if ($rootScope.isOnLine) {
                        _resourceLast.query().$promise.then(function (resp) {
                            deferred.resolve(resp);
                        }).catch(function (err) {
                            deferred.reject(err);
                        });
                    } else { // OffLine
                        DB.Query("SELECT * FROM Scan ORDER BY ROWID DESC LIMIT 1 ;").then(function (result) {
                            var scan = DB.fetch(result);
                            deferred.resolve(scan);
                        }, function (err) {
                            deferred.reject(err);
                        });
                    }

                    return deferred.promise;
                },
                GetNotSync: function () {
                    return DB.Query("SELECT * FROM Scan WHERE sync = ? ", ['false']).then(function (result) {
                        return DB.fetchAll(result);
                    });
                },
                CheckInOrOut: function (item) {
                    return DB.Query("SELECT * FROM Scan WHERE idTicket = ? ORDER BY ROWID DESC LIMIT 1;", [item.IdTicket]).then(function (result) {
                        return DB.fetch(result);
                    });
                },
                Count: function () {
                    var deferred = $q.defer();

                    // IS ONLINE
                    if ($rootScope.isOnLine) {
                        _resourceCount.query().$promise.then(function (resp) {
                            deferred.resolve(resp);
                        }).catch(function (err) {
                            deferred.reject(err);
                        });
                    } else { // OffLine
                        DB.Query("SELECT COUNT(*) FROM Scan;").then(function (result) {
                            var scan = DB.fetch(result);
                            deferred.resolve(scan);
                        }, function (err) {
                            deferred.reject(err);
                        });
                    }

                    return deferred.promise;
                },
                Save: function (scan) {
                    var deferred = $q.defer();

                    //We're OnLine
                    if ($rootScope.isOnLine) {
                        _resource.create(scan).$promise.then(function () {
                            scan.sync = true;
                        }).catch(function () {
                            scan.sync = false;
                        }).finally(function () {
                            DB.Insert(scan).then(function (record) {
                                deferred.resolve(record);
                            }).catch(function () {
                                deferred.reject();
                            });
                        });
                    } else { // OffLine
                        scan.sync = false;

                        DB.Insert(scan).then(function (record) {
                            deferred.resolve(record);
                        }).catch(function () {
                            deferred.reject();
                        });
                    }

                    return deferred.promise;
                },
                Sync: function () {
                    var self = this;
                    var deferred = $q.defer();
                    var allPromise = [];

                    //get all stored scans
                    self.GetNotSync().then(function (scanList) {
                        // send them to the server
                        if (scanList && scanList.length > 0)
                            _resourceAll.create(scanList).$promise.then(function (resp) {
                                //cicle on each record returned from server
                                resp.forEach(function (item) {
                                    if (item) {
                                        //prepare query
                                        var update_query = "UPDATE Scan SET sync= 'true' WHERE idTicket= " + item.idTicket;
                                        //set sync to true on  records
                                        allPromise.push(DB.Update(update_query));
                                    }
                                });
                            }).catch(function (err) {
                                allPromise.push(deferred.reject(err));
                            });

                    }).catch(function (error) { allPromise.push(deferred.reject(error)); });

                    return $q.all(allPromise);
                },
                GetBarScan: function () {
                    return _resourceBar.query();
                },
                SaveBarScan: function (barscan) {
                    var deferred = $q.defer();
                    _resourceBar.create(barscan).$promise.then(function (record) {
                        deferred.resolve(record);
                    }).catch(function () {
                        deferred.reject();
                    });
                    return deferred.promise;
                }
            };
        }
    ]);
26.01.2017
  • Будет ли $http.get обещать успех, если нет доступной сети? 26.01.2017
  • нет, это идет в улов .. я просто поставил если есть в качестве примера .. но я предлагаю вам поместить его в свой сервис, чтобы вы могли позвонить в сервис 26.01.2017
  • Я понимаю. Это отлично. 26.01.2017
  • Новые материалы

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..