在离子2

时间:2016-10-17 11:22:35

标签: database sqlite cordova cordova-plugins ionic2

我是离子2开发的新手(也未使用过离子-1)。

我试图在应用程序中使用cordova s​​qlite插件。我关注Use SQLite in Ionic 2链接。能够使用以下命令将插件添加到项目中。

  

$ ionic plugin add cordova-sqlite-storage

在真实设备上部署应用程序后,数据已创建并打开,并且people表已成功创建。 以下是来自Xcode的日志:

  

2016-10-17 16:29:16.435992 SqlProject [238:3982] - [SQLitePlugin pluginInitialize] [第67行]路径上没有云同步:/ var / mobile / Containers / Data / Application / DFDADD59-D48E-4D4C -B8F0-23EEDE169471 /库/ LocalDatabase   2016-10-17 16:29:16.436138 SqlProject [238:4034] - [SQLitePlugin openNow:] [第137行]打开完整数据库路径:/ var / mobile / Containers / Data / Application / DFDADD59-D48E-4D4C-B8F0- 23EEDE169471 /库/ LocalDatabase / data.db   2016-10-17 16:29:16.443765 SqlProject [238:4034] - [SQLitePlugin openNow:] [第163行]好消息:SQLite是线程安全的!   2016-10-17 16:29:16.448487 SqlProject [238:3982] OPEN数据库:data.db - 确定   2016-10-17 16:29:16.463667 SqlProject [238:3982] 创建表: [object Object]

打开数据库代码:

  

从离子本地&#39 ;;

导入{SQLite}
 constructor(platform: Platform) {
   platform.ready().then(() => {
   StatusBar.styleDefault();

   let database = new SQLite();
        database.openDatabase({
            name: "data.db",
            location: "default"
        }).then(() => {
            database.executeSql("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT, firstname TEXT, lastname TEXT)", {}).then((data) => {
                console.log("TABLE CREATED: ", data);

            }, (error) => {
                console.error("Unable to create table", error);

            })
        }, (error) => {

            console.error("Unable to open database", error);
        });
   });
}

但是,现在我在插入获取来自数据库的记录时收到错误。

 public add() {

 console.log("Inside the add function- ");

 this.database.executeSql("INSERT INTO people (firstname, lastname) VALUES (?, ?)", ['mahesh', 'bhalerao']).then((data) => {

   console.log("INSERTED: " + JSON.stringify(data));

 }, (error) => {
   console.log("ERROR: " + JSON);
 });
}

 public fetchRecords() {

    this.database.executeSql("SELECT * FROM people", []).then((data) => {
               alert("executeSql refresh function success");

        this.people = [];

        if(data.rows.length > 0) {
            for(var i = 0; i < data.rows.length; i++) {
                this.people.push({firstname: data.rows.item(i).firstname, lastname: data.rows.item(i).lastname});
            }
        }
    }, (error) => {
        console.log("ERROR: " + JSON.stringify(error.err));
    });
}

我收到了未定义的错误。

  

错误:未定义

不确定出了什么问题。

任何帮助将不胜感激。 谢谢!

1 个答案:

答案 0 :(得分:0)

第一行摘录,第五行:你有let database = new SQLite();;您在磁盘上创建数据库(如果它还不存在),然后退出构造函数。

由于let的作用域,一旦退出结构函数,database变量就不存在,它永远不会存在addfetch方法存在。

而不是let你应该将database放入属性(这是方法正在寻找的位置),然后一切都应该正常工作。

换句话说,你应该有类似的代码:

public database: SQLite //here the attribute

constructor(platform: Platform) {
   platform.ready().then(() => {
   StatusBar.styleDefault();

   this.database = new SQLite(); //here you initialize the attribute instead of a volative variable
   this.database.openDatabase({ //in this block you open an then populate the attribute
            name: "data.db",
            location: "default"
        }).then(() => {
            database.executeSql("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT, firstname TEXT, lastname TEXT)").then((data) => {
                console.log("TABLE CREATED: ", 
            }, (error) => {
                console.error("Unable to create table", error);
            });
        }, (error) => {
            console.error("Unable to open database", error);
        });
   });
}