Как связать царство с реагировать нативное приложение - PullRequest
3 голосов
/ 03 июля 2019

Я только недавно начал работать с реагировать на родной и Realm, и это прекрасно работает.

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

Есть ли способ сказать, реагировать на нативный, чтобы хранить папку в корне проекта (например, ./data/) с приложением и иметь возможность открыть область из этой папки?

Я попробовал это в конструкторе страницы, требующей файл области:

let realm = new Realm({
        path: './data/ourrealm.realm',
        schema: [schema1, schema2, schema3]
});

Но это выдает ошибку примерно так:

Error: Unable to open a realm at path './data/ourrealm.realm.management': 

make_dir() failed: No such file or directory Path:.

Я нашел проблему на их GitHub ота же проблема (https://github.com/realm/realm-js/issues/816), но казалось, что пользователь мог получить доступ к файлу без такой проблемы, как эта, поэтому я предполагаю, что есть шаг, который я пропускаю, включив эту папку в качестве доступных ресурсов для приложения.

1 Ответ

0 голосов
/ 13 июля 2019

Предполагая структуру, подобную этой: schema.js

export const EVENTS_SCHEMA = 'events';
export const EventsSchema = {
  name: EVENTS_SCHEMA,
  primaryKey: 'EventID',
  properties: {
    EventID: 'int',
    EventName: 'string',
    EventDate: 'string'
  }
};

app.js

import React, { Component } from 'react';
import { Text, View, Button, TextInput } from 'react-native';
import axios from 'axios';
import { EventsSchema, EVENTS_SCHEMA } from './allSchemas';
const Realm = require('realm');
const databaseOptions = {
  path: 'realmT4.realm',
  schema: [EventsSchema],
  schemaVersion: 0
};
type Props = {};
export default class App extends Component<Props> {
  constructor(props) {
    super(props);
    this.state = { events: null, size: 0, runTime: 0, findName: '', text: '', updateText: '' };
  }
componentWillMount() {
  Realm.open(databaseOptions).then(realm => {
    this.setState({ size: realm.objects(EVENTS_SCHEMA).length });
  });
}
downloadEvents() {
  const startTime = new Date().getTime();
  axios.get('https://YourAPI/YourMethod')
   .then(response => {
     Realm.open(databaseOptions).then(realm => {
       realm.write(() => {
         response.data.forEach(obj => {
             if (realm.objects(EVENTS_SCHEMA).filtered(`EventID=${obj.EventID}`).length === 0) {
                  realm.create(EVENTS_SCHEMA, obj);
             }
         });
          this.setState({ size: realm.objects(EVENTS_SCHEMA).length });
          const endTime = new Date().getTime();
          this.setState({ runTime: endTime - startTime });
       });
     });
});
}
  uploadEvents() {
  }
clearAllEvents() {
  const startTime = new Date().getTime();
  Realm.open(databaseOptions)
  .then(realm => {
       realm.write(() => {
         const allEvents = realm.objects(EVENTS_SCHEMA);
         realm.delete(allEvents); // Deletes all books
         this.setState({ size: realm.objects(EVENTS_SCHEMA).length });
         const endTime = new Date().getTime();
         this.setState({ runTime: endTime - startTime });
       })
  })
  .catch(error => {
  });
}
findID() {
  const startTime = new Date().getTime();
    const text = this.state.text;
  Realm.open(databaseOptions).then(realm => {
    const res = realm.objects(EVENTS_SCHEMA).filtered(`EventID=${text}`)
    this.setState({ findName: res[0].EventID + ': ' + res[0].EventName })
    const endTime = new Date().getTime();
    this.setState({ runTime: endTime - startTime });
})
.catch((error) => {
  console.log(error);
});
}
findName() {
  const startTime = new Date().getTime();
  const text = this.state.text;
  Realm.open(databaseOptions).then(realm => {
    const res = realm.objects(EVENTS_SCHEMA).filtered(`EventName="${text}"`)
    this.setState({ findName: res[0].EventID + ': ' + res[0].EventName })
    const endTime = new Date().getTime();
    this.setState({ runTime: endTime - startTime });
})
.catch((error) => {
  console.log(error);
});
}
updateName() {
  const startTime = new Date().getTime();
  const updateText = this.state.updateText;
  const text = this.state.text;
  Realm.open(databaseOptions).then(realm => {
    let target = realm.objects(EVENTS_SCHEMA).filtered(`EventID=${text}`)[0];
    if (!target) {
      target = realm.objects(EVENTS_SCHEMA).filtered(`EventName=${text}`)[0];
    }
    realm.write(() => {
      target.EventName = updateText;
    })
    const endTime = new Date().getTime();
    this.setState({ runTime: endTime - startTime });
  })
}
render() {
    const info = 'Number of items in this Realm: ' + this.state.size
    return (
      <View >
        <Text>
          {info}
        </Text>
        <Text>
          Execution time: {this.state.runTime} ms
        </Text>
        <Button onPress={this.downloadEvents.bind(this)} title="Download" />
        <Button onPress={this.uploadEvents.bind(this)} title="Upload" />
        <Button onPress={this.clearAllEvents.bind(this)} title="Delete All" />
        <TextInput
          onChangeText={(text) => this.setState({ text })}
          value={this.state.text}
        />
        <Button onPress={this.findID.bind(this)} title="Find by ID" />
        <Button onPress={this.findName.bind(this)} title="Find by Name" />
        <Text>
          Find user: {this.state.findName}
        </Text>
        <Text>
          Update above user name to:
        </Text>
        <TextInput
          onChangeText={(updateText) => this.setState({ updateText })}
          value={this.state.updateText}
        />
          <Button onPress={this.updateName.bind(this)} title="Update Name" />
      </View>
    );
  }
}

Предполагается (на основепример схемы), у вас есть ответ от сервера, подобный следующему:

[{"EventID":1325,"EventName":"Summer Night","EventDate":"12/31/2018"},{"EventID":1326,"EventName":"Birthday Party","EventDate":"12/31/2011"}]

Если вы хотите проверить файл, в котором хранятся данные, вы можете использовать: Как найти файл моей области?

Как это работает для вас.

...