3

我最近才开始使用 react native 和 Realm,效果很好。

然而,到目前为止,我们只使用在默认位置创建的领域文件,但我们希望能够在发布时将领域文件与我们的应用程序打包在一起。尝试访问直接路径将在我们模拟器的可写文档文件夹中创建一个新领域,但我不确定我们如何打包我们创建的领域文件并将数据填充到该文件夹​​中。

有没有办法告诉 react native 将文件夹存储在应用程序的项目根目录(例如 ./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)但似乎用户能够访问该文件而没有像这样的问题,所以我假设我缺少将该文件夹作为应用程序可用资源的步骤。

4

1 回答 1

1

假设这样的结构: schema.js

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

应用程序.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"}]

如果要检查存储数据的文件,可以使用: 如何找到我的领域文件?

这对你有什么作用。

于 2019-07-13T15:10:53.570 回答