Ошибка при чтении из предварительно заполненной базы данных SQLite в проекте Ionic - PullRequest
0 голосов
/ 04 сентября 2018

Я получаю сообщение об ошибке при попытке чтения из предварительно заполненной базы данных SQLite: sqlite3_prepare_v2 failure: no such table 'plant'

Из того, что я понимаю, SQLite ищет файл mydb.db в папке / www по умолчанию, а затем создает пустую базу данных, когда не находит предварительно заполненный файл mydb.db. Вот почему он не может найти таблицу «завод», потому что вновь созданная пустая база данных, очевидно, не содержит таблицу «завод». Однако я могу подтвердить, что база данных - это в папке / www и что она содержит таблицу 'plant', когда я запускаю sqlite3 mydb.db затем .tables в терминале.

Я не могу понять, почему он не читает из предварительно заполненного файла mydb.db.

Структура папок (из корня):

/src
-/app
--/app.component.ts
/www
-/mydb.db

app.component.ts

  constructor(public platform: Platform, private sqlite: SQLite ) {
    platform.ready().then(() => {
      this.getData();
    });
  }

  getData() {
    this.sqlite.create({
      name: 'mydb.db',
      location: 'default'
    }).then((db: SQLiteObject) => {
      db.executeSql('SELECT * FROM plant ORDER BY id ASC', [])
      .then(res => {
        // Do Stuff
      }).catch(e => console.log("FAIL executeSql:", e));
    })
  }

Я предпринял множество исправлений, обнаруженных в StackOverflow, таких как стирание приложения с моего устройства, запуск нового ионного проекта, копирование файлов приложения и конфигурации и установка прямого пути в расположении базы данных, но это все еще пытается прочитать из пустой базы данных, которую он создает.

1 Ответ

0 голосов
/ 11 сентября 2018

Плагин Cordova-sqlite-storage не обрабатывает предварительно заполненные базы данных (на момент написания статьи). Я считаю, что вам нужен плагин Cordova-sqlite-ext .

Из README.md в репо (выделено мое):

Новый выпуск в сентябре 2018 года будет включать следующие основные улучшения (litehelpers / Cordova-sqlite-storage # 773):

  • Поддержка платформы браузера с использованием kripken / sql.js (Litehelpers / Кордова-SQLite-хранение # 576)

  • версии плагинов cordova-sqlite-storage и cordova-sqlite-ext будут вместе, больше не требуется отдельная версия плагина для предварительного заполнения базы данных ( litehelpers / Cordova-sqlite-storage # 529 )

  • включает в себя наборы из DefiniteTyped (Litehelpers / Кордова-SQLite-хранение # 768)

NB. « будет » включает в себя оперативное сообщение.

Есть похожий вопрос на ионном форуме . Последнее сообщение в теме начинается:

Cordova SQLite Storage не использует папку www вашего приложения для хранения данные.

Мобильные устройства не допускают изменения данных исполняемых файлов приложения. Это сделано для предотвращения установки приложения, которое перезаписывает код в другом приложение (представьте, что устанавливаете WhatsApp, и оно повреждает все другие сообщения приложения, чтобы вы не могли их использовать). Это также делает невозможным для кода быть введен в приложение и принять ОС, если безопасность вашего приложения не велик.

Пост продолжается с предложенным обходным путем.

Другая ветка на ионном форуме, кажется, указывает на то, что вы можете использовать cordova-sqlite-ext в своем приложении. Вы можете найти на этом форуме cordova-sqlite-ext, есть несколько плакатов, на которых он работает. На этом форуме также есть много результатов для cordova-sqlite-ext, которые помогут вам в правильном направлении.

И, честно говоря, я не думаю, что это фактически создание пустой базы данных. Если "/www/mydb.db" не является пустой базой данных после запуска приложения (что меня удивит). Хотя это правда, что sqlite создаст базу данных с именем в командной строке, если она не существует, я подозреваю, что в этом случае это просто поведение, когда он не может получить доступ к указанной базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...