Как использовать область с асинхронным запросом на выборку? - PullRequest
0 голосов
/ 17 декабря 2018

Я соответствую этой ситуации для своих требований:

шаг 1. сохранить данные в локальную базу данных, которая в мобильном телефоне (область)

шаг 2. загрузить локальные данные на сервери сервер вернет идентификаторы данных в случае успешного шага 3. удалите записи в локальном БД по возвращенным идентификаторам, которые получают по шагу 2

Realm.open({schema:[MySchame],encryptionKey:getRealmKey()})
        .then(realm =>{
            realm.write(() => {
                // 1. get all step data from db
                let objetcs = realm.objects('MySchema');
                // 2. upload obtained data to server
                if(objetcs.length > 0){
                    let recordArr = [];
                    for (let o of steps){
                        recordArr.push(o.get());
                    }
                   uploadDataToServer(recordArr,(res)=>{
                        //3. filter the uploaded steps and delete them
                        let uploadedSteps = realm.objects('MySchema').filtered('id=$0',res.id);
                        if(uploadedSteps.length > 0){
                            realm.delete(uploadedSteps);
                        }
                    });
                }
            });
            realm.close();
        })
        .catch(error =>{
            console.log(error);
        });

, но это не работает должным образом, кажется, БД закрытаслишком рано, чем сети успеха обратного вызова.Спасибо за любые идеи.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Наконец, я использую царство так:

let realm = new Realm({schema:[JOB_SCHEMA.jobTrack],encryptionKey:getRealmKey()});
        let objects = realm.objects('JobTrack');
        realm.beginTransaction();
        realm.delete(objects);
        realm.commitTransaction();
        realm.close();
0 голосов
/ 17 декабря 2018

Сначала создайте сервис, подобный показанному ниже

import repository from "./realmConfig";

let CatalogsService = {
  findAll: function() {
    return repository.objects("CatalogsModel");
  },

  save: function(catalogs) {
    repository.write(() => {
      repository.create("CatalogsModel", catalogs);
    });
  },
  delete: function() {
    repository.write(() => {
      let all = repository.objects("CatalogsModel");
      repository.delete(all);
    });
  },

  update: function(catalogs, callback) {
    if (!callback) return;
    repository.write(() => {
      callback();
      catalogs.updatedAt = new Date();
    });
  }
};

module.exports = CatalogsService;

, где мой realmConfig файл имеет вид

 import Realm from "realm";

class CatalogsModel extends Realm.Object {}
CatalogsModel.schema = {
  name: "CatalogsModel",
  primaryKey: "id",
  properties: {
    id: "string",
    name: "string",
    url: "string",
    status: "int"
  }
};
class OffersModel extends Realm.Object {}
OffersModel.schema = {
  name: "OffersModel",
  primaryKey: "id",
  properties: {
    id: "string",
    name: "string",
    url: "string",
    status: "int",
    machineId: "string",
    machineName: "string"
  }
};

export default new Realm({
schema: [CatalogsModel, OffersModel],
schemaVersion: 1,
deleteRealmIfMigrationNeeded: true

 });

Теперь импортируйте Service.js, где вы звоните async вызов сервераи делай свою работу.Для справки см. Ниже код

import CatalogService from './path/to/CatalogService .js'

//get objects
var catalogs = CatalogsService.findAll();

// fire async function , I prefer axios for network calls

 Axios.post("SERVER_URL", {
      data: catalogs
    })
    .then(function(response) {
      if(response.success)        
       CatalogsService.delete()
}

Я предполагаю, что вы можете легко изменить findAll() и delete() метод в соответствии с вашими потребностями

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