Как использовать область с асинхронным запросом на выборку?
Я встретил эту ситуацию для своих требований:
шаг 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 ответа
Сначала создайте сервис, подобный следующему
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()
метод согласно вашей потребности
Наконец, я использую царство так:
let realm = new Realm({schema:[JOB_SCHEMA.jobTrack],encryptionKey:getRealmKey()});
let objects = realm.objects('JobTrack');
realm.beginTransaction();
realm.delete(objects);
realm.commitTransaction();
realm.close();