SQLite数据库插入查询不适用于离子应用程序

时间:2016-03-31 11:34:45

标签: sqlite cordova ionic-framework

我正在尝试在我的离子项目中添加cordova SQLite数据库,该项目正在扫描qrcode&将详细信息插入本地数据库

我的数据库初始化是这样的:

var db = null;
var app = angular.module('scanstarter', ['ionic', 'ionic-material', 'ngCordova']);

app.run(function ($ionicPlatform, $ionicLoading, $cordovaGeolocation, $cordovaSQLite) {
$ionicPlatform.ready(function () {

    document.addEventListener("deviceready", function () {
        // Sqlite database initialization
        db = $cordovaSQLite.openDB({name: 'scanstarter.db'});
        // create table for product scan
        $cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS productScan (id integer primary key, unique_id text, productName text, serialNo text, manufacturer text, department text, time text, latitude text, longitude text, actionRequired text, sync text)");
        // create table for comments
        $cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS comments (id integer primary key, unique_id text, comment text)");
    }, false);
});

})

我的扫描功能流程如下:

    $scope.goToScan = function () {
    cordova.plugins.barcodeScanner.scan(
            function (result) {
                if (!result.cancelled)
                {
                    if (result.format == "QR_CODE")
                    {
                        var scannedData = result.text;

                        var posOptions = {enableHighAccuracy: true};
                        $cordovaGeolocation.getCurrentPosition(posOptions).then(function (position) {
                            //Get latitude and longitude
                            var latitude = position.coords.latitude;
                            var longitude = position.coords.longitude;
                            //Initial Split with #
                            var splitArray = scannedData.split("#");
                            var UniqueId = splitArray[0];
                            var ProductName = splitArray[1];
                            var SerialNo = splitArray[2];
                            var Manufacturer = splitArray[3];
                            var Department = splitArray[4];
                            //Individual Split with :
                            var UniqueIdArray = UniqueId.split(':');
                            var ProductNameArray = ProductName.split(':');
                            var SerialNoArray = SerialNo.split(':');
                            var ManufacturerArray = Manufacturer.split(':');
                            var DepartmentArray = Department.split(':');

                            if ((UniqueIdArray[0] == 'unique_id') && (ProductNameArray[0] == 'product_name') && (SerialNoArray[0] == 'serial_no') && (ManufacturerArray[0] == 'manufacturer') && (DepartmentArray[0] == 'department')) {
//Insert query part start
                                var query = "INSERT INTO productScan (unique_id, productName, serialNo, manufacturer, department, time, latitude, longitude, actionRequired, sync) VALUES (?,?,?,?,?,?,?,?,?,?)";
                                $cordovaSQLite.execute(db, query, [UniqueIdArray[1], ProductNameArray[1], SerialNoArray[1], ManufacturerArray[1], DepartmentArray[1], Math.floor(Date.now() / 1000), latitude, longitude, 'N', 'N']).then(function (res) {
                                    alert(JSON.stringify(res));

                                }, function (err) {
                                    alert(JSON.stringify(err));
                                });
//Insert query part end
                                $state.go('app.scan');

                            } else {
                                alert('Invalid QR-Code. This QR-Code is not part of Inventory!.');
                            }

                        }, function (err) {
                            $ionicLoading.show({template: 'Kindly check your mobile GPS. GPS must be on!.'});
                            $timeout(function () { // server replies when username or password is incorrect
                                $ionicLoading.hide();
                            }, 3000)
                        });

                    }
                }
            },
            function (error) {
                alert("Scanning failed: " + error);
            }
    );
}

当我评论cordovaSQLite的插入查询部分并构建应用程序并检查它然后它成功扫描然后导航到下一页时会发生什么。但是,当我取消注释并构建apk并在我的手机上运行它时,它不会导航我到下一页。我看到流程工作在每个执行模式后添加后续警报,然后我发现我陷入了sqlite插入查询代码开始的位置。

这里发生的错误我真的没有得到。有什么我想念的吗?

提前感谢您的快速回复。

更新

基本的例子在这里 控制器代码是这个

    $scope.insert = function (firstname, lastname) {
    alert('HI'+firstname+' '+lastname);
    var query = "INSERT INTO people (firstname, lastname) VALUES (?,?)";
    $cordovaSQLite.execute(db, query, [firstname, lastname]).then(function (res) {
        alert('HI2');
        alert("INSERT ID -> " + res.insertId);
    }, function (err) {
        alert(err);
    });
}

$scope.select = function (lastname) {
    alert('HI'+lastname);
    var query = "SELECT firstname, lastname FROM people WHERE lastname = ?";
    $cordovaSQLite.execute(db, query, [lastname]).then(function (res) {
        alert('HI');
        if (res.rows.length > 0) {
            alert("SELECTED -> " + res.rows.item(0).firstname + " " + res.rows.item(0).lastname);
        } else {
            alert("No results found");
        }
    }, function (err) {
        alert(err);
    });
}

查看如下:

    <button class="button button-block button-small button-energized" ng-click="insert('sagar', 'barawade')">INSERT</button>
    <button class="button button-block button-small button-energized" ng-click="select('barawade')">SELECT</button>

初始化与上面给出的相同。

在此代码上,即使我无法获取插入的ID&amp;也没有选择查询作为回应。

2 个答案:

答案 0 :(得分:2)

经过长达数周的努力,我终于明白了。

我需要像以下方式一样指定数据库

db = $cordovaSQLite.openDB({name: "biziscan.db", location: 1, iosDatabaseLocation: 'default'});

需要指定数据库的默认位置。这是他们在插件的github文件中,但在ngCordova网站上没有更新。

答案 1 :(得分:1)

创建表时,对于时间列,您已将文本作为数据类型。但插入u时插入一个整数。请检查