javascript - 如何用Realm来组织React Native项目文件?

标签 javascript react-native realm

我选择了 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.jsQueries.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/

相关文章:

git - 与 React Native 团队一起使用 git

javascript - react native : How to split a file up into multiple files and import them?

ios - 如何在 realm-cocoa 中正确使用 RLMBool 属性?

javascript - 发送同步 Ajax 请求时显示微调器

javascript - document.createElement ("option"的快捷方式)?

javascript - 将 HTML 链接添加到 Google Charts 表格

ios - 定义 Realm 数据库结构 (Swift)

javascript - 如何使用 JavaScript 在 Windows 8 Metro 应用程序中获取 mp3 文件的文件名和 id3 标签?

amazon-web-services - 全局二级索引上的 AppSync 查询

ios - key 更改后的 RLMException - 已使用不同的加密 key 打开