如何使用Realm项目文件组织React Native?

inf*_*-vv 19 javascript realm react-native

我已经选择了在我的React Native应用程序中存储数据的领域.我不明白,如何在我的项目中组织文件.文档仅提供一个组件的简单代码.但我需要不同组件的数据库不同部分.

我在一个存储库中看到,所有方案都传递给"configureRealm.js"文件中的数组:

new Realm({schema: [Dogs, Cats]});
Run Code Online (Sandbox Code Playgroud)

我还发现,我可以在"scheme"目录中放置不同的方案,并将它们导入到我需要的地方.

例如,在"Cats.js"反应组件我可以做:

import Cats from 'schemes/Cats';

this.realm = new Realm({schema: [Cats]});
Run Code Online (Sandbox Code Playgroud)

并在"Dogs.js"导入狗并使用此方案初始化领域.

但我不是第一次也不确定.什么是正确的,组织领域的最佳方式是对本机应用程序做出反应?

fos*_*ime 28

我最近开始组织我的应用程序/数据结构,在处理Realm之后,从一个比我更聪明的人得到一些指示:)我没有详细介绍最初如何创建领域,我假设你是处理已经.这只是组织/分区开发的一个非常可靠的结构.希望能帮助到你!

.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)
Run Code Online (Sandbox Code Playgroud)

- 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},
    }
}
Run Code Online (Sandbox Code Playgroud)

- 在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;
}
Run Code Online (Sandbox Code Playgroud)

- 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 */
}
Run Code Online (Sandbox Code Playgroud)

- 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();
Run Code Online (Sandbox Code Playgroud)

--App.js.所以现在,在我的App Scene中我会做这样的事情:

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;
Run Code Online (Sandbox Code Playgroud)

  • @fostertime - 你们会介意分享一段代码来打开远程领域吗?你是如何访问数据的?我有一个redux商店,并且实际上试图通过记录用户来解决整个异步问题,将用户对象保存在我的redux存储中并将该用户传递给getInstance函数,但这似乎不起作用我必须在登录操作中初始化领域.不幸的是,我无法解决这个问题. (3认同)