Reputation: 670
I've just recently started working with react native and Realm, and it works great.
However up to this point we've only been using the realm file created in the default location, but we want to be able to package a realm file with our app when we ship it. Trying to access a direct path will create a new realm in the writable documents folder of our emulator, but I'm unsure how we can package the realm file that we've created and populate data into that folder.
Is there a way to tell react native to store a folder at the root of the project (eg ./data/) with the app, and be able to open a realm from that folder?
I tried this in the constructor of the page requiring the realm file:
let realm = new Realm({
path: './data/ourrealm.realm',
schema: [schema1, schema2, schema3]
});
But this throws an error like so:
Error: Unable to open a realm at path './data/ourrealm.realm.management':
make_dir() failed: No such file or directory Path:.
I found an issue on their GitHub about this same problem (https://github.com/realm/realm-js/issues/816) but it seemed that user was able to access the file without an issue like this one, so I assume there's a step I'm missing in including that folder as available resources for the app.
Upvotes: 4
Views: 760
Reputation: 12034
Assuming a structure like this: 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>
);
}
}
Assuming (based on the example schema), you have a response from the server similar to this:
[{"EventID":1325,"EventName":"Summer Night","EventDate":"12/31/2018"},{"EventID":1326,"EventName":"Birthday Party","EventDate":"12/31/2011"}]
If you want to check the file where the data is stored, you might use: How to find my realm file?
How this works for you.
Upvotes: 2