Создание, массовая вставка, загрузка, поиск, обновление и удаление

Это простой пример использования Realm в приложении React Native. Демо включает:

  1. Загрузите большой JSON с сервера API и вставьте в базу данных Realm. JSON содержит 50 000 сущностей.
  2. Пропустить дублированный первичный ключ при вставке.
  3. Отобразить базу данных Realm в Realm Studio.

После инициализации нового проекта RN и установки области я только изменил App.js и добавил allSchemas.js. Коды прилагаются в конце статьи.

Приложение загружает JSON из API с помощью axios. Например:

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

Приложение позволяет выполнять поиск по идентификатору или имени, обновлять имя или удалять все. На экране «количество элементов» показывает, сколько элементов находится в Realm, а «время выполнения» показывает, сколько времени требуется для выполнения действия в мс.

В демонстрационном видео для загрузки 20 элементов потребовалось около 5 секунд. Это потому, что в режиме отладки он очень медленный. Я протестировал это приложение, установив его на устройстве Android, загрузка 50 000 объектов занимает менее 10 секунд.

Файл Realm можно открыть в Ream Studio. Пожалуйста, следите за этим.

allSchemas.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>
    );
  }
}

~ Удачного кодирования ~