在另一个.JS文件中定义的Open Realm-JS

时间:2017-10-04 13:45:00

标签: node.js react-native realm

我正在尝试在 react-native 中使用 realm-js ,所以我在我的操作文件夹中创建了一类realm-js,就像在中一样LoginActions.js ,它将在用户登录后写入数据。

我的问题是如何在另一个.js文件中打开相同的架构?

在LoginActions.js中定义的Realm-js:

class Login {
  get token() {
    return this.token;
  }
}

Login.schema = {
  name: 'Login',
  primaryKey: 'id',
  properties: {
    id: 'int',
    token: 'string',
  }
};

然后,我使用我的一些函数打开要在此模式中编写和更新的领域。

喜欢:

// If Login User Success
Realm.open({ schema: [Login] })
.then(realm => {
  realm.write(() => {
    realm.create('Login', { id: 1, token });
  });
});

现在,如果要将此架构打开到另一个.js文件中。我将如何打开它? 我想要的主要格式就像在Loading.js中一样:

import ????? from ????;

OR

Realm.open(????????)
.then(realm => {
  realm.write(() => {
    const isUser = realm.create('Login', { id: 1, token }, true);
    if(isUser.length == 1) {
        // User Logs In Directly to Main Screen
    } else {
        // Show them Login Screen
    }
  });
});

2 个答案:

答案 0 :(得分:0)

您可以保存Realm实例,稍后在其他.js文件中使用它。

没有Redux(推荐)

这是我建议使用的方式,即使您在应用中使用Redux也是如此。

架构和领域创建发生在realm.js文件中,稍后在代码中需要的任何位置导入该文件。

realm.js文件看起来像(带有2个示例模式):

import Realm from 'realm'; 

class Favorite extends Realm.Object {}
Favorite.schema = {
  name: 'Favorite',
  primaryKey: 'id', 
  properties: {
    id:     'string', 
    type:     'string', 
    favorite: 'bool', 
    alert: 'bool', 
    tag:     'string', 
    artistId: 'int'  
  }
};

class Friend extends Realm.Object {}
Friend.schema = {
  name: 'Friend',
  primaryKey: 'fbId',
  properties: {
    name: 'string',
    fbId:'string',  
    email: 'string',
    foto: 'string',
    concerts: 'int[]',
    artists: 'int[]'
  }
};

var schemasArray = [
  Favorite, 
  Friend

export default new Realm({schema: schemasArray});

然后您可以从应用中的任何组件或文件中执行以下操作:

import realm from './realm'

并在领域文档中使用它:

try {
  if(realm){
    realm.write(() => {
      //delete all objects first
      var allFavorites = realm.objects('Favorite')
      realm.delete(allFavorites)
  } catch (e) {
    console.log(`Error deleting favorites: ${schema} - ${e}`);
    reject()
  }

Redux方式

如果您使用的是Redux,则可以首先将领域实例保存到应用程序状态,然后通过状态中的props将其传递给任何组件。 编辑:最后结果非常相似,但是你添加了更多的锅炉板代码来保存领域。

档案1

Realm.open({ schema: [Login] })
.then(realm => {
  this.saveRealm( realm )
});

操作

saveRealm是一个动作:

export function saveRealm( realm ) {
  return {
    type: types.SAVE_REALM,
    realm
  }
}

减速

将在reducer中处理:

export default function reducer(state = initialState, action = {}) {

  switch (action.type) {
    case types.SAVE_REALM:
      return Object.assign({}, state, {
        realm: action.realm
      });

      //other actions
    default:
       return state;
  }

文件2

最后在其他文件中.js只需使用保存的realm实例,而无需再次打开它。

this.props.realm.write(() => {
    const isUser = this.props.realm.create('Login', { id: 1, token }, true);
   //rest of your code...
  });

您需要像往常一样使用mapStateToProps:

function mapStateToProps(state) {
  return {
    realm: state.realm,

编辑:将“无Redux”作为推荐选项。添加更多代码示例代码。

答案 1 :(得分:0)

抱歉,我错过了您问题中的Realm.open细微差别。我一直在试验以下内容,但尚未遇到任何问题,但我不确定它是否正确"这样做的方法。

import Realm from "realm";
import { fromPromise } from "rxjs/observable/fromPromise";
import { share, mergeMap } from "rxjs/operators";

export const realmUser$ = fromPromise(
  Realm.Sync.User.login(...)
).pipe(share())

export const realm$ = realmUser$.pipe(
  mergeMap(user =>
    Realm.open({...})
  ),
  share()
);

除了一个或多个打开的领域之外,该模块还导出代表Realm用户的可观察对象。这些模块的导出可以轻松地在您的应用程序的其他地方使用。

import { realm$ } from "./sources/realm";

realm$.forEach(realm =>
  realm.write(() => {
    // TODO: Use the realm
  });
);

希望这会给你一些想法。此外,在Redux上下文中,您不需要或不想将域本身存储在商店中,但很可能是Realm.Result对象。您可以使用redux-observable

执行此操作

原始答案

realm-js git repo中的示例是否不符合您的需求?

导出单个领域:

import Realm from 'realm';

class Todo extends Realm.Object {}
Todo.schema = {
    name: 'Todo',
    properties: {
        done: {type: 'bool', default: false},
        text: 'string',
    },
};

class TodoList extends Realm.Object {}
TodoList.schema = {
    name: 'TodoList',
    properties: {
        name: 'string',
        creationDate: 'date',
        items: {type: 'list', objectType: 'Todo'},
    },
};

export default new Realm({schema: [Todo, TodoList]});

将领域导入另一个文件:

import realm from './realm';