我正在尝试在 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
}
});
});
答案 0 :(得分:0)
您可以保存Realm实例,稍后在其他.js文件中使用它。
这是我建议使用的方式,即使您在应用中使用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,则可以首先将领域实例保存到应用程序状态,然后通过状态中的props将其传递给任何组件。 编辑:最后结果非常相似,但是你添加了更多的锅炉板代码来保存领域。
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;
}
最后在其他文件中.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';