我选择了 Realm 来在我的 React Native 应用程序中存储数据。我不明白如何组织项目中的文件。文档仅提供一个组件的简单代码。但我需要数据库的不同组件的不同部分。
我在一个存储库中看到,其中所有方案都传递到“configureRealm.js”文件中的数组:
new Realm({schema: [Dogs, Cats]});
我还发现,例如,我可以将不同的方案放在“schemes”目录中,然后将它们导入到我需要的地方。
例如在“Cats.js” react 组件中我可以这样做:
import Cats from 'schemes/Cats';
this.realm = new Realm({schema: [Cats]});
并在“Dogs.js”中导入狗并使用此方案初始化 Realm 。
但我首先并以我的方式不确定。组织 Realm react native 应用程序的正确和最佳方式是什么?
最佳答案
在从比我聪明得多的人那里得到一些指导后,我最近开始像这样组织我的应用程序/数据结构,在处理 Realm 时:)我没有详细介绍 Realms 最初是如何创建的,因为我假设你已经在处理这个问题了。这对于组织/分区开发来说是一个非常可靠的结构。希望对您有帮助!
.App
├──Assets
├──Data
| ├──Db
| | ├──Db.js
| | ├──DbHelper.js
| ├──Models
| | ├──ModelA.js
| | ├──ModelB.js
| | ├──ModelC.js
| ├──Queries.js
├──Scenes
| ├──App.js
| | ├──(all other scene/view components)
--Models 目录包含我的所有模式,单独分解如下:
import Realm from 'realm';
export default class ModelA extends Realm.Object {}
ModelA.schema = {
name: 'ModelA',
primaryKey: 'id',
properties: {
one: {type: 'int', optional: true},
two: 'string',
three: {type: 'string', optional: true},
}
}
--在 Db.js
中,我保留了所有标准 Realm 相关方法。 createRealm()
、write()
、close()
、insert()
和通用查询方法,像这样:
query(model: string, filter?: string) {
let results = this.realm.objects(model);
if(filter) {
return results.filtered(filter);
}
return results;
}
--DbHelper.js
然后导入 Db.js
和我的所有模型。它使用 Db.js
中的标准方法处理数据库实例的设置和获取,如下所示:
import Db from 'App/Data/Db/Db';
import ModelA from 'App/Data/Models/ModelA';
import ModelB from 'App/Data/Models/ModelB';
import ModelC from 'App/Data/Models/ModelC';
class DbHelper {
modelSchema = [
ModelA,
ModelB,
ModelC
];
activeInstancePath = (myLocalRealmPath)
getInstance(): Db {
let instance: Db = this.activeInstancePath;
if(!instance) {
throw new Error('DbHelper.js :: Active Instance Not Set!');
}
return instance;
}
/* note: this is where you would also setInstance and define a constant, or other method for the instance path */
}
--Queries.js
然后导入 DbHelper.js
。 Queries.js
包含我用于特定应用程序相关数据查询的所有方法。 Queries.js
是我需要导入到 Scene
组件中以获取 Realm 数据的全部内容。我的 Queries.js
看起来像这样:
import DbHelper from 'App/Data/Db/DbHelper';
class Queries {
/* a typical query */
getSomeDataFromModelA(filterValue: string = null) {
let filter = null;
if (filterValue) {
filter = `two = ${filterValue}`;
}
let results = DbHelper.getInstance()
.query('ModelA', filter);
return results;
}
/* return some JSON data that we originally stored in the Realm as a string */
getSomeJsonData() {
let results = DbHelper.getInstance()
.query('ModelB');
if(results.length) {
let parsed = JSON.parse(results[0].objectA);
return parsed.objectB;
}
return null;
}
}
export default new Queries();
--App.js。所以现在,在我的应用程序场景中,我只需做这样的事情:
import React, { Component } from 'react';
import { View, Text } from 'react-native';
import Queries from 'App/Data/Queries';
class App extends Component {
constructor(props) {
super(props);
// Get Some Realm Data!
let modelAData = Queries.getSomeDataFromModelA()
let someJsonData = Queries.getSomeJsonData();
// Set Initial state
this.state = {
modelData: modelAData,
jsonData: someJsonData
}
}
componentDidMount() {
console.log(this.state.modelData);
}
render() {
return(
<View>
<Text>{this.state.jsonData.objectKey}</Text>
</View>
);
}
}
export default App;
关于javascript - 如何用Realm来组织React Native项目文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40195371/