移动端数据库新王者 - Realm React Native 版本应用详解之略陈固陋爬坡篇 (二)

1,824 阅读7分钟

尊重版权,未经授权不得转载

本文来自:江清清的技术专栏(www.lcode.org)

(一)前言

上一篇我们更新了Realm React Native版本应用详解的第一篇,主要介绍一下Realm的一些基础介绍,优缺点以及针对React Native模块Realm的安装配置和使用基础讲解。今天我们开始进行第二篇了算是略陈固陋爬坡篇了,主要会讲解模型表结构创建,属性等相关功能使用讲解。本实例地址:github.com/jiangqqlmj/…

移动端数据库新王者-Realm React Native版本应用详解之抛砖引玉入坑篇(一)

移动端数据库新王者-Realm React Native版本应用详解之略陈固陋爬坡篇(二)

刚创建的React Native交流6群:426762904,欢迎各位大牛,React Native技术爱好者加入交流!同时博客右侧欢迎微信扫描关注订阅号,移动技术干货,精彩文章技术推送!

(二)Models(模型表创建使用)

2.1.Models基本内容

在讲解数据增删查改之前,我们首先需要创建表。Realm数据表结构通常在Realm初始化时候传入模型schema信息(该代表一个表结构对象)。scheme对象一般由对象的名字和一组属性组成,并且每一个属性都有一个属性名称和类型以及对象objectType类型以及属性列表。同时你可以设置每一个属性是否为可选或者有一个默认值。首先我们看一下官方写的创建代码CarSchema和PersonSchema

var Realm = require('realm');

const CarSchema = {
  name: 'Car',
  properties: {
    make:  'string',
    model: 'string',
    miles: {type: 'int', default: 0},
  }
};
const PersonSchema = {
  name: 'Person',
  properties: {
    name:     'string',
    birthday: 'date',
    cars:     {type: 'list', objectType: 'Car'},
    picture:  {type: 'data', optional: true}, // optional property
  }
};

// Initialize a Realm with Car and Person models
let realm = new Realm({schema: [CarSchema, PersonSchema]});

如果我们需要从现有的类中继承扩展,那么可以如下进行编写:

class Person {
  get ageSeconds() {
    return Math.floor((Date.now() - this.birthday.getTime()));
  }
  get age() {
    return ageSeconds() / 31557600000;
  }
}

Person.schema = PersonSchema;

// Note here we are passing in the `Person` constructor
let realm = new Realm({schema: [CarSchema, Person]});

有了如上的操作代码之后,我们已经完成表结构模型的创建,接下来就是插入数据以及从realm数据库中抓取数据了,看如下实例代码:

realm.write(() => {
  let car = realm.create('Car', {
    make: 'Honda',
    model: 'Civic',
    miles: 750,
  });

  // you can access and set all properties defined in your model
  console.log('Car type is ' + car.make + ' ' + car.model);
  car.miles = 1500;
});

2.2.基础属性类型

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 CarSchema = {
  name: 'Car',
  properties: {
    // The following property types are equivalent
    make:   {type: 'string'},
    model: 'string',
  }
}

一般model:'string' 这种写法就OK啦。

2.3.对象属性

如果我们需要引用对象,那么只需要在定义对象类型的属性指定需要引用的对象即可,如下:

const PersonSchema = {
  name: 'Person',
  properties: {
    // All of the following property definitions are equivalent
    car: {type: 'Car'},
    van: 'Car',
  }
};

当我们需要使用对象属性的时候,必须确保引用的类型对象已经在Realm的表结构已经存在的。

// CarSchema is needed since PersonSchema contains properties of type 'Car'
let realm = new Realm({schema: [CarSchema, PersonSchema]});

间接着当我们需要访问对象属性的时候,我们可以采用普通属性正常的语法进行访问即可,如下实例代码:

realm.write(() => {
  var nameString = person.car.name;
  person.car.miles = 1100;

  // create a new Car by setting the property to valid JSON
  person.van = {make: 'Ford', model: 'Transit'};

  // set both properties to the same car instance
  person.car = person.van;
});

2.4.List Properties(列表属性)

当我们需要使用列表属性的时候,我们必须制定该属性的类型为列表以及objectType

const PersonSchema = {
  name: 'Person',
  properties: {
    cars: {type: 'list', objectType: 'Car'},
  }
}

当访问列表属性返回一个列表对象的时候,该列表和JavaScript数组非常相似。最大的区别就是这边列表数据的更改会自动保存到底层Realm中。此外列表是属于底层Realm对象的,所以我们仅仅可以通过拥有列表属性的对象获取该列表实例,而不是手动去创建它。

