【问题标题】:Cordova/Ionic pre populated SQLite database issueCordova/Ionic 预填充的 SQLite 数据库问题
【发布时间】:2015-11-24 17:36:09
【问题描述】:

所以我有一个 Ionic 应用程序,我想使用预填充的 SQLite 数据库进行部署(尝试手动填充它,但速度很慢)。所以我决定使用 Cordova-sqlite-storage 插件(https://github.com/litehelpers/Cordova-sqlite-storage)。我有一个转储文件,女巫打开得很好,没有错误,但是当我尝试获取任何东西时,我没有得到任何结果。无论如何,这是我的代码:

在 app.js 中:

app.run(function($ionicPlatform) {
    $ionicPlatform.ready(function() {
        db = window.sqlitePlugin.openDatabase({name: "mydb", createFromLocation: 1});
    });
})

在 controllers.js 中

.controller("HomeController", function($scope,Test){
    $scope.test = function(){
        Test.getAlchohol().then(function(res){
            console.log(res.length);
        });
    };
})

我的数据库获取服务:

.factory('Test', function($cordovaSQLite){
    var arr = [];
    return{
        getAlchohol:function(){
            var query = "SELECT * FROM Alchohol";
            return $cordovaSQLite.execute(db, query, []).then(function(res){
                arr = res.rows;
                return arr;
            }, function(err){
                console.error(err);
            });
        }
    }
})

我的转储文件是这样的:

PRAGMA synchronous = OFF;
PRAGMA journal_mode = MEMORY;
BEGIN TRANSACTION;
CREATE TABLE "Alchohol" (
  "id" int(11) NOT NULL ,
  "intoxication" int(11) NOT NULL,
  "text_id_1" int(11) NOT NULL,
  "text_id_2" int(11) NOT NULL,
  "text_id_3" int(11) NOT NULL,
  PRIMARY KEY ("id")
);
INSERT INTO "Alchohol" VALUES (1,0,20,21,22);
INSERT INTO "Alchohol" VALUES (2,1,18,19,22);
INSERT INTO "Alchohol" VALUES (3,2,23,24,25);
INSERT INTO "Alchohol" VALUES (4,3,26,24,25);
INSERT INTO "Alchohol" VALUES (5,4,27,28,25);
INSERT INTO "Alchohol" VALUES (6,5,29,30,25);
INSERT INTO "Alchohol" VALUES (7,6,29,31,32);
INSERT INTO "Alchohol" VALUES (8,7,33,31,34);
INSERT INTO "Alchohol" VALUES (9,8,35,31,36);
INSERT INTO "Alchohol" VALUES (10,9,33,31,37);
END TRANSACTION;

我已经尝试了我在网上找到的所有可能的解决方案,但没有一个对我有用。任何帮助将不胜感激..

【问题讨论】:

  • 你是否尝试过打开带有文件后缀的数据库,例如:db = window.sqlitePlugin.openDatabase({name: "mydb.db", createFromLocation: 1});
  • 是的,但这就是我得到的0 399896 log OPEN database: mydb.sqlite 1 399909 log OPEN database: mydb.sqlite failed, aborting any pending transactions 2 399910 log Could not open database
  • 两点:你确定使用转储而不是真正的sqlite db是正确的吗?并且文档中有一个提示:如果您没有从预填充的数据库文件中看到数据,请完全删除您的应用并重试!

标签: angularjs sqlite cordova ionic cordova-plugins


【解决方案1】:

很确定@Joerg 是正确的,您需要使用SQLite DB file 使用 Cordova-sqlite-storage 插件而不是 SQL 转储预填充数据库。

您可以使用this plugin 来导入 SQL 转储。

【讨论】:

    【解决方案2】:

    请在此处查看我的回答:Open prepopulated SQLite dtabase in Cordova (for android) and Visual Studio

    基本上,您使用的插件 (https://github.com/litehelpers/Cordova-sqlite-storage) 不适用于预填充的数据库。

    但是,这个有效:https://www.npmjs.com/package/cordova-plugin-sqlite

    【讨论】:

      【解决方案3】:

      基本上不使用cordova-plugin-sqlite(已弃用)或cordova-sqlite-storage,只需使用cordova-sqlite-ext即可。

      在这里查看我对相同问题的完整答案:https://stackoverflow.com/a/36478499/976948

      【讨论】:

      • 请不要发布指向duplicate answers的链接。相反,请考虑其他可以帮助未来用户找到所需答案的操作,如链接帖子中所述。
      【解决方案4】:

      做一些改变。
      1. 从 app.run() 中删除数据库连接。将该代码放入工厂服务中

          dbConnection :function(){
                      if (window.cordova) {
                      dbconn = $cordovaSQLite.openDB({ name: "my.db" , location: 'default'}); 
                $cordovaSQLite.execute(dbconn, "CREATE TABLE IF NOT EXISTS Contacts(Id INTEGER PRIMARY KEY NOT NULL, Name TEXT NOT NULL UNIQUE, Email TEXT NOT NULL UNIQUE, Phone INTEGER NOT NULL UNIQUE,Website   TEXT,Address TEXT,Notes TEXT,Softdelete INTEGER default 0)");
                  }
                 else{
                 dbconn = window.openDatabase("my.db", '1', 'my', 1024 * 1024 * 100);
                  $cordovaSQLite.execute(dbconn, "CREATE TABLE IF NOT EXISTS Contacts(Id INTEGER PRIMARY KEY NOT NULL, Name TEXT NOT NULL UNIQUE,Email TEXT NOT NULL UNIQUE, Phone INTEGER NOT NULL UNIQUE,Website TEXT,Address TEXT,Notes TEXT,Softdelete INTEGER default 0)");
                                          }
                 return dbconn;
              }
      
      1. 在设备就绪时调用您的 getAlchohol() 函数。

        document.addEventListener("deviceready", onDeviceReady, false);
        function onDeviceReady() {
            Test.getAlchohol().then(function(res){
                    console.log(res.length);
                });
        }
        

      【讨论】:

        猜你喜欢
        • 2016-10-24
        • 1970-01-01
        • 2022-07-07
        • 2020-03-19
        • 1970-01-01
        • 2016-10-26
        • 2018-02-01
        • 2017-07-15
        • 2012-10-19
        相关资源
        最近更新 更多