使用React Native时,使用Realm

在React Native中,我们使用Realm作为一种持久化数据的保存方法。在移动应用中,SQLite可能是主流选择,但是在React Native中,我们选择了Realm,因为React Native中的SQLite库不是很理想。

安装

yarn add realm @realm/react react-native-get-random-values
yarn add --dev @realm/babel-plugin

babel设置

module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: ['@realm/babel-plugin'],
};

模型的实现

import {Realm} from '@realm/react';

export class Task extends Realm.Object<Task> {
  _id: Realm.BSON.ObjectId = new Realm.BSON.ObjectId();
  description!: string;
  isComplete: boolean = false;
  createdAt: Date = new Date();
  userId!: string;

  static primaryKey = '_id';

  constructor(realm: Realm, description: string, userId?: string) {
    super(realm, {description, userId: userId || '_SYNC_DISABLED_'});
  }
}
import {createRealmContext} from '@realm/react';
import {Task} from './Task';

export const TaskRealmContext = createRealmContext({
  schema: [Task],
});

将模型传递给createRealmContext的schema。

使用实际的情况

我将把RealmProvider包围起来。

import React from 'react';
import {SafeAreaView, useColorScheme} from 'react-native';

import {Colors} from 'react-native/Libraries/NewAppScreen';
import {TaskRealmContext} from './models';
import Home from './Home';

function App(): JSX.Element {
  const isDarkMode = useColorScheme() === 'dark';
  const {RealmProvider} = TaskRealmContext;

  const backgroundStyle = {
    backgroundColor: isDarkMode ? Colors.darker : Colors.lighter,
  };

  return (
    <SafeAreaView style={backgroundStyle}>
      <RealmProvider>
        <Home />
      </RealmProvider>
    </SafeAreaView>
  );
}

export default App;
    書き込み処理
const {useRealm} = TaskRealmContext;

function Home(): JSX.Element {
  const realm = useRealm();

  return (
    <View>
      <Button
        onPress={() => {
          realm.write(() => {
            return new Task(realm, 'test');
          });
        }}
        title="Add"
      />
    </View>
  );
}
realm.write(() => {
  return new Task(realm, 'test');
});

你可以在这里将数据写入realm。
因为realm可以直接写入模型,所以我认为实现起来很简单。

广告
将在 10 秒后关闭
bannerAds