iOS数据库-Realm官方文档(二)

承接上文, 上文讲解了Realm的一些基本知识, 本章节主要是Realm的一些实际操作.

写操作(Writes)

所有的改变(增,删,改)必须在write事务中完成.

Realm对象能像Swift一样创建.但是如果想在Realm中操作他们必须在write事务中.

Realm的写操作都是同步的,不是异步的.如果线程A开始写操作,然后线程B在同一个Realm中,A操作未完成前开始写操作.线程A必须完成并且提交自己的事务,此前,B的写操作时无法执行的.写操作在beginWrite()后会自动刷新.

创建对象(Creating objects)

1
2
3
4
class Dog: Object {
    @objc dynamic var name = ""
    @objc dynamic var age = 0
}

创建对象有很多种方法:

1
2
3
4
5
6
7
8
9
10
Copy to clipboard// (1) Create a Dog object and then set its properties
var myDog = Dog()
myDog.name = "Rex"
myDog.age = 10

// (2) Create a Dog object from a dictionary
let myOtherDog = Dog(value: ["name" : "Pluto", "age": 3])

// (3) Create a Dog object from an array
let myThirdDog = Dog(value: ["Fido", 5])
  1. 通过制定构造器创建对象
  2. 通过字典对象创建
  3. 通过数组创建,数组元素顺序必须和对应属性顺序一致.

创建完对象之后添加到Realm

1
2
3
4
5
6
7
8
// Get the default Realm
let realm = try! Realm()
// You only need to do this once (per thread)

// Add to the Realm inside a transaction
try! realm.write {
    realm.add(myDog)
}

添加到Realm之后你可继续使用, 在write事务中所有对此对象的改变都会被保存.

write事务会锁住自己所在的线程.但是读操作不会受到影响.你应该习惯使用大的write事务,除非你需要同时在多个线程同事进行写操作.当提交一个写事务的时候,所有Realm中其他对象都会被告知,并且自动更新.

嵌套对象(Nested objects)

如果对象的属性是另一个对象或者列表.那么可以使用嵌套数组或者字典,如下

1
2
3
4
5
// Instead of using already existing dogs
let aPerson = Person(value: ["Jane", 30, [aDog, anotherDog]])

//we can create them inline
let anotherPerson = Person(value: ["Jane", 30, [["Buster", 5], ["Buddy", 6]]])
注意:数组只能包含Object或其子类不能包含基本类型, 例如String</mark>