react native学习笔记18——存储篇(3)Realm

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/teagreen_red/article/details/78626267

前言

Realm是一款新兴的针对移动平台设计的数据库,使用简单、跨平台、性能优越功能强大。其官网地址为:https://realm.io/。Realm与sqlite在性能上各有优势,但其更加简单易用,学习成本低。

配置

1. 安装

在项目的根目录下执行cmd命令:

npm install --save realm

2. 将项目关联realm原生模块库

react-native link realm

注意:在Android中,react-native link可能产生无效配置,例如成功更新了Gradle的配置(android/settings.gradleandroid/app/build.gradle),但没有添加Realm模块。首先确认是否成功添加Realm模块,如果没有,需要手动添加,步骤如下:

1.修改android/settings.gradle配置

...
include ':realm'
project(':realm').projectDir = new File(rootProject.projectDir, '../node_modules/realm/android')

2.修改android/app/build.gradle的配置

...

dependencies {
    ...
    compile project(':realm')
}

3.在MainApplication.java注册模块
修改android/app/src/main/java/com/[YourAppName]/MainApplication.java的配置

import io.realm.react.RealmReactPackage; // add this import

public class MainApplication extends Application implements ReactApplication {
    @Override
    protected List<ReactPackage> getPackages() {
        return Arrays.<ReactPackage>asList(
            new MainReactPackage(),
            new RealmReactPackage() // add this line
        );
    }
}

使用实例

下例是官网的一个最基础的实例:

import React, { Component } from 'react';
import {
    AppRegistry,
    Text,
    View,
    StyleSheet,
} from 'react-native';

const Realm = require('realm');
const DogSchema = {
    name: 'Dog',
    primaryKey:'id',
    properties: {
        id:'int',
        dogname:'string',
        color:'string',
    }
};

export default class RealmDemo extends Component {
    constructor(props) {
       super(props);
       this.state = { realm: null };
    }

    componentWillMount() {
        let realm = new Realm({schema: [DogSchema]});
        realm.write(() => {
            realm.create('Dog', {id:0,dogname: 'Rex', color:'red'});
            realm.create('Dog', {id:1,dogname: 'Jeff', color:'green'});
            realm.create('Dog', {id:2,dogname: 'Dave', color:'black'});
            //更新id为1的数据
            realm.create('Dog', {id:1, color:'white'},true);
        });
        this.setState({realm});
    }

    render() {
    const info = this.state.realm
    ? 'Number of dogs in this Realm: ' + this.state.realm.objects('Dog').length
    : 'Loading...';

    return (
        <View style={styles.container}>
        <Text >
        {info}
        </Text>
        </View>
    );
}
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: '#f2f2f2',
        paddingTop:20,
    },
});

新建表模型

在进行数据库的增删改查之前,首先得创建数据库表。
该实例中用Realm新建一个名为Dog的表。表模型的设计如下:

//新建表模型
const DogSchema = {
    name: 'Dog',
    primaryKey:'id',
    properties: {
        id:'int',
        dogname:'string',
        color:'string',
    }
};
  • name: 表名字。
  • primaryKey: 主键,可以是 ‘int’ 或’string’,主键必须保持唯一性,一旦将某字段设定为主键后该表的主键无法变更。
  • properties: 该属性内设置自定义的表字段名。如上例中properties: {dogname: 'string'}dogname为字段名,string为类型。

建表

//建表
let realm = new Realm({schema: [DogSchema]});

也可同时创建多个表,如:

let realm = new Realm({schema: [DogSchema,CatSchema,PersonSchema]});

Realm支持以下的一些基础类型:bool,int,float,double,string,data和date。

  • bool属性映射到JavaScript中Boolean对象
  • int,float和double属性映射到JavaScript中Number对象,不过’int’和’double’会以64位进行存储但是float会以32位进行存储
  • string属性会被映射成String对象
  • data属性会被映射成ArrayBuffer对象
  • date属性会被映射成Date对象
    当需要对属性进行设置类型的时候,一般直接写属性类型就行,不需要使用一个字典格式的写法,虽然下面两种写法是等价的。
const DogSchema = {
  name: 'Car',
  properties: {
    // The following property types are equivalent
    dogname:   {type: 'string'},
    color: 'string',
  }
}

插入数据

realm.write(() => {
    realm.create('Dog', {id:0,dogname: 'Rex', color:'red'});
    realm.create('Dog', {id:1,dogname: 'Jeff', color:'green'});
    realm.create('Dog', {id:2,dogname: 'Dave', color:'black'});
});

查询数据

  • 查询所有数据
    可通过realm.objects(“name”)的方式获取该数据表所有的数据。
let dogs = realm.objects('Dog');
console.log ('name:' + dogs[0].dogname);
  • 根据条件查询数据
    可通过filtered方法对查询到的所有数据进行筛选,如下:
  let dogs = realm.objects('Dog');
  let redDogs = dogs.filtered('color = "red" AND name BEGINSWITH "B"');

当前Realm仅支持部分NSPredicate语法进行查询语句的筛选:对数字类型的数据支持基本的比较操作:==,!=, >,>=, <, 和 <=
。对string类型支持:==, BEGINSWITH, ENDSWITH, CONTAINS。string类型数据可以不分大小写通过==[c],BEGINSWITH[c]等等比较过滤。同样比较的时候可以通过获取对象的属性获取数据进行比较例如car.color=='blue'
目前的Realm版本(Realm Javascript 2.0.4)仅支持Realm类型数据的列表的筛选,以后可能会支持基本类型数据的列表筛选。

更新数据

如果构建的表模型中含有主键primaryKey,可以利用realm.create方法根据primaryKey修改对应的数据的值,并在第三个参数传入true。

realm.create('Dog', {id:1, color:'white'},true);

在上例中由于我们已经存在了id为1的数据,并且第三个参数传入了true,因此color属性会被更新为white值而不是新增一条数据。

删除数据

realm.write(() => {
  // Create a dog object
  let dog = realm.create('Dog', {id:0,dogname: 'Rex', color:'red'});

  //删除单个数据
  // Delete the dog
  realm.delete(dog);

  //删除所有数据
  // Delete multiple dogs by passing in a `Results`, `List` or JavaScript `Array`
  let allDogs = realm.objects('Dog');
  realm.delete(allDogs); // Deletes all dogs
});

自动更新的特性

查询Realm返回的列表对象,对列表数据更新会自动保存在底层Realm中,这也意味着我们没有必要去重新查询数据库获取数据,修改列表对象会立即影响到查询的结果。

let night = realm.objects('Dog').filtered('dogname = "Night"');
// night.length == 0
realm.write(() => {
  realm.create('Dog', {id:3,dogname: 'Night', color:'red'});
});
// night.length == 1

上例中首先查询dogname为Night的狗,返回结果为0(因为我们根本就没添加),然后插入一条dogname为Night的数据,而此时并没有重新查询该表,但查询结果中已经有了一条数据了。

以上是realm的基本数据操作方法,如需更深入的了解,可以查看官方文档

猜你喜欢

转载自blog.csdn.net/teagreen_red/article/details/78626267