Работа с плагином Cordova Sqlite в ionic 2

#database #sqlite #cordova #cordova-plugins #ionic2

#База данных #sqlite #кордова #cordova-плагины #ionic2

Вопрос:

Я новичок в разработке ionic 2 (также не работал с ionic-1).

Я пытаюсь использовать плагин cordova sqlite в приложении. Я перешел по ссылке Использовать SQLite в Ionic 2. Удалось добавить плагин в проект, используя следующую команду.

$ ionic plugin добавить cordova-sqlite-хранилище

После развертывания приложения на реальном устройстве data.db был создан и открыт, а также 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/Library/LocalDatabase 2016-10-17 16:29:16.436138 SqlProject[ 238:4034] -[SQLitePlugin openNow:] [Строка 137] открыть полный путь к базе данных: /var/mobile/Containers/Data/Application/DFDADD59-D48E-4D4C-B8F0-23EEDE169471/Library/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] ОТКРЫТЬ базу данных: data.db — ОК 2016-10-17 16:29:16.463667 SqlProject[238:3982] СОЗДАННАЯ ТАБЛИЦА: [объект Object]

Код для открытия базы данных:

импорт { SQLite} из ‘ionic-native’;

  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. Вы абсолютно уверены, что этот плагин поддерживает promises? Если я правильно помню, вы должны использовать успешный обратный вызов, который возвращает набор результатов. Не могли бы вы показать, пожалуйста, покажите более релевантный код (например, что это за.database и как он открывается и обрабатывается)

2. @Fylax Я добавил соответствующий для открытия базы данных.

Ответ №1:

Первый фрагмент, пятая строка: у вас есть let database = new SQLite(); ; вы создаете базу данных на диске (если она еще не существует), а затем выходите из конструктора.

Из-за области видимости let при выходе из costructor database переменная не существует, для методов add and fetch она никогда не существовала.

Вместо 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);
        });
   });
}