我最近才开始与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)的问题,但似乎用户能够访问文件而没有类似的问题,因此我认为我缺少一个步骤包括该文件夹作为该应用程序的可用资源。
答案 0 :(得分:0)
假设这样的结构: 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"}]
如果要检查存储数据的文件,可以使用: How to find my realm file?
这如何为您工作。