如何将领域与本机应用程序捆绑在一起
How to bundle realm with react native app
我最近才开始使用 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),但似乎用户能够访问该文件而没有像这样的问题,所以我假设有一个我缺少将该文件夹作为应用程序可用资源的步骤。
假设这样的结构:
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"}]
如果你想检查存储数据的文件,你可以使用:
这对你有用。
我最近才开始使用 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),但似乎用户能够访问该文件而没有像这样的问题,所以我假设有一个我缺少将该文件夹作为应用程序可用资源的步骤。
假设这样的结构: 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"}]
如果你想检查存储数据的文件,你可以使用:
这对你有用。