let carList = person.cars;

// Add new cars to the list
realm.write(() => {
  carList.push({make: 'Honda', model: 'Accord', miles: 100});
  carList.push({make: 'Toyota', model: 'Prius', miles: 200});
});

let secondCar = carList[1].model;  // access using an array index

2.5.Optional Properties(可选属性)

同时在我们的属性定义中,我们可以设置属性是必选的或者可选的,当然对于对象属性默认就是可选的,且不能设置哦

const PersonSchema = {
  name: 'Person',
  properties: {
    name:     {type: 'string'},               // 可选属性
    birthday: {type: 'date', optional: true}, // 可选属性

    // object properties are always optional
    car:      {type: 'Car'},
  }
};

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

realm.write(() => {
  //对象属性可以被设置null或者undefined
  let charlie = realm.create('Person', {
    name: 'Charlie',
    birthday: new Date(1995, 11, 25),
    car: null,
  });

  // 可选属性可以设置成null,undefined或者一个新的non-null值
  charlie.birthday = undefined;
  charlie.car = {make: 'Honda', model: 'Accord', miles: 10000};
});

综上所述,对象属性始终是可选的,并且不需要使用optional修饰符。列表属性不能声明成可选择或者设置成null,所以我们可以在初始化的时候传入一个空数组即可。

2.6.Default Property Values(默认属性值)

默认属性值设置可以通过default关键字,通过使用一个默认值,可以在对象表结构创建的时候,该属性不设置值那就可以使用默认值,如果设置值,那就会重写默认值。

const CarSchema = {
  name: 'Car',
  properties: {
    make:  {type: 'string'},
    model: {type: 'string'},
    drive: {type: 'string', default: 'fwd'},
    miles: {type: 'int',    default: 0}
  }
};

realm.write(() => {
  // 'mile'属性会使用默认值0
  // `drive`属性的值会被重写,使用awd
  realm.create('Car', {make: 'Honda', model: 'Accord', drive: 'awd'});
});

2.7.Indexed Properties(索引属性)

我们可以使用indexed来设置该属性是否可以被索引,该功能属性支持int,string和bool属性类型

var BookSchema = {
  name: 'Book',
  properties: {
    name: { type: 'string', indexed: true },
    price: 'float'
  }
};

设置属性字段的索引当我们在查询的时候,可以大大加快查询效率。

2.8.Primary Keys(主键)

你可以指定对象模型使用primaryKey属性,该属性的类型可以为string和int类型。声明主键之后,在更新和设置值的时候该值必须保持唯一。一旦一个使用主键的对象被添加到Realm之后,该主键值就无法被修改啦。

const BookSchema = {
  name: 'Book',
  primaryKey: 'id',
  properties: {
    id:    'int',    // primary key
    title: 'string',
    price: 'float'
  }
};

特别声明一下,主键属性会自动被加入到索引当中。

(三)创建表实例(Create Models)

上面我们已经对于表结构的创建以及相关属性等知识点做了讲解,下面我们来一起看一个实例

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 */

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';
const Realm=require('realm');
class RealmModelsDemo extends Component {
  render() {
    //创建Person模型 cars:{type:'list',objectType:'Car'},
    const PersonSchema={
      name:'Person',
      properties:{
        name:'string',
        nickname:'string',
        birthday:'date',
        picture:{type:'string',optional:true}
      }
    };
    //进行初始化realm
    let realm=new Realm({schema:[PersonSchema]});
    //进行写数据到表中
    //1.首先写入Car数据
    realm.write(()=>{
        let person=realm.create('Person',{
          name:'张三',
          nickname:'我是昵称',
          picture:'http://www.lcode.org',
          birthday:new Date(1995, 11, 25),
        });
    });
    let person=realm.objects('Person')[0];
    return (
      
        
           Realm基础使用实例
        
        数据库中存储的数据为:
        name:{person.name}  
        nickname:{person.nickname}  
        picture:{person.picture}      
      
    );
  }
}
const styles = StyleSheet.create({
  welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
});

AppRegistry.registerComponent('RealmDemo', () => RealmModelsDemo);

运行效果

查看图片

(四)最后总结

今天我们主要学习了进行介绍一下Realm表结构模型的创建方法以及相关属性介绍,大家有问题可以加一下群React Native交流6群:426762904.或者底下进行回复一下。

尊重原创,未经授权不得转载:From Sky丶清(www.lcode.org/) 侵权必究!

关注我的订阅号(codedev123),每天分享移动开发技术(Android/IOS),项目管理以及博客文章!(欢迎关注,第一时间推送精彩文章)

查看图片

关注我的微博,可以获得更多精彩内容