CRUD — 创建 — Flutter SDK
Atlas Device SDK 使用高效的存储引擎来持久化对象。您可以创建对象、更新数据库中的对象,并最终从数据库中删除对象。由于这些操作会修改数据库的状态,因此我们称之为写入。
写事务(write transaction)
SDK 通过事务处理写入。事务是一系列读写操作组成的列表,SDK 将其视为单个不可分割的操作。换句话说,事务是全有或全无的:事务中的所有操作要么全部成功,要么全都不生效。
所有写入都必须在事务中进行。
数据库一次只允许一个打开的事务。SDK 会阻塞其他线程上的其他写入,直到打开的事务完成。因此,在事务内部从数据库读取值时,不存在竞争条件。
当您完成事务后,SDK 要么提交它,要么取消它:
当 SDK 提交事务时,会将所有更改写入磁盘。对于已同步的数据库,SDK 会将更改排入队列以便与 Atlas Device Sync 同步。
当 SDK 取消写事务(write transaction)或事务中的操作导致错误时,所有更改都将被丢弃(或“回滚”)。
写入操作
打开数据库后,您可以使用 Realm在其中创建对象。 写入() ACID 事务区块。
realm.write((){ // ...write data to realm });
您还可以返回写事务(write transaction)回调函数的值。
final yoda = realm.write<Person>(() { return realm.add(Person(ObjectId(), 'Yoda')); });
警告
将 RealmObjects 写入一个 Realm 文件
您只能将 RealmObjects
写入单个域文件。如果您已经将 RealmObject
写入了一个域文件,那么当您尝试将其写入另一个数据库时,SDK 就会抛出一个 RealmException
异常。
后台写入
您可以使用 Realm.writeAsync() 异步添加、修改或删除对象。
使用 Realm.writeAsync()
执行写入操作时,等待获取写锁(write lock)和提交事务会在后台进行。只有写入本身在主进程中进行。
这可以减少阻塞主进程执行所花费的时间。这在使用 Device Sync 时特别有用,因为不知道同步客户端何时写入以及会写入多长时间。
// Add Leia to the realm using `writeAsync` Person leia = Person(ObjectId(), "Leia"); realm.writeAsync(() { realm.add<Person>(leia); });
创建对象
本页上的示例使用两种对象类型:Person
和 Team
。
()class _Person { () late ObjectId id; late String name; late List<String> hobbies; } ()class _Team { () late ObjectId id; late String name; late List<_Person> crew; late RealmValue eventLog; }
创建一个对象
要将对象添加到数据库,请使用 Realm.add() 在写事务块中将 Realm 对象类的实例传递到数据库。
realm.write(() { realm.add(Person(ObjectId(), 'Lando')); });
创建多个对象
要向数据库添加多个对象,请在写事务(write transaction)块内将多个对象的列表传递给 Realm.addall ()。
realm.write(() { realm.addAll([ Person(ObjectId(), 'Figrin D\'an'), Person(ObjectId(), 'Greedo'), Person(ObjectId(), 'Toro') ]); });