pouchdb-adapter-cordova-sqlite работает локально, но не синхронизируется - PullRequest
0 голосов
/ 27 января 2019

У меня проблема с использованием адаптера cordova-sqlite в PouchDB.Он отлично работает локально (я могу создавать, обновлять и удалять документы), но не может синхронизироваться с / на любой удаленный сервер CouchDB.Я попробовал и IBM Cloudant, и мой собственный сервер CouchDB.

Если я вместо этого использую адаптер IDB, он работает как чудо, но когда я перехожу на SQLite, он не может синхронизироваться должным образом.

Вот как я использую его (в моем случае в приложении Vue):

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import PouchDB from 'pouchdb'
...
Object.defineProperty(Vue.prototype, '$pouch', { value: PouchDB }); //this is to be able to use $pouch in any Vue component later on
...
var PouchAdapterCordovaSqlite = require('pouchdb-adapter-cordova-sqlite');
PouchAdapterCordovaSqlite.use_prefix = true; // use the legacy '_pouch' prefix. I tried both with and without this option
PouchDB.plugin(PouchAdapterCordovaSqlite); 
...        
this.db = new this.$pouch('todos', { adapter: 'cordova-sqlite', location: 'default', androidDatabaseImplementation: 2 });

console.log('PouchDB adapter: ' + this.db.adapter); //it returns 'cordova-sqlite'

let remoteCouch='http://myserveraddress.com:5984/todos'; //todos is the remote database, with CORS enabled and set as public so no user/pass is needed

this.$pouch.sync('todos', remoteCouch, {
        live: true,
        retry: true
      }).on('change', function (info) { console.log('change:' + info}).on('paused', function (err) {//...//}).on --- and so on with 'active', 'denied', 'complete' and 'error'

и позже в одном компоненте Vue я использую это (где this.db относится к базе данных и this.todos используется для отображения результатов на экране:

    mounted() {
        this.list();
        this.db
          .changes({
            since: "now",
            live: true
          })
          .on("change", this.list);
      },
      methods: {
      list: function() {
      let self = this;
      this.db.allDocs({ include_docs: true, descending: true }, function(
        err,
        doc
      ) {
        self.todos = doc.rows;
      });
    }
}

Как я уже говорил, он работает с IndexedDB, но не с адаптером SQLite (я использовал и cordova-sqlite-storage, и cordova-plugin-sqlite-2 с теми же результатами). Все начинается после события deviceready и sqlite загружается правильно (я могу использовать window.sqlitePlugin).

И когда дело доходит до Cordova config.xml, я гарантировалопределите это:

<plugin name="cordova-plugin-whitelist"/>
<access origin="*"/>
<allow-intent href="http://*/*"/>
<allow-intent href="https://*/*"/>
...
<plugin name="cordova-plugin-sqlite-2" spec="*"/>

Любая подсказка? Мне действительно нужно использовать SQLite вместо IDB, потому что мое приложение будет хранить большой объем данных, и мне также нужен подход offline-first ,вот почему я использую PouchDB.

AЕще один тест, который я пытался создать вручную, - это создать базу данных SQLite из моего приложения, и это также работает, поэтому кажется, что проблема связана с pouchdb-adapter-cordova-sqlite .

Снимок экрана с IDB: результат с idb

И скриншот с SQLite: результат с sqlite

Заранее спасибо!

1 Ответ

0 голосов
/ 17 апреля 2019

Решено!

Проблема была здесь:

this.$pouch.sync('todos', remoteCouch, {...

Его нужно изменить на:

this.db.sync(remoteCouch, {...

Таким образом, он указывал на объект pouchdb вместоэкземпляр базы данных.Надеюсь, это кому-нибудь поможет.Привет!

...