使用 Antair Cordova SQLitePlugin 预填充 Ionic 数据库 [帮助请求]

2023-12-10

____ INTRO

大家好,首先澄清三点:

  1. 我的英语不好,所以请提前原谅我的错误,
  2. 我是新手,如有不准确之处请见谅
  3. 我之前已经搜索并尝试过在互联网上找到的解决方案,但仍然无法解决嵌入预填充数据库的问题。

____ THE GOAL

我想开发一个适用于 iOS 和 Android 的应用程序预填充数据库.

举例来说,数据库包括15.000 条记录每个由三个键值对组成(id, and lastname).

___ 我做了什么

Steps:

ionic start myapp blank
cd myapp
ionic platform add ios
ionic platform add android

然后我创建了一个用于测试目的的 sqlite 数据库,名为mydb.sqlite,由一张桌子组成people含有两个id, , lastname记录。

我决定使用以下插件:https://github.com/Antair/Cordova-SQLitePlugin那是因为它可以用cordova工具安装。

ionic plugin add https://github.com/Antair/Cordova-SQLitePlugin

(警报:我认为网站上的说明显示了错误的参考 - “cordova 插件添加https://github.com/brodysoft/Cordova-SQLitePlugin"- 指的是另一个插件)。

然后,按照插件网站上的说明,我将数据库复制到myapp/www/db/以便现在可以在以下位置找到它:myapp/www/db/mydb.sqlite

我修改了索引.html包括默认之后的 SQLite 插件app.js script:

<!-- your app's js -->
<script src="js/app.js"></script>
<script src="SQLitePlugin.js"></script>

我还写了一些代码行索引.html文件以显示按钮:

<ion-content ng-controller="MyCtrl">
    <button class="button" ng-click="all()">All</button>
</ion-content>

最后我修改了./js/app.js:

// Ionic Starter App

var db = null;

angular.module('starter', ['ionic' /* What goes here? */ ])

.run(function($ionicPlatform) {
  $ionicPlatform.ready(function() {
    // some predefined code has been omitted

    window.sqlitePlugin.importPrepopulatedDatabase({file: "mydb.sqlite", "importIfExists": true});
    db = window.sqlitePlugin.openDatabase({name: "mydb.sqlite"});

  }); // $ionicPlatform.ready
}) // .run

.controller('MyCtrl', function($scope){

    $scope.all = function(){
            var query = "SELECT * FROM people";
            // I don't know how to proceed

    }; // $scope.all

}); // .controller

___ 问题

我不知道如何在控制器部分继续查询所有记录(只是查询的示例)并在 console.log 中显示结果。

我认为以下代码必须以某种方式完成:

angular.module('starter', ['ionic' /* What goes here? */ ]) 

控制器部分内的代码也必须完成:

       $scope.all = function(){
                var query = "SELECT * FROM people";
                // I don't know how to proceed

        }; // $scope.all

___ 最后的致谢

预先感谢您给予我的帮助。


所以这个人的代码对封装我的 DAL 有很大帮助。我强烈建议您逐字使用他的代码。

https://gist.github.com/jgoux/10738978

你会看到他有以下方法:

self.query = function(query, bindings) {
    bindings = typeof bindings !== 'undefined' ? bindings : [];
    var deferred = $q.defer();

    self.db.transaction(function(transaction) {
        transaction.executeSql(query, bindings, function(transaction, result) {
            deferred.resolve(result);
        }, function(transaction, error) {
            deferred.reject(error);
        });
    });

    return deferred.promise;
};

让我们分解一下。查询函数采用查询字符串(查询参数)和 ? 的可能绑定列表。在类似“SELECT * FROM A_TABLE WHERE ID = ?”的查询中。因为他的代码是一个服务,所以 self 值指向服务本身以供将来的所有调用。该函数将对数据库执行一个事务,但它返回一个只有在数据库返回后才会履行的承诺。

他的服务提供了第二个辅助函数:fetchAll。

self.fetchAll = function(result) {
    var output = [];

    for (var i = 0; i < result.rows.length; i++) {
        output.push(result.rows.item(i));
    }

    return output;
};

fetchAll 会将整个行读取到一个数组中。 fetchAll 的结果参数是在查询函数的承诺履行中传递的结果变量。

如果您将他的代码复制并粘贴到您的服务文件中,您现在就拥有了一个真正的数据库服务。您可以将该服务包装在 DAL 中。这是我的项目中的一个示例。

.service('LocationService', function ($q, DB, Util) {
    'use strict';
    var self = this;
    self.locations = [];
    self.loadLocked = false;
    self.pending = [];

    self.findLocations = function () {
        var d = $q.defer();
        if (self.locations.length > 0) {
            d.resolve(self.locations);
        }
        else if (self.locations.length === 0 && !self.loadLocked) {
            self.loadLocked = true;
            DB.query("SELECT * FROM locations WHERE kind = 'active'")
                   .then(function (resultSet) {
                       var locations = DB.fetchAll(resultSet);
                       self.locations.
                           push.apply(self.locations, locations);
                       self.loadLocked = false;
                       d.resolve(self.locations);
                       self.pending.forEach(function (d) {
                           d.resolve(self.locations);
                       });
                   }, Util.handleError);
            } else {
                self.pending.push(d);
            }

            return d.promise;
        };
})

这个例子有点吵,因为它有一些“线程”代码来确保如果同一个承诺被触发两次,它只针对数据库运行一次。一般要点是表明 DB.query 返回一个承诺。查询方法后面的“then”使用DB服务来获取所有数据并将其添加到我的本地内存空间中。所有这些都是由 self.findLocations 返回变量 d.promise 来协调的。

你的也有类似的代表。控制器可以将您的 DAL 服务(例如我的 LocationService)通过 AngularJS 注入其中。如果您使用 AngularJS UI,则可以让它解析数据并将其传递到列表中。

最后,我对这个人的代码的唯一问题是数据库应该来自这个代码。

var dbMaker = ($window.sqlitePlugin || $window);

原因是该插件无法在 Apache Ripple 中运行。由于该插件可以很好地镜像浏览器的 Web SQL 界面,因此这个简单的小更改将使 Ripple 能够运行您的 Ionic 应用程序,同时仍然允许您在真实设备中使用 SQLite。

我希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Antair Cordova SQLitePlugin 预填充 Ionic 数据库 [帮助请求] 的相关文章

随机推荐

  • JSDoc 中对象中任意键的值的文档结构

    我有一个函数factory function factory events for const key in events const before after events key 论点在哪里events通常是 only before a
  • 从 Java 将多个 PDF 作为单个打印作业打印(物理打印)

    我想在一个打印作业中从java 使用java打印服务 打印多个pdf 我想将多个 pdf 文件作为单个作业发送到打印机 这样 我的 批量 中的所有文档都会一起打印 并且当我从打印机中取出它们时 不会与其他人的打印作业交错 一个批次可能包含数
  • 如何使用 JavaFX TableView 显示基于列的数据集

    我正在尝试从 Swing 切换到 JavaFX 但 TableView 出现问题 我在内存中有一个基于列的通用数据结构 例如List
  • Apple 在 AppStore 中接受的最低 iOS 目标版本?

    我有一个应用程序 我希望在所有 iOS 版本上运行 但我认为 Apple 只接受某个版本及更高版本的应用程序 我认为是 3 0 但不确定 所以我的问题是 您可以发送审核 并获得接受 的最低 iOS 目标版本是多少 如果任何具有丰富 iOS
  • codeigniter 无法在实时页面上工作,在服务器上找不到错误

    我的 codeigniter 在本地主机上完美工作 但在 live 上无法工作 我的 codeigniter 是最新版本 我也尝试较旧的版本 它总是显示在重定向上找不到的页面 routes php 设置是 route default con
  • C++:构造和初始化顺序保证

    我对 C 中的构造和初始化顺序保证有一些疑问 例如 下面的代码有四个类X Y Z and W main函数实例化一个对象class X 其中包含一个对象class Y 并且源自class Z 因此两个构造函数都会被调用 此外 const c
  • 如何优化这些循环(禁用编译器优化)?

    我需要优化一些for在不使用编译器优化标志的情况下循环提高速度 用于学校作业 给定一个特定的Linux服务器 学校拥有的 一个令人满意的改进是使其运行时间低于7秒 一个很大的改进是使其运行时间低于5秒 我这里的这段代码大约需要 5 6 秒
  • 约束命名的目的是什么

    命名约束 唯一 主键 外键 的目的是什么 假设我有一个使用自然键作为主键的表 CREATE TABLE Order LoginName VARCHAR 50 NOT NULL ProductName VARCHAR 50 NOT NULL
  • Java,如何跟踪调用的函数

    我想跟踪Java中调用的函数的开头 结尾 如以下代码 public void foo System out println begin of foo System out println e n d of foo 但维护转储代码System
  • 自动部署在 appBase 子文件夹中找到的 WAR 文件

    我有一个第三方 Web 应用程序 我想通过安装程序将其部署到 Tomcat 5 0 服务器 AutoDeploy 设置为 true 然而 该应用程序由多个 WAR 文件组成 如果我将 WAR 直接放在 webapps 下 它们就会发挥作用
  • 无法实例化应用程序 com.android.tools.fd.runtime.BootstrapApplication ?Android

    我将 Android Studio 更新到版本 2 0 但我遇到了一个问题 不知道为什么 重要错误信息 无法实例化应用程序 com android tools fd runtime BootstrapApplication java lan
  • 当鼠标悬停在图像上时显示放大的图片

    在我的网页上 我想放置一个图像 当鼠标指针悬停在该图像上时 会出现放大版本 根据评论中需求的进一步解释更新了 CSS 解决方案 http jsfiddle net 5sRTX 7 div class effectback img class
  • Python Pandas - 使用另一个数据框列的值更新数据框列

    我正在努力提高 Python 水平 并决定对我的兴趣之一进行一些分析 摔角 在这种情况下 日本摔跤 基本上我正在尝试从另一个数据帧更新一个数据帧中的值 这是我的第一个数据框的样子 Wrestler Matches DMR 0 TETSUYA
  • CORS 策略已阻止从来源“null”访问图像

    我在 OpenLayers 3 中有 JavaScript 应用程序 我的基础层是从本地图块创建的 我只在我的计算机上工作 所以我不知道为什么会出现 CORS 错误 var newLayer new ol layer Tile source
  • 关闭模态 JInternalFrame

    我遵循了方法2本指南 所以现在我有一个 ModalInternalFrame 可以阻止所有其他框架的输入 正如我想要的那样 但是 我对示例进行了一项更改 现在遇到了两个问题 改变 我删除了 JOptionPane 因为重点是显示我自己的窗格
  • 通过按住链接禁用打开新窗口或新选项卡

    我要感谢那些正在阅读本文的人以及您抽出宝贵的时间 咱们直接进入主题吧 我目前正在尝试禁用一项功能 在该功能中 用户不应通过按住链接来打开指向新窗口或选项卡的链接 感谢任何解决此问题的建议或答案 再次感谢 您可以将事件处理程序绑定到所需的链接
  • 强制 GCC 使用单词访问结构

    在 ARM 处理器 HT32F1655 上 寄存器的特定部分需要字访问 来自用户手册 请注意 AHB 总线中的所有外设寄存器仅支持字访问 但海湾合作委员会正在产生一些ldrb 加载字节 和strb 存储字节 打包结构上的指令 这些结构看起来
  • AWS 存储桶策略 - 权限被拒绝

    我正在尝试让另一个 AWS 账户的用户访问该存储桶itv twitterstg archive我添加了以下存储桶策略 他们说他们收到了许可被拒绝的消息 任何人都可以看到此政策的任何问题或推荐我可以尝试的其他内容吗 ps 我已经更改了本示例中
  • 如果用户未登录 Angular2 2.0.0-rc.4,则重定向到登录路由

    这是我的 html 文件 div class container h1 Dohatec Data h1 div class navLinks a Home a nbsp a About Us a nbsp a Pricing a div d
  • 使用 Antair Cordova SQLitePlugin 预填充 Ionic 数据库 [帮助请求]

    INTRO 大家好 首先澄清三点 我的英语不好 所以请提前原谅我的错误 我是新手 如有不准确之处请见谅 我之前已经搜索并尝试过在互联网上找到的解决方案 但仍然无法解决嵌入预填充数据库的问题 THE GOAL 我想开发一个适用于 iOS 和