Предварительная загрузка / предварительное заполнение PouchDB в React Native Application - PullRequest
0 голосов
/ 07 сентября 2018

Можно ли предварительно загрузить / предварительно заполнить базу данных в моем приложении React Native, а затем при первом запуске просто выполнить синхронизацию? У меня уже есть большая часть, если не вся информация о базе данных до распространения приложения, было бы здорово, если бы ему просто нужно было выполнить быструю синхронизацию при запуске приложения. Есть идеи, как мне это сделать?

Я нашел это - https://pouchdb.com/2016/04/28/prebuilt-databases-with-pouchdb.html, но там не упоминается React Native

Использование:

  • pouchdb-find: ^ 7.0.0
  • pouchdb-реакция-native: ^ 6.4.1
  • Реакция: 16.3.1
  • Реактивный момент: ^ 0,7,9
  • Реактивный: ~ 0,55,2

Спасибо за любые указатели.

Обновление Вот код, который я использую, чтобы попытаться загрузить файл дампа. Этот код существует в /screens/Home.js Файл дампа находится в /client/dbfile/database.txt

var db = new PouchDB("cs1");

db.get("_local/initial_load_complete")
  .catch(function(err) {
    console.log("loading dumpfile");
    if (err.status !== 404) {
      // 404 means not found
      throw err;
    }
    db.load("/client/dbfile/database.txt").then(function() {
      return db.put({ _id: "_local/initial_load_complete" });
    });
  })
  .then(function() {
    // at this point, we are sure that
    // initial replication is complete
    console.log("loading is complete!");
    return db.allDocs({ include_docs: true });
  })
  .then(
    function(res) {
      // display all docs for debugging purposes (empty)
      console.log(res);
    });

this.localDB = db;

Когда это запускается, моя консоль отображает это - показывая, что было добавлено 0 строк.

Object {
    "offset": 0,
    "rows": Array [],
    "total_rows": 0,
}
Possible Unhandled Promise Rejection (id: 0):
Object {
    "message": undefined,
    "name": "unknown",
    "status": 0,
}

Ответы [ 3 ]

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

В моем проекте у меня есть пара документов db, которые я распространяю с приложением (хороший пример - перевод JSON). Поэтому при инициализации приложения я просто пытаюсь прочитать перевод документации из базы данных, если ее нет, - импортирую содержимое из модуля js и сохраняю в базе данных. Затем трансляции изменяются только при репликации с сервера на локальную базу данных.

//transmob.js
const transMobFile = {
//content goes here
);
module.exports = transMobFile

//dbInit.js
import transMobFile from 'data/transMob';
..
PDB.getDoc('TransMob')
.then((doc)=> {
  if (!doc) {
  global.locales = transMobFile.localesMob; // locales
  global.translations = transMobFile.langMob; // translations
  return PDB.saveDoc('TransMob', transMobFile)
  }
})
0 голосов
/ 12 сентября 2018

Вы можете использовать response-native-fs для загрузки файла из / android / app / src / main / assets. Просто поместите файл в папку активов и прочитайте его с помощью RNFS.readFileAssets.

import PouchDB from 'pouchdb-core';

PouchDB
 .plugin(require('pouchdb-find'))
 .plugin(require('pouchdb-load'));

import RNFS from 'react-native-fs';

const localDB = new PouchDB("cs1", {adapter: 'asyncstorage'});


localDB.get("_local/initial_load_complete")
 .catch(function(err) {
   console.log("loading dumpfile");
   if (err.status !== 404) {
    // 404 means not found
     throw err;
   }

 RNFS.readFileAssets('yourdb.txt', 'utf8')
    .then((contents) => {
      localDB.load(contents).then(function() {
        return localDB.put({ _id: "_local/initial_load_complete" });
      }).then(function() {
        // at this point, we are sure that
        // initial replication is complete
        console.log("loading is complete!");
        return localDB.allDocs({ include_docs: true }).then(
          function(res) {
            // display all docs for debugging purposes (empty)
            console.log(res);
          });
      }, function(err) {
        console.log(err);
      });
    })
 })

Вам нужно будет перестроить свой проект, перезагрузка не достаточна. Мой проект падает, когда я пытаюсь загрузить файл размером 30 МБ, поэтому я, вероятно, разделю его на несколько файлов меньшего размера. Проверьте https://github.com/pouchdb-community/pouchdb-load, чтобы увидеть, как это работает при необходимости.

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

Я обнаружил, что для функции db.load() из модуля pouchdb-load требуется URL. Я указывал на путь к файлу в файловой системе устройства. Я поместил свой файл database.txt на свой сервер, изменил его, чтобы использовать URL, и он работал.

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

...