12.5.0 ( 2025 - 01 - 02 )
重大更改
- 由于Windows SDK 不再支持 32 位 ARM,因此已删除对 arm32 上 UWP 的支持。 (PR #3683 )
- 对Xamarin项目的支持已弃用。 虽然我们仍然希望 SDK 能够正常工作,但我们不再主动针对Xamarin进行测试,因为自 5 月份以来, Microsoft已终止 Xamarin 的生命周期。 (PR #3683 )
- 对.NET 6 的支持已弃用。 我们仍然希望一切正常,但在未来的发布中,我们将把 SDK 重新定位到最新的 LTS 版本 (8.0)。 (PR #3683 )
固定
- 修复当记录器日志级别设立为高于 Info(信息)时客户端应用关闭期间的崩溃。 (核心 14.12.1)
- 如果 File::rw_lock() 无法打开文件,则异常消息不包含文件名。 (核心 14.12.1)
- 如果基本名称的长度介于 240 和 250 之间,则回退到哈希文件名将失败。 (核心 14.12.1)
- 在某些平台上,使用多个谓词进行 OR 运算的查询可能会导致崩溃(严格的弱排序检查在 iPhone 上会失败)。 (核心 14.13.0)
兼容性
- Realm Studio: 15.0.0或更高版本。
内部资料
- 使用 Core 14.13.0 。
12.4.1 ( 2024 - 09 - 16 )
固定
- 修复了使用托管Web 套接字时,重负载下可能出现的同步流量中断问题;在这种情况下,格式不正确的二进制消息会导致服务器断开连接,并强制客户端重新连接并再次上传。 (问题# 3671 )。
兼容性
- Realm Studio: 15.0.0或更高版本。
内部资料
- 使用 Core 14.12.0 。
12.4.0 ( 2024 - 08 - 25 )
增强功能
- 在
SyncTimeoutOptions
上引入ReconnectBackoffOptions
属性,该属性允许控制同步客户端在尝试重新连接之前应用的延迟。 (PR # 3661 )。 - 角色和权限更改不再需要客户端重置来更新本地域。 (核心14.11.0 )
- 在 Windows 设备上,建立连接时,Device Sync 还会在 Windows 受信任的根证书颁发机构证书存储中查找 SSL 证书。 (核心14.11.0 )
- 同步日志语句现在在其前缀中包含应用服务连接 ID(例如
Connection[1:<connection id>] Session[1]: log message
),以便在故障排除期间更轻松地将同步活动与服务器日志关联起来。 (核心14.11.2 ) - 通过减少嵌入式对象复制日志中表选择的数量来提高同步引导性能。 (核心14.12.0 )
- 释放了一个读锁(read lock),即使在提交之后,该锁在可变订阅期间也被固定。 这样可以更早地释放资源,并且可以提高起始状态较大时同步引导的性能。 (核心14.12.0 )
- 客户端重置周期检测现在会检查先前的恢复尝试是否由同一核心版本进行,如果不是,则再次尝试恢复。 (核心14.12.0 )
- 将捆绑的 OpenSSL 版本更新为3.3.1 。 (核心14.12.0 )
固定
- 同步下载进度仅在引导程序完成时更新,因此在首次完成之前始终为0 ,然后永远为1 。 (核心14.11.0 )
- 如果在会话暂停时恢复会话,同步客户端可能会崩溃。 (核心14.11.0 )
- 如果同步会话在下载引导程序时因断开连接或重启而中断,则当会话重新连接并下载引导程序时,可能会包含上一个引导程序中的过时数据。 这可能导致存储在数据库中的对象与服务器的实际状态不匹配,并可能导致补偿写入。 (核心14.11.0 )
- 修复了没有要确认的下载时不必要的服务器往返。 (核心14.11.0 )
- 在登录时检索用户配置文件之前触发应用订阅回调,导致使用回调时出现空用户配置文件。 (核心14.11.1 )
- 同步客户端可能会报告重复补偿写入错误。 (核心14.11.2 )
- 修复了对跨链接的 int 或 timestamp属性使用RQL “BETWEEN”查询时出现的“无效列键”异常。 (核心14.12.0 )
- 修复与 ArrayErase 和 Clear 指令相关的冲突解决错误,该错误有时可能会导致“无效的prior_size”异常,从而阻止同步。 (核心14.12.0 )
- 修复冲突解决期间可能影响最终一致性的错误。 因此,受影响的客户端会出现数据发散和潜在的一致性错误。 (核心14.12.0 )
- 修复了在Linux ARMv 7系统上加载原生Realm库时出现的问题(当这些系统链接到我们捆绑的 OpenSSL 时,会导致
unexpected reloc type 0x03
等错误)。 (核心14.12.0 ) Realm.Copy()
有时会错误地抛出异常,声称当源Realm是同步Realm时存在未上传的本地更改。 (核心14.12.0 )
兼容性
- Realm Studio: 15.0.0或更高版本。
内部资料
- 使用 Core 14.12.0 。
12.3.0 ( 2024 - 07 - 17 )
弃用
Logger
已被弃用,取而代之的是RealmLogger
,Logger
目前派生自 。 (PR # 3634 )Logger.LogLevel
、set
和get
访问器已被弃用。 请使用RealmLogger.SetLogLevel()
和RealmLogger.GetLogLevel()
(请参阅下面的增强功能)。Logger.Function(Action<LogLevel, string> logFunction)
已被弃用。 请使用RealmLogger.Function(Action<LogLevel, LogCategory, string> logFunction)
(请参阅下面的增强功能)。
增强功能
ShouldCompactOnLaunch
允许在SyncConfiguration
(而不仅仅是 上设立RealmConfiguration
。(问题# 3617 )- 减小创建对象时产生的本地ACID 事务日志的大小,从而提高插入密集型事务的性能(核心14.10.0 )。
- 改进了整数和时间戳范围查询的性能。 要求您在
Realm.All<T>().Filter(...)
中使用“BETWEEN”操作。 (核心14.10.1 ) - 允许在
ShouldCompactOnLaunch
(而不仅仅是 上设立 。SyncConfiguration
RealmConfiguration
(问题# 3617 ) - 引入了
LogCategory
,并允许更好地控制应记录哪类消息以及应记录在哪个关键级别。 (PR # 3634 )- 允许设置和获取给定 的
LogLevel
LogCategory
。类别的层次结构从LogCategory.Realm
开始。RealmLogger.SetLogLevel(LogLevel.Warn, LogCategory.Realm.Sync); RealmLogger.GetLogLevel(LogCategory.Realm.Sync.Client.Session); // LogLevel.Warn
- 添加了一个接受回调的函数记录器,该回调将在调用时接收
LogLevel
、LogCategory
和消息。RealmLogger.Default = RealmLogger.Function((level, category, message) => /* custom implementation */);
- 添加了采用类别的
RealmLogger.Log()
重载。 预先存在的Log()
API将隐式日志在LogCategory.Realm.SDK
中。RealmLogger.Default.Log(LogLevel.Warn, LogCategory.Realm, "A warning message");
- 允许设置和获取给定 的
- 在 Windows 设备上,建立连接时,Device Sync 还会在 Windows 受信任的根证书颁发机构证书存储中查找 SSL 证书。 (核心14.11.0 )
- 角色和权限更改不再需要客户端重置来更新本地域。 (核心14.11.0 )
固定
ForCurrentlyOutstandingWork
进度通知器在注册后不会立即调用回调。 相反,您必须等待收到一些数据才能获得第一次更新 - 如果您在注册通知程序时已经陷入困境,您可能需要等待很长时间才能让服务器提供下载,这会调用/过期您的通知程序。 (核心14.8.0 )- 压缩后,将触发文件升级。 如果将
ShouldDeleteIfMigrationNeeded
设立为true
,则可能会导致数据丢失。 (问题# 3583 ,核心14.9.0 ) - 将已删除的对象作为替换参数传递给
.Filter()
会引发令人困惑的错误,并显示以invalid RQL for table
开头的消息。 现在,它会抛出一个更具描述性的错误。 (问题# 3619 ) - 修复如果在第一个重置条件完成之前出现新的客户端重置条件(例如回滚 Flexible 同步迁移),某些客户端重置(例如迁移到 Flexible 同步 )可能会失败并显示 AutoClientResetFailed 的问题。 (核心14.10.0 )
- 即使在 x 64上, Windows上的加密文件的最大大小也为2 GB ,原因是内部使用了
off_t
,而 是64位Windows上的32位类型。 (核心14.10.0 ) - 加密代码的行为不再因系统页面大小而异,这应该完全消除与在不同页面大小的平台之间复制加密Realm文件相关的重复出现的错误来源。 一个已知的未解决错误是 ( RNET- 1141 ),即在页面大小大于写入系统的系统上打开文件时,会尝试读取文件中从未写入过的部分。 (核心14.10.0 )
- 有几种复杂的情况可能会导致在多进程场景中对加密文件进行过时读取。 这些攻击非常困难,通常会导致崩溃,要么是由于断言失败,要么是抛出 DecryptionFailure。 (核心14.10.0 )
- 加密文件存在一些良性数据争用,在这种情况下,我们可以对某一内存区块进行 memcpy,同时另一个线程正在写入该内存块的有限范围。 发生这种情况时,从逻辑上讲是不可能从该范围进行读取的,但 Thread Sanitizer 对此的抱怨是很合理的。 现在,在使用 TSan运行时,我们会执行较慢的操作,从而避免这种良性争用。 (核心14.10.0 )
- 对用于全文搜索的字符串进行分词可能会传递范围[- 1 , 255 ] 到
isspace()
范围的值,这是一种未定义的行为。 (核心14.10.0 ) - 异步打开 Flexible Sync Realm可能会迫不及待地下载所有数据。 (核心14.10.1 )
- 清除升级文件中的
RealmValue
列表会导致断言失败。 (核心14.10.1 ) - 分配给嵌套集合时,可能会得到意外的合并结果。 (核心14.10.2 )
- 修复了如果链接来自嵌套列表、嵌套字典、顶级字典或
RealmValue
列表,并且源表包含超过256个对象,则删除来自错误对象的反向链接的问题。 删除对象时,这可能会表现为array_backlink.cpp:112: Assertion failed: int64_t(value >> 1) == key.value
。 (核心14.10.3 ) - 修复了包含带链接的嵌套集合的集群的折叠/重新加入问题。 删除对象时,这可能会表现为
array.cpp:319: Array::move() Assertion failed: begin <= end [2, 1]
。 (核心14.10.3 ) Session.WaitForUpload()
在处理不会生成任何要上传的变更集的提交方面存在不一致。 以前,如果所有等待上传的提交均为空,它有时会立即完成,而有时会等待服务器往返。 现在,它将始终立即完成。 (核心14.10.3 )- 重新映射属性时,使用内部名称调用
.Filter("... SORT/DISTINCT(mapped-to-name)")
可能会引发类似Cannot sort on key path 'NAME': property 'PersonObject.NAME' does not exist
的错误。 (核心14.10.4 ) - 如果在会话暂停时恢复会话,同步客户端可能会崩溃。 (核心14.11.0 )
- 如果同步会话在下载引导程序时因断开连接或重启而中断,则当会话重新连接并下载引导程序时,可能会包含上一个引导程序中的过时数据。 这可能导致存储在数据库中的对象与服务器的实际状态不匹配,并可能导致补偿写入。 (核心14.11.0 )
- 修复了没有要确认的下载时不必要的服务器往返。 (核心14.11.0 )
兼容性
- Realm Studio: 15.0.0或更高版本。
内部资料
- 使用 Core v 14.10.3 。
12.2.0 ( 2024 - 05 - 22 )
增强功能
改进了
SyncProgress.ProgressEstimate
的计算。 (问题# 3580 )添加了对
Migration.FindInNewRealm
的支持,它是一个辅助程序,允许您在迁移后 Realm 中查找与迁移前 Realm 中的对象相对应的对象。 (问题# 3600 )在生成的
RealmSchema
字段上添加了[System.Reflection.Obfuscation]
,以提高与更改生成类的字段和属性名称的混淆工具的兼容性。 (问题# 3574 )添加了对包含在
RealmValue
中的RealmValue
(IList<RealmValue>
和IDictionary<string, RealmValue>
)的列表和字典的支持。 列表和字典本身可以包含任意数量的集合。 可以使用新的静态方法RealmValue.List
和RealmValue.Dictionary
将现有集合转换为RealmValue
,如果从List
、RealmValue[]
或Dictionary
等常见类型进行转换,则可以使用隐式操作符。 最后,可以使用新的转换方法AsList
和AsDictionary
来获取包含的集合。 示例:var list = new List<RealmValue> { 1, true, "stringVal" }; var rvo = realm.Write(() => { return realm.Add(new RealmValueObject { RealmValueProperty = list}); }); var retrievedList = rvo.RealmValueProperty.AsList();
(PR # 3441 )
固定
- 从
User.Changed
通知中访问App.CurrentUser
会陷入死锁。 (核心14.7.0 ) - 在字典中多次插入指向同一键的同一链接会错误地创建指向该对象的多个反向链接。 这似乎并未导致后续崩溃,但会影响
RealmObject.BacklinksCount
返回的值以及涉及反向链接计数的查询。 (核心14.7.0 ) - 修复当集合包含原始值时会导致
RealmObject.DynamicApi.GetList/Set/Dictionary
失败的问题。 (问题# 3597 )
兼容性
- Realm Studio: 15.0.0或更高版本。
内部资料
- 使用 Core 14.7.0 。
12.1.0 ( 2024 - 05 - 01 )
增强功能
- 添加了一个实验性API ,用于在运行时更新应用程序的基本 URL -
App.UpdateBaseUriAsync()
。 其目的是用于边缘服务器和云之间的漫游。 (问题# 3521 )
固定
- 从
MongoClient.Collection.FindOneAsync
返回的值现在是一个可为 null 的文档,以便更明确地传达在没有对象与过滤匹配的情况下可以返回null
的信息。 (PR # 3586 ) - 修复集成删除已删除的字典键时出现的崩溃问题。 (核心14.5.2 )
App.AllUsers
仅包括已注销的用户,前提是他们在应用实例存在时注销。 它现在始终包括所有已注销的用户。 (核心14.6.0 )- 修复了有关加密文件可移植性的几个问题(将“捆绑”的加密Realm从一台设备复制到另一台设备):(Core 14.6.0 )
- 修复了当打开在页面大小与当前平台不同的平台上生成的小于64 Mb 的加密 Realm 时出现的
Assertion failed: new_size % (1ULL << m_page_shift) == 0
问题。 - 修复了打开在页面大小为4 k 的设备上生成的小型(< 4 k 数据) Realm时引发的
DecryptionFailed
异常,前提是该 Realm 捆绑并在页面大小较大的设备上打开。 - 修复了以下问题:当 top ref 位于距离页面末尾约50个字节的范围内时,针对某些罕见的分配模式,后续打开加密Realm时会出现问题。 这可能表现为 DecryptionFailed 异常或断言:
encrypted_file_mapping.hpp:183: Assertion failed: local_ndx < m_page_state.size()
。
- 修复了当打开在页面大小与当前平台不同的平台上生成的小于64 Mb 的加密 Realm 时出现的
- 如果在打开Realm 文件进程同步客户端应用了下载的变更集,则模式初始化可能会遇到断言失败。 (核心14.6.0 )
- 改进 UUID/ 类型的“链式 ORObjectId 相等”查询以及RQL string/int/uuid/ObjectId 类型的 解析“IN”查询的性能。(核心14.6.0 )
x == 1 OR x == 2 OR x == 3
修复了在string 条件中对带有空 的 属性进行评估时运行 IN 查询(或模式string Atlas Search的查询)时出现的错误。与空string的匹配将被评估,就像搜索空string一样。 (核心14.6.1 )
兼容性
- Realm Studio: 15.0.0或更高版本。
内部资料
- 使用 Core 14.6.1 。
12.0.0 ( 2024 - 04 - 17 )
文件格式版本已提高。 旧文件将自动升级,但无法降级,也无法使用旧版本的.NET SDK打开。
重大更改
- 添加了在
MongoClient.Collection
上使用方法时Realm类的自动序列化和反序列化功能,而无需使用MongoDB.Bson
属性注释类。 此功能需要更改各种类型(包括DateTimeOffset
)的默认序列化。 如果您更愿意使用以前的序列化,则需要在完成任何类型的序列化之前调用Realm.SetLegacySerialization
,否则可能无法按预期工作。 # 3459 SyncProgress.TransferredBytes
和SyncProgress.TransferableBytes
已被删除,取而代之的是SyncProgress.ProgressEstimate
,这是一个介于 0.0 和 1.0 之间的double精度值,表示当前进度的百分比估计值。 (问题# 3478 )- 支持从 RealmCore v 5.23.9生成的 Realm 文件进行升级 (Realm .NET v 5.0.1 )或更早版本不再受支持。 (核心14.0.0 )
String
和byte[]
现在是强类型的,可以进行比较和查询。 在RealmValue
属性上查询string常量时,此更改尤其重要,因为现在仅返回字符串。 如果需要搜索二进制数据,则必须由常量指定该类型。 在RQL (.Filter()
) 中,指定二进制常量的新方法是使用RealmValueProp = bin('xyz')
或RealmValueProp = binary('xyz')
。 (核心14.0.0 )- 字符串的排序顺序已更改为使用标准 unicode 代码点顺序,而不是将相似的英文字母分组在一起。 一个显着的变化是从“aAbBzZ”更改为“ABZabz”。 (核心14.0.0 )
- 在 RQL (
Filter()
) 中,如果要使用@type
操作进行查询,则必须使用objectlink
将链接匹配到对象。object
是为字典类型保留的。 (核心14.0.0 ) - 以只读模式打开文件格式23或更低的 Realm(早于12.0.0的 Realm .NET 版本)的 Realm 会崩溃。 (核心14.0.0 )
增强功能
减少了
RealmValue
的内存使用量。 (PR # 3441 )添加支持在使用
IRealmCollection.SubscribeForNotifications
时传递键路径集合(KeyPathsCollection
) 的支持。 通过传递KeyPathsCollection
,可以指定哪些属性更改应引发通知。KeyPathsCollection
可以通过以下方式获得:- 使用
KeyPathsCollection.Of
或KeyPathsCollection.Of<T>
方法显式构建; - 通过从
List
或KeyPath
大量或字符串进行转换来隐式构建它; - 分别获取完整通知和浅层通知的静态值
Full
和Shallow
之一。
KeyPath
可以通过从string隐式转换获得,也可以使用KeyPath.ForExpression<T>
方法从表达式构建。例如:
var query = realm.All<Person>(); KeyPath kp1 = "Email"; KeyPath kp2 = KeyPath.ForExpression<Person>(p => p.Name); KeyPathsCollection kpc; //Equivalent declarations kpc = KeyPathsCollection.Of("Email", "Name"); kpc = KeyPathsCollection.Of<Person>(p => p.Email, p => p.Name); kpc = new List<KeyPath> {"Email", "Name"}; kpc = new List<KeyPath> {kp1, kp2}; query.SubscribeForNotifications(NotificationCallback, kpc);
(PR # 3501 )
- 使用
添加了
MongoClient.GetCollection<T>
方法以从 MongoDB 获取可在 Realm 对象中反序列化的文档集合。 此方法的工作方式与MongoClient.GetDatabase(dbName).GetCollection(collectionName)
相同,但数据库名称和集合名称会自动从 Realm 对象类派生。 # 3414使用 >、>=、<、<= 操作符提高对非链接 属性的 RQL( )
.Filter()
stringstring 查询的性能,并修复了以下行为:空 应被评估为小于所有内容,以前空字符串不匹配。(核心13.27.0 )将捆绑的 OpenSSL 版本更新为3.2.0 。 (核心13.27.0 )
十进制128属性的存储已经过优化,因此各个值将根据需要占用0位(如果均为空值)、 32位、 64位或128位。 (核心14.0.0 )
在RQL (
Filter()
) 查询中添加对集合索引的支持。 示例:var people = realm.All<Person>(); //People whose first dog is called "Fluffy" var query1 = people.Filter("ListOfDogs[FIRST].Name = $0", "Fluffy") //People whose last dog is called "Fluffy" var query2 = people.Filter("ListOfDogs[LAST].Name = $0", "Fluffy") //People whose second dog is called "Fluffy" var query3 = people.Filter("ListOfDogs[2].Name = $0", "Fluffy") //People that have a dog called "Fluffy" var query4 = people.Filter("ListOfDogs[*].Name = $0", "Fluffy") //People that have 3 dogs var query5 = people.Filter("ListOfDogs[SIZE] = $0", 3)
(核心14.0.0 )
添加了对索引
RealmValue
属性的支持。 (PR # 3544 )将具有复杂模式和非常简单的更改处理的对象通知器的性能提高多达20 %。 (核心14.2.0 )
使用大量通知程序将性能提高75 %。 (核心14.2.0 )
提高在页面大小大于4 k 的平台(示例arm 64 Apple 平台)上针对大小小于256页面的文件的文件压实性能。 (核心14.4.0 )
AppConfiguration
中的默认基本 URL 已更新为指向services.cloud.mongodb.com
。 请参阅https://www.mongodb.com/zh-cn/docs/atlas/app-services/domain-migration/ 以了解更多信息。 (问题# 3551 )
固定
- 修复了
indexed_property == NONE {x}
等 RQL (.Filter()
) 查询,这些查询错误地仅匹配 x 而不是 x。 这仅适用于具有等值(== 或 IN)的索引属性与列表中的NONE
匹配的情况。 如果常量列表包含多个值,那么它可以正常工作。 (核心13.27.0 ) - 上传在客户端自动重置恢复期间恢复的变更集可能会导致“服务器版本错误”错误和新的客户端重置。 (核心13.27.0 )
- 修复使用无匹配项的前缀搜索时全文索引崩溃的问题。 (核心13.27.0 )
- 修复了同步会话启动期间因断言
failed: m_initiated
而导致的崩溃。 (核心13.27.0 ) - 修复了一个 TSAN 违规问题,即用户线程可能会与同步事件循环争用读取 m_finalized。 (核心13.27.0 )
- 修复在客户端重置之前备份Realm文件时出现的轻微争用情况,该情况可能导致覆盖现有文件。 (核心13.27.0 )
- 集合被清除时为 true 的布尔属性
ChangeSet.IsCleared
现在也会为IDictionary
引发,将其与ISet
和IList
对齐。 (核心14.0.0 ) - 修复对带有索引的
RealmValue
属性的相等查询。 (核心14.0.0 ) - 修复了当超过8388606个链接指向特定对象时可能发生的崩溃。
- 修复了在
IDictionary
中查询NULL
值时出现的错误结果。 (核心14.0.0 ) - 由于排序顺序差异,在非 Apple ARM 64设备上生成并复制到另一个平台(反之亦然)的Realm是不可移植的。 这会影响第一个差异为非 ASCII 字符的字符串或二进制文件。 如果字符串具有很长的公共前缀(> 200字符),则可能在设立或索引列中找不到这些项目。 (核心14.0.0 )
- 修复了从 LnkLst 中删除项目时的问题,该问题可能导致无效链接变为可见链接,从而在稍后访问这些列表项时导致崩溃或异常。 这会影响同步Realm,在该同步 Realm 中,另一个客户端先前已删除了链接列表中超过1000个链接的链接,然后从同一列表中进一步进行本地删除导致该列表中的项目数少于1000个。 (核心14.2.0 )
- 修复与进程退出时在后台线程上打开 Realm 相关的虚假崩溃。 (核心14.3.0 )
- 修复离线时使用缓存用户打开 Realm 会导致致命错误的问题,并且会话不会重试连接。 (核心14.4.0 )
- 修复断言失败“m_lock_info && m_lock_info->m_file.get_path() == m_filename”,该失败似乎与在另一个线程上关闭文件时打开 Realm 有关。 (核心14.5.0 )
- 修复了设置默认空值(包括嵌入式对象)时由于复制代码中的错误而导致的历史记录偏差。 (核心14.5.0 )
- 注销和未执行异步提交回调时可能会触发空指针异常。 (核心14.5.0 )
兼容性
- Realm Studio: 15.0.0或更高版本。
内部资料
- 使用 Core 14.5.1 。
11.7.0 ( 2024 - 02 - 05 )
增强功能
- 现在,在提交未上传的本地更改后,从服务器下载变更集时,自动客户端重置恢复可以更好地恢复更改。 如果在客户端重置之前本地 Realm 恰好与服务器完全同步,则自动恢复现在应始终生成完全相同的状态,就好像不涉及客户端重置一样。 (核心13.24.1 )
- 现在,将向用户显示引导应用程序期间引发的异常,而不是使用未处理的异常来终止程序。 (核心13.25.0 )
- 允许在
Realm.Filter()
查询中对string常量使用>
、>=
、<
、<=
操作符。 这是区分大小写的字典顺序比较。 提高了使用RQL.Filter()
string>、>=、<、<= 操作符对非链接 属性进行 ()string 查询的性能,并修复了以下行为:空 应被评估为小于所有值,以前空字符串不匹配。(核心13.26.0 - 14 -gdf 25 f) Session.GetProgressObservable
现在可与 Flexible Sync 一起使用。 (问题# 3478 )
固定
- 在恢复对列表进行不可恢复更改的写入时,自动客户端重置恢复会在列表中重复插入(即 修改或删除预先存在的条目),然后是订阅更改,最后是向列表中添加条目的写入。 (核心13.24.0 )
- 在客户端重置恢复期间,链接集可能会丢失项目,或者可能引发阻止恢复的异常。 (核心13.24.0 )
- 在客户端通过恢复进行重置期间,当恢复对
IList<RealmObject>
或IList<RealmValue>
的移动或设置操作时,如果操作的索引也未添加到恢复中,则指向已在离线状态下被另一个客户端删除的对象的链接将为由恢复的客户端重新创建。 但这些链接的对象只会填充主键,所有其他字段均为默认值。 现在,正在恢复的列表不会创建这些僵尸对象,而是会跳过此类已删除的链接。 (核心13.24.0 ) - 在基于分区的同步Realm 上重新应用本地更改以进行客户端重置恢复时遇到错误,会导致客户端重置尝试未被记录,并可能导致尝试自动恢复客户端重置但失败的无限循环。 (核心13.24.0 )
- 如果本地时钟滞后于2015 - 01 - 01 T 00 : 00 : 00 Z,则变更集的时间戳错误。 现在,如果发生这种情况,同步客户端会引发异常。 (核心13.24.1 )
- 如果灵活同步Realm的首次打开触发了客户端重置,则该配置在重置回调之前和之后都有一个初始订阅回调,并且该初始订阅回调开始一个读取事务而不结束该事务(这通常是情况下),为重置后回调打开冻结的Realm会trigger BadVersion 异常。 (核心13.24.1 )
- 灵活同步Realm 上的自动客户端重置恢复将在多个写入事务中应用已恢复的更改,从而释放其间的写锁(write lock)。 (核心13.24.1 )
- 长度为57的类名会导致客户端重置崩溃,因为56的限制执行错误。 (核心13.24.1 )
- Realm修复了导致“解密失败”异常的几个原因,在使用 Apple/Linux 并将 Realm 存储在 exFAT 文件系统上时,在同一进程中打开多个加密的 文件时可能会出现这些异常。(核心13.24.1 )
- 修复了几个可能导致同步客户端崩溃的错误。 (核心13.25.0 )
- 涉及许多反向链接的初始同步下载性能不佳。 (核心13.25.1 )
- 将 System.Net.Security 的最低版本明确提高到4.3.2 ,因为4.3.0已被标记为易受攻击的(更多详细信息,请参阅NuGet 页面上的弃用通知)。
- 使用 posix_fallocate() 和回退以手动占用空间时处理 EOPNOTSUPP。 这启用Android 用户能够在限制性文件系统上打开Realm 。 (核心13.26.0 )
- 当下载消息被误认为是引导消息时,应用程序可能会崩溃,并传入传入_changesets.size() != 0 。 如果在特定时间暂停并恢复同步会话,则可能会发生这种情况。 (核心13.26.0 )
- 修复在 ARMv 7 Linux (酷睿13.26.0 )上缺少符号(例如
__atomic_is_lock_free
)的错误 - 上传在客户端自动重置恢复期间恢复的变更集可能会导致“服务器版本错误”错误和新的客户端重置。 (核心13.26.0 - 14 -gdf 25 f)
- 修复在订阅失败后注册订阅更改通知时,错误原因string中的无效数据的问题。 (核心13.26.0 - 14 -gdf 25 f)
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core v 13.26.0 - 14 -gdf 25 f.
11.6.1 ( 2023 - 11 - 17 )
固定
- 修复如果会话在引导期间中断,则 FLX 订阅不会发送到服务器的问题。 (核心13.23.3 )
- 修复了以下问题:如果在提交订阅之后但在同步客户端检查新订阅之前立即发送上传消息,则无法将 FLX 订阅发送到服务器。 (核心13.23.3 )
- 修复了当客户端重置后订阅标记为完成时,应用程序崩溃并出现“KeyNotFound”异常的问题。 (核心13.23.3 )
- 在 FLX Realm 上重置 DiscardLocal 客户端期间的特定时间发生崩溃可能会使订阅处于无效状态。 (核心13.23.4 )
- 修复了在开发模式使用自动客户端重置和恢复来恢复离线时在本地进行的模式更改时出现的错误“模式更改无效(上传):无法进程不存在的表的 AddColumn 指令”。 (核心13.23.4 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.23.4 。
11.6.0 ( 2023 - 11 - 03 )
增强功能
添加了
App.EmailPasswordAuth.RetryCustomConfirmationAsync
方法,以便能够在服务器上对给定电子邮件再次运行确认函数。 (问题# 3463 )添加了
User.Changed
事件,该事件可用于通知订阅者有关用户的某些内容发生了变化 - 通常是用户状态或访问权限令牌。 (问题# 3429 )添加了对自定义应用于Realm模型的某些生成属性的忽略属性的支持。 配置选项称为
realm.custom_ignore_attribute
,可以在全局配置文件中设立(有关全局配置文件的更多信息,请参阅.NET文档)。 Realm生成器会将其视为不透明的string ,并将其附加到已应用于这些成员的IgnoreDataMember
和XmlIgnore
属性中。 除非将属性所在的命名空间添加到全局 usings文件中,否则属性必须是完全限定的。 示例,以下是从System.Text.Json
添加JsonIgnore
的方法:realm.custom_ignore_attribute = [System.Text.Json.Serialization.JsonIgnore]
(问题# 2579 )
现在,如果在属性初始化器或构造函数中将模型类中的集合分配给非空值,Realm 源生成器将出错。 Realm 集合在内部初始化,不支持为属性分配非空值,其中
null!
分配仅用于静默可空引用类型警告,实际上,集合永远不会为空。 (问题# 3455 )使用
AppConfiguration.UseManagedWebSockets = true
时,WebSocket 错误日志记录更加详细。 # 3459
固定
- 添加了当将基于接口的 Realm 类与低于8.0的语言版本一起使用时会引发的错误。 同时,在生成的代码中删除了
not
的使用,以使其与最低 C# 版本的8.0兼容。 (问题# 3265 ) - 使用多个身份验证提供程序登录单个用户会为每个身份验证提供商程序创建一个单独的 SyncUser。 这在大多数情况下有效,但有一些问题:
- 同步会话不一定与用于创建同步会话的特定 SyncUser 相关联。 因此,查询用户的会话可能会给出不正确的结果,而注销用户可能会关闭错误的会话。
- 使用2020 8 月 - 11 月 Realm 版本创建的现有本地同步 Realm 文件有时无法正确打开,只能重新下载。
- 删除其中一个 SyncUsers 将删除该用户的所有 SyncUsers 的所有本地 Realm 文件。
- 通过其中一个 SyncUser 删除服务器端用户会使其他 SyncUser 处于无效状态。
- 最初通过匿名登录创建,然后链接到身份的 SyncUser 仍将被视为匿名用户,并在注销时完全删除。 (核心13.21.0 )
- 如果用户在访问令牌刷新期间注销,则刷新完成会将用户标记为已再次登录,并且用户将处于不一致状态(核心13.21.0 )。
- 如果查询的地理空间数据集包含某些类型属性设立为“Point”(不区分大小写)以外的对象的对象,则会引发异常。 现在,这些对象不会中断查询,而是会被忽略。 (核心13.21.0 )
- 从服务器收到 write_not_allowed 错误会导致崩溃。 (核心13.22.0 )
- 更新订阅不会trigger Realm自动刷新,这有时会导致异步刷新挂起,直到其他操作执行另一次写入为止。 (核心13.23.1 )
- 修复并发 Realm 文件访问的进程间锁定,导致 FAT 32 /exFAT 文件系统上出现进程间死锁。 (核心13.23.1 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.23.1 。
11.5.0 ( 2023 - 09 - 15 )
增强功能
- 简化了
SessionException
中报告的一些错误代码。 一些错误代码已合并,其中一些错误代码已被弃用,因为服务器不再报告这些错误代码。 (问题# 3295 ) - Full Text Search仅支持搜索前缀。 例如。 “description TEXT 'alex*'”。 (核心13.18.0 )
- 如果同时收到有效的错误操作,则从 Atlas Device Sync 收到的未知协议错误将不再导致应用程序崩溃。 未知错误操作将被视为 ApplicationBug 错误操作,并将通过同步错误处理程序导致同步失败并显示错误。 (核心13.18.0 )
- 添加了对由同步协议版本10启用的服务器日志消息的支持。 在未来的服务器发布中,将在服务器日志消息中提供 Appservices请求ID。 (核心13.19.0 )
固定
- 修复尝试使用动态 API 访问不存在的属性时抛出
MissingMemberException
的消息。 (PR # 3432 ) - 修复了使用 .NET Native 时出现的
Cannot marshal generic Windows Runtime types with a non Windows Runtime type as a generic type argument
构建错误。 (问题# 3434 ,自11.4.0起) - 修复未知应用服务器错误的断言失败问题。 (核心13.17.2 )
- 对字典中的 @keys 运行查询会引发异常。 (核心13.17.2 )
- 修复了 tab 分配器 (
Assertion failed: ref + size <= next->first
) 中的崩溃。 (核心13.20.1 ) - 发送空的 UPLOAD 消息可能会导致“服务器版本错误”错误和客户端重置。 (核心13.20.1 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.20.1 。
11.4.0 ( 2023 - 08 - 16 )
增强功能
- 添加了
IQueryable.SubscribeAsync
API作为使用SubscriptionSet.Add
的简写。 它是一种语法糖,可大致翻译为:
它提供了一个参数来控制是每次等待同步还是仅在第一次添加订阅时等待,以及取消令牌支持。 (PR # 3403 )realm.Subscriptions.Update(() => { realm.Subscriptions.Add(query); }); await realm.Subscriptions.WaitForSynchronization(); // This can now be expressed as await query.SubscribeAsync();
- 向
Session.WaitForDownloadAsync/WaitForUploadAsync
添加了可选的cancellationToken
参数。 (PR # 3403 ) - 向
SubscriptionSet.WaitForSynchronization
添加了可选的cancellationToken
参数。 (PR # 3403 ) - 修复了流媒体格式上罕见的文件损坏问题(通常在压缩、转换或复制到新文件后)。 (核心13.17.1 )
- 尝试搜索因附加模式更改而创建的全文索引(即 应用本地模式和同步 Realm模式之间的差异)可能会导致 IllegalOperation 错误,错误代码为
Column has no fulltext index
。 (核心13.17.1 ) - 来自服务器状态的下载消息的同步进度更新错误。 这可能导致与服务器之间的额外往返。 (核心13.17.1 )
- 添加了使用托管WebSocket (
System.Net.WebSockets.ClientWebSocket
) 而不是 Realm内置WebSocket客户端来处理同步流量的选项。 托管 WebSocket 改进了对需要身份验证的代理和防火墙的支持。 此功能目前可选择加入,可以通过将AppConfiguration.UseManagedWebSockets
设置为 true 来启用。 托管 WebSocket 将成为未来版本的默认。 ( PR # 3412 )。 - 修复了即使有
realm.SyncSession.PropertyChanged
的订阅者也会使realm.SyncSession
被垃圾收集的问题。
固定
- 修复了取消异步写入事务和关闭 Realm 文件之间的争用条件,该争用条件可能导致引发
ObjectDisposedException : Safe handle has been closed
。 ( PR # 3400 ) - 修复了在
Realm.RefreshAsync
引发异常的极少数情况下,该异常将被忽略并返回false
的问题。 ( PR # 3400 ) - 修复了
SubscriptionSet.Find
的可空性注释,以正确指示如果订阅集中不存在该订阅,则返回null
。 (PR # 3403 ) - 修复了以下问题:使用重新映射的属性执行
Filter
查询仅适用于原生名称,而非托管名称。 现在两者都可以工作 - 例如:
(问题# 3149 )partial class MyModel : IRealmObject { [MapTo("Bar")] public int Foo { get; set; } } // Both of these are valid now realm.All<MyModel>().Filter("Foo > 5"); realm.All<MyModel>().Filter("Bar > 5");
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.17.1
11.3.0 ( 2023 - 07 - 26 )
重大更改
AppConfiguration.LocalAppName
和AppConfiguration.LocalAppVersion
已弃用,并将在未来版本中删除。 它们从未产生过影响,因为 SDK 提供的值从未发送到服务器。 (PR # 3387 )
增强功能
- 添加了
App.BaseFilePath
、App.BaseUri
和App.Id
属性,这些属性返回AppConfiguration
中提供的值。 (PR # 3385 ) - 添加了
AppConfiguration.UseAppCache
属性,用于控制是否应缓存从App.Create
返回的App
实例。 一般建议不要设置(即 保留默认值true
),但这在编写单元测试时非常有用。 (问题# 3382 )。
固定
- 修复了在执行
Realm.GetInstanceAsync
操作时重新加载域会导致 Unity 编辑器崩溃的问题。 (问题# 3344 ) - 修复了
App.Equals
和App.GetHashCode
的实现,以返回正确的结果,尤其是在缓存App
实例时。 (PR # 3385 ) - 修复了以下问题:在 Unity 上针对 Android 进行构建时会失败,并显示“无法分析用户的程序集。 未将对象引用设置为对象的实例”。 (问题# 3380 )
- GeoBox 现在只是等效 GeoPolygon 的快捷方式。 这提供了一致的查询结果和错误检查。 (核心13.15.2 )
- 修复了几个极端情况(例如 两极),其中无效点与 geoWithin查询匹配。 (核心13.15.2 )
- 修复了在异步打开和客户端重置期间,如果属性已添加到模式的错误。 如果使用异步打开,则此修复适用于 PBS 到 FLX 的迁移。 (核心13.16.1 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.17.0
11.2.0 ( 2023 - 07 - 07 )
增强功能
- 为地理空间类型构造函数添加了验证检查。 这意味着现在在构造无效的地理空间形状时(而不是在查询中使用它时)会引发异常。 (PR # 3362 )
- 在非空类型集合上调用
IndexOf(null)
时放宽了一些验证。 以前,这会抛出ArgumentNullException
,而现在它将返回-1
。 这对于数据绑定场景特别有用,在这些场景中,绑定引擎可能会将其作为IndexOf(SelectedItem)
进行调用,而当SelectedItem
为null
时,这会引发异常。 (PR # 3369 ) - 更改了
RealmSet.IndexOf
实施,以返回实际结果,而不是抛出NotSupportedException
。 持久化集合的顺序仍然是不确定的,但在写入事务之间是稳定的。 同样,这对于将设立作为绑定上下文传递给集合控件的数据绑定场景非常有用。 (PR # 3369 )
固定
- 修复了Unity 上的 上的一个问题:当汇入器Windows triggerWindows打开过多的终端 时。(问题 [ 3364 ] 域3364 )
- 修复了在 Unity on CI 上编织失败并出现以下错误的问题:
Could not analyze the user's assembly. Cannot access a closed Stream.
。 (问题 [ 3364 ]https://github.com/realm/realm-dotnet/issues/ 3364 ) - 修复了以批处理模式在Unity上编写类时出现的
NullReferenceException
问题。 (问题# 3363 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.15.0
11.1.2 ( 2023 - 06 - 20 )
固定
- 修复了一个命名空间问题,该问题会导致Maui Android 项目由于
'Realm' is a namespace but is used like a type
而无法构建。 (问题# 3351 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.15.0
11.1.1 ( 2023 - 06 - 19 )
固定
- 修复了一个命名空间问题,该问题会导致 Unity 项目由于
'Realm' is a namespace but is used like a type
而无法构建。 (问题# 3351 ) - 改进了在非持久化属性上添加 Realm 属性时的警告消息。 (问题# 3352 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.15.0 。
11.1.0 ( 2023 - 06 - 17 )
增强功能
- 弃用
Realm.SourceGenerator
和Realm.Fody
包。 源生成和编织程序集现在包含在主Realm
包中。 对于仅引用Realm
包的用户来说,这应该是一个透明的更改,但如果您显式添加了对Realm.SourceGenerator
或Realm.Fody
的包引用,则应将其删除。 (PR # 3319 ) - 通过复制多个父项引用的对象以及删除“孤立”对象,自动处理
RealmObject
->EmbeddedObject
迁移。 (问题# 2408 ) - 现在可以在写事务中注册新的通知程序,直到在写事务中实际进行更改为止。 这样一来,新的通知就可以在开始写事务时触发的变更通知中注册(除非之前的回调执行了写入操作)。 (核心13.10.1 )
- 如果服务器已迁移到Flexible Sync,则此版本正式支持基于分区到Flexible Sync的迁移,即如果服务器已迁移到Flexible Sync,则将使用基于分区的同步的客户端应用程序在幕后迁移为使用Flexible Sync。 任何使用旧版本 Realm(包括在 Core 11.0.0中发布的原始支持)的客户端在尝试与应用同步时都会收到“切换到灵活同步”错误消息。 (核心13.11.0 )
- 支持基于字典中的值进行排序/区分,例如
.Filter("TRUEPREDICATE SORT(meta['age'])")
。 (核心13.14.0 ) - 添加了对点地理空间查询的初始支持。 (问题# 3299 )
- 在此版本中,仅支持“此点是否包含在此形状中”(相当于 MongoDB 中的$geoWithin )形式的查询。
- 目前没有索引支持。
- 持久化地理空间点没有专用的类型。 相反,点应存储为 GeoJson 形状的嵌入式对象,并且查询将使用鸭子类型来检查形状是否包含对象。 为方便起见,下面是一个示例嵌入式对象,您可以使用它来代替 Realm 提供的专用类型:
public partial class Location : IEmbeddedObject { // The coordinates and type properties are mandatory but may be private. // You can add more fields if necessary - those will be ignored when doing // geospatial queries. [MapTo("coordinates")] private IList<double> Coordinates { get; } = null!; [MapTo("type")] private string Type { get; set; } = "Point"; public double Latitude => Coordinates.Count > 1 ? Coordinates[1] : throw new Exception($"Invalid coordinate array. Expected at least 2 elements, but got: {Coordinates.Count}"); public double Longitude => Coordinates.Count > 1 ? Coordinates[0] : throw new Exception($"Invalid coordinate array. Expected at least 2 elements, but got: {Coordinates.Count}"); public Location(double latitude, double longitude) { // According to the GeoJson spec, longitude must come first in the // coordinates array. Coordinates.Add(longitude); Coordinates.Add(latitude); } } // Example usage public partial class Company : IRealmObject { public Location Location { get; set; } }
- 添加了三种新的形状类型和一种辅助点类型,以便您检查包含情况:
GeoPoint
:其他形状类型的构建区块- 它不能用作模型上的属性类型,仅用于构造其他形状类型。 它可以从纬度和经度的值元组隐式构造:var point = new GeoPoint(latitude: 12.345, longitude: 67.890); var point = (12.345, 67.890);
GeoCircle
:表示由圆心和半径构成的球体上的圆的形状:var circle = new GeoCircle(center: (12.34, 56.78), radius: 10); // radius in radians var circle = new GeoCircle((12.34, 56.78), Distance.FromKilometers(10));
GeoBox
:表示由左下角和右上角构造的球体上的长方体的形状:var box = new GeoBox((12.34, 56.78), (15.34, 59.78));
GeoPolygon
:由外环和可选孔构成的任意多边形:var polygon = new GeoPolygon((10, 10), (20, 20), (0, 20), (10, 10)); // a triangle with no holes var outerRing = new GeoPoint[] { (10, 10), (20, 20), (0, 20), (10, 10) }; var hole1 = new GeoPoint[] { (1, 1), (2, 2), (0, 2), (1, 1) }; var hole2 = new GeoPoint[] { (5, 5), (6, 6), (4, 6), (5, 5) }; var polygon = new GeoPolygon(outerRing, hole1, hole2); // A triangle with two smaller triangular holes
- 可以通过 LINQ 或 RQL 完成查询:
var matches = realm.All<Company>().Where(c => QueryMethods.GeoWithin(c.Location, circle)); var matches = realm.All<Company>().Filter("Location GEOWITHIN $0", circle);
- 支持基于字典中的值进行排序/区分,例如
realm.All<MyModel>().Filter("TRUEPREDICATE SORT(meta['age'])")
。 (核心13.14.0 ) - 修复在客户端重置期间无法下载新的 FLX 域后打开域时可能出现的崩溃问题。 (核心13.14.0 )
固定
- 修复了客户端重置(或自动 PBS 到 FLX迁移)期间的致命错误(报告给同步错误处理程序),前提是在异步打开期间触发了重置,并且正在应用的模式添加了新类。 (核心13.11.0 )
- Full Text Search有时会找到仅与Atlas Search词元开头匹配的单词。 (核心13.11.0 )
- 如果前向链接由于损坏而没有相应的反向链接链接,则在删除反向链接时可能会崩溃。 现在,我们默默地忽略发布版本中的这种不一致,允许应用继续运行。 (核心13.12.0 )
IDictionary<string, IRealmObject?>
会公开未解析的链接,而不是将其映射到 null。 除了允许从字典中读取无效对象之外,这还导致对字典的查询有时会产生不正确的结果。 (核心13.12.0 )- Websocket 的访问令牌刷新未更新位置元数据。 (核心13.13.0 )
- 在同一线程或调度程序上同时使用同步和异步事务可能会导致“!realm.is_in_transaction()”断言失败 如果在同步事务期间恰好安排了异步事务的回调之一。 (核心13.13.0 )
- 修复在客户端重置期间无法下载新的 FLX 域后打开域时可能出现的崩溃问题。 (核心13.14.0 )
- 将包含嵌入式对象的属性设置为用于引发带有文本
Can't link to an embedded object that is already managed
的异常的同一嵌入式对象。 现在它是一个空操作。 (问题# 3262 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.15.0 。
- 彻底修改和扩展了 SDK 的指标集合,以更好地推动未来的开发工作。 (PR # 3209 )
11.0.0 ( 2023 - 05 - 08 )
破坏性变更 (breaking change)
- 中使用的
error
NotificationCallbackDelegate
和 中的DictionaryNotificationCallbackDelegate
*collection*.SubscribeForNotifications
参数已删除。它已很长时间未使用,因为对数据库的内部更改使得在通知回调期间不可能发生错误。 (问题# 3014 ) - 已删除
RealmObjectBase.GetBacklinks
- 应使用RealmObjectBase.DynamicApi.GetBacklinksFromType
。 (问题# 2391 ) - 删除了
Realm.DynamicApi.CreateObject(string, object)
并将其替换为更专业的重载:RealmObjectBase.DynamicApi.CreateObject(string)
可用于创建没有主键的对象。RealmObjectBase.DynamicApi.CreateObject(string, string/long?/ObjectId?/Guid?)
可用于创建具有相应类型主键的对象。
Realm.DynamicApi
公开的 API 不再返回dynamic
,而是选择返回具体类型,例如IRealmObject
、IEmbeddedObject
等。 您仍然可以通过动态 将返回的对象转换为dynamic
Go和API ,但这通常比使用基于字符串的API (例如 )性能要低,尤其是在IRealmObjectBase.DynamicApi.Get/Set
iOS或 等 AOTUnity 平台上。(问题# 2391 )- 删除了
Realm.WriteAsync(Action<Realm>)
以替换为Realm.WriteAsync(Action)
。 10.14.0中引入的新WriteAsync
方法效率更高,并且不需要在后台线程上重新打开 Realm。 虽然不建议这样做,但如果您希望获得旧行为,可以编写如下扩展方法:
(PR # 3234 )public static async Task WriteAsync(this Realm realm, Action<Realm> writeAction) { await Task.Run(() => { using var bgRealm = Realm.GetInstance(realm.Config); bgRealm.Write(() => { writeAction(bgRealm); }); }); await realm.RefreshAsync(); }
- 已删除
InMemoryConfiguration.EncryptionKey
。 加密内存中的 Realm 是不可能的,设置该属性会导致运行时错误。 (PR # 3236 ) - 已删除
SyncConfiguration
- 请改用PartitionSyncConfiguration
或FlexibleSyncConfiguration
。 (PR # 3237 ) - 已删除
Realm.GetSession
- 请改用Realm.SyncSession
。 (PR # 3237 ) - 已删除
DiscardLocalResetHandler
- 请改用DiscardUnsyncedChangedHandler
。 (PR # 3237 ) - 已删除
Session.SimulateClientReset
扩展。 这些方法不能与自动重置处理程序一起使用,而且与其说有用,不如说令人困惑。 (PR # 3237 ) - 已删除
AppConfiguration.CustomLogger
和AppConfiguration.LogLevel
— 请改用Logger.Default
和Logger.LogLevel
。 (PR # 3238 ) - 已删除
RealmConfigurationBase.ObjectClasses
- 请改用RealmConfigurationBase.Schema
。 (PR # 3240 ) - 已删除
ObjectSchema.IsEmbedded
- 请改用ObjectSchema.BaseType
。 (PR # 3240 ) - 已删除
ObjectSchema.Builder.IsEmbedded
- 请改用ObjectSchema.Builder.RealmSchemaType
。 (PR # 3240 ) - 已删除
ObjectSchema.Builder(string name, bool isEmbedded = false)
- 请改用Builder(string name, ObjectSchemaType schemaType)
。 (PR # 3240 ) - 已删除
RealmSchema.Find
- 请改用RealmSchema.TryFindObjectSchema
。 (PR # 3240 ) - 删除了
User.GetPushClient
,因为它已在 Atlas App Services 中弃用 - 请参阅https://www.mongodb.com/zh-cn/docs/atlas/app-services/reference/push-notifications/ 。 (PR # 3241 ) - 已删除
SyncSession.Error
事件- 在打开Realm时使用SyncConfigurationBase.OnSessionError
来代替。 (PR # 3241 ) - 删除了
ManualRecoveryHandler
的无参数构造函数 - 使用接受回调的构造函数。 (PR # 3241 ) RealmValue.AsString
现在,如果该值包含null
,则会抛出异常。 如果要获取可为 null 的string ,请使用AsNullableString
。 (PR # 3245 )RealmValue.AsData
现在,如果该值包含null
,则会抛出异常。 如果要获取可为 null 的byte[]
,请使用AsNullableData
。 (PR # 3245 )RealmValue.AsRealmObject
现在,如果该值包含null
,则会抛出异常。 如果要获取可为 null 的string ,请使用AsNullableRealmObject
。 (PR # 3245 )Realm.SyncSession
现在,如果未使用PartitionSyncConfiguration
或FlexibleSyncConfiguration
打开Realm ,现在会抛出错误 - 在它过去会返回null
之前。 (PR # 3245 )Realm.Subscriptions
现在,如果 Realm 不是使用FlexibleSyncConfiguration
打开的,则会抛出错误 - 之前它会返回null
。 (PR # 3245 )- 删除了
PermissionDeniedException
,因为它已无法再获取。 (问题# 3272 ) - 从
ErrorCode
枚举中删除了一些过时的错误代码。 所有删除的代码均已过时,服务器不再发出。 (PR 3273 ) - 删除了
IncompatibleSyncedFileException
,因为它已无法再获取。 (问题# 3167 ) Realms.Schema.Property
API 现在使用IndexType
而不是布尔值来指示属性是否已编制索引。 (问题# 3281 )StringExtensions
(Like
、Contains
)中的扩展方法现已弃用。 请改用QueryMethods
中相同的内容 - 例如realm.All<Foo>().Where(f => f.Name.Like("Mic*l"))
需要像realm.All<Foo>().Where(f => QueryMethods.Like(f.Name, "Mic*l"))
一样进行重写。
增强功能
- 为 Realm 程序集添加了可空性注释。 现在,返回引用类型的方法可以正确注释,以指示返回值是否可以为空。 (问题# 3248 )
- 替换索引处的值(即
myList[1] = someObj
)现在将通过Replace
动作正确引发CollectionChange
通知。 (问题# 2854 ) - 现在可以在应用程序生命周期的任何点更改日志级别。 (PR # 3277 )
- 一些日志消息已添加到 Core数据库中。 现在将记录打开Realm或提交ACID 事务等事件。 (问题# 2910 )
- 添加了对全文Atlas Search (简单术语)查询的支持。 (问题# 3281 )
- 要启用对string属性的 FTS 查询,请添加
[Indexed(IndexType.FullText)]
属性。 - 要运行LINQ 查询,请使用
QueryMethods.FullTextSearch
:realm.All<Book>().Where(b => QueryMethods.FullTextSearch(b.Description, "fantasy novel"))
。 - 要运行
Filter
查询,请使用TEXT
操作符:realm.All<Book>().Filter("Description TEXT $0", "fantasy novel")
。
- 要启用对string属性的 FTS 查询,请添加
- 改进了以下查询的性能(核心13.8.0 ):
- 对具有索引的string /int/UUID/ ObjectId属性进行精确匹配(没有其他查询条件)的次数计数 (
IQueryable.Count()
) 时,显着 (~75%) 改进。 如果返回大量结果(重复值),这种改进将尤其明显。 - 在查询具有索引的
DateTimeOffset
属性的精确匹配项时,性能显着 (~ 99 %) 改进。 - 对具有索引的
RealmValue
属性查询不区分大小写的匹配项时,性能显着 (~ 99 %) 改进。 - 在查询具有索引的布尔属性的精确匹配项时,中等程度改进 (~ 25 %)。
- 在对没有索引的
RealmValue
属性上查询不区分大小写的匹配项时,有小幅改进 (~ 5 %)。 - 非索引
RealmValue
上的相等查询得到中等程度改进 (~ 30 %)。
- 对具有索引的string /int/UUID/ ObjectId属性进行精确匹配(没有其他查询条件)的次数计数 (
- 允许多个进程同时在加密的 Realm 上运行。 (核心13.9.0 )
- 提高进行更改后回滚写入事务的性能。 如果没有订阅任何通知事件,则现在是恒定时间,而不是与要回滚的更改数量成正比。 有通知订阅时的回滚速度提高10 - 20 %。 (核心13.9.4 )
- PBS 到 FLX 迁移,如果服务器已迁移到 Flexible 同步 ,则用于将使用基于分区的同步的客户端应用迁移为在幕后使用 Flexible 同步。 (核心13.10.0 )
固定
- 修复在多个线程上创建新Realm 文件时可能导致
The specified table name is already in use
异常的问题。 (问题# 3302 ) - 修复了一个错误,该错误可能导致数组在不同设备上的顺序不同。 某些“无效的prior_size”情况也可能得到修复。 (核心13.7.1 )
- 修复使用string操作符 (contains/like/beginswith/endswith) 或不区分大小写查询
RealmValue
属性时发生的崩溃。 (核心13.8.0 ) - 在带索引的
RealmValue
属性上查询string是否相等时,返回不区分大小写的匹配项。 例如,查询myIndexedValue == "Foo"
将错误匹配“foo”或“FOO”等值。(核心13.8.0 ) - 向非空表上的
RealmValue
属性添加索引会因断言而崩溃。 (核心13.8.0 ) SyncSession.Stop()
可以在关闭同步会话后保持对数据库打开的引用,从而阻止用户删除 Realm。 (核心13.8.0 )- 修复使用具有长 AND/OR 条件链的查询解析器时出现的Stack Overflow崩溃问题。 (核心13.9.0 )
ClientResetException.InitiateClientReset()
不再忽略尝试删除 Realm 的结果。 如果Realm
仍处于打开状态,这可能会导致客户端重置操作在 Windows 上实际失败时报告为成功。 (核心13.9.0 )- 修复了一个数据争用问题:如果一个线程提交了一个写事务,而该事务将活动版本的数量增加到了当前会话期间看到的上一个最高版本以上,而与此同时,另一个线程开始了读取操作,则读取线程可以从不再使用的版本中读取数据。有效的内存映射(Core 13.9.0 )。
- 执行类似
{1, 2, 3, ...} IN list
的查询,其中数组长度超过8且所有元素都小于列表中的某些值,程序会崩溃(Core 13.9.4 ) - 执行大量查询而不执行写入会导致内存使用量稳定增加,其中一些内存由于无界缓存而从未完全释放(Core 13.9.4 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.10.0 。
10.21.1 ( 2023 - 04 - 21 )
固定
- 修复了服务器发送 PermissionDenied 错误时发生的崩溃。 (问题# 3292 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.6.0 。
10.21.0 ( 2023 - 03 - 24 )
增强功能
- 添加了
SyncConfiguration.CancelAsyncOperationsOnNonFatalErrors
,用于控制异步操作(例如Realm.GetInstanceAsync
、Session.WaitForUploadAsync
等)是否应在发生非致命会话错误时引发异常。 (问题# 3222 ) - 添加了
AppConfiguration.SyncTimeoutOptions
,它具有一些控制同步超时的属性,例如连接超时、ping-pong 间隔等。 (问题# 3223 ) - 更新了 SDK 引发的一些异常,使其更好地与系统异常保持一致并包含更多信息,示例,现在提供无效参数时会抛出
ArgumentException
,而不是RealmException
。 (问题# 2796 ) - 添加了新的异常 -
CompensatingWriteException
,其中包含有关由于权限而被服务器撤销的写入的信息。 与其他会话错误类似,它将传递给提供的FlexibleSyncConfiguration.OnSessionError
回调。 (问题# 3258 ) - 在 .NET 应用程序中添加了对 Linux Arm/Arm 64的支持。 (问题# 721 )
固定
- 更改了Realm 软件开发工具包(Realm SDK)注册 BsonSerializer 的方式。 以前,它会通过
BsonSerializer.RegisterSerializer
不加区别地注册它们,如果您的应用使用MongoDB.Bson
包并为DateTimeOffset
、decimal
或Guid
定义了自己的序列化器,则会发生冲突。 现在,注册通过BsonSerializer.RegisterSerializationProvider
进行,这意味着 SDK 使用的默认序列化器可以通过在实例化序列化器之前的任何点调用BsonSerializer.RegisterSerializer
或在创建 App/打开Realm之后调用BsonSerializer.RegisterSerializationProvider
来覆盖。 (问题# 3225 ) - 使用具有 unicode 参数的查询创建订阅会导致服务器错误。 (核心13.6.0 )
- 修复了 Unity 2022及更高版本中可能导致构建失败并出现
Specified method is not supported
错误的问题。 (问题# 3306 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.6.0 。
- 将新提交推送到 PR 时取消现有构建。 (PR # 3260 )
10.20.0 ( 2023 - 02 - 10 )
文件格式版本已提高。 旧文件将自动升级,但无法降级,也无法使用旧版本的.NET SDK打开。
重大更改
User.GetPushClient
已弃用,因为它很快就会在服务器上被禁用。 (问题# 3073 )
增强功能
如果不再需要较大的 Realm 文件,则 Realm 文件将缩小。 (核心13.0.0 )
由于版本固定导致的大部分文件增长都已消除。 (核心13.0.0 )
提高已持有该版本的读锁时获取读锁的性能。 这加快了许多与变更通知相关的操作,尤其是刷新已注册变更通知程序的 Realm。 (核心13.2.0 )
将 OpenSSL 从1.1.1升级到3.0.7 。 (核心13.2.0 )
现在支持将 Flexible 同步 Realm 转换为捆绑 Realm 和本地 Realm(核心13.2.0 )
为源生成的类添加对嵌套类的支持。 (问题# 3031 )
增强了对源生成类的模型定义中可为 null 的引用类型的支持。 这样,当可空上下文处于活动状态时,照常使用域模型,并且无需使用
Required
属性来指示必需的属性,因为此信息将直接从可空性状态中推断出来。 关于链接到域对象的属性的可空性,有一些注意事项:- 链接到单个 Realm 对象的属性本质上可为 null,因此必须将类型定义为可为 null。
- 列表、集和反向链接不能包含空对象,因此类型参数必须是不可为空的。
- 字典可以包含 null 值,因此类型参数必须可为 null。
使用与此处概述不同的可空性注释定义属性会引发诊断错误。 例如:
public partial class Person: IRealmObject { //Single values public Dog? MyDog { get; set; } //Correct public Dog MyDog { get; set; } //Error //List public IList<Dog> MyDogs { get; } //Correct public IList<Dog?> MyDogs { get; } //Error //Set public ISet<Dog> MyDogs { get; } //Correct public ISet<Dog?> MyDogs { get; } //Error //Dictionary public IDictionary<string, Dog?> MyDogs { get; } //Correct public IDictionary<string, Dog> MyDogs { get; } //Error //Backlink [Realms.Backlink("...")] public IQueryable<Dog> MyDogs { get; } //Correct [Realms.Backlink("...")] public IQueryable<Dog?> MyDogs { get; } //Error }
我们意识到,一些开发者仍然希望在此类属性的可空性注释方面有更大的自由度,可以通过在全局配置文件中设置
realm.ignore_objects_nullability = true
来实现这一目的(有关全局配置文件的更多信息,请参阅.NET文档)。 如果启用,则之前的所有属性都将被视为有效,并且链接到对象的属性的可空性注释将被忽略。改进了
PropertyChanged
和CollectionChanged
通知的性能。 (问题# 3112 )在Xamarin / Maui和Unity应用程序中添加了对 tvOS 的支持。 (问题# 3161 )
提高
Realm.Freeze()
的性能。 (核心13.3.0 )
固定
ISet<RealmValue>
将string和二进制数据视为等效。 如果从string 插入具有相同内容的Atlas 和一些二进制数据,则可能会导致客户端与服务器不一致。(核心13.0.0 )- 修复可能导致崩溃的查询错误断言错误。 (核心13.1.0 )
- 修复了无法在页面大小大于生成文件的设备上打开加密文件的问题。 (核心13.1.1 )
- 修复了同步客户端中可能出现的 segfault,其中异步回调在释放后使用对象(Core 13.2.0 )
- 修复了对单个订阅(核心13.2.0 )使用客户端重置与恢复和灵活同步时的崩溃问题
- 当模型的属性不受支持时,添加了更具描述性的错误消息。 现在,它会建议目标类型可能需要从
RealmObject
继承。 (问题# 3162 ) - 现在,在活动ACID 事务运行时处置Realm 实例将正确回滚ACID 事务。 (问题# 2924 )
- 修复了以下问题:当修改集合内容时,即使未替换集合本身,也会针对集合属性传递
PropertyChanged
通知。 (问题# 3112 ) - 修复在Unity上编入程序集可能导致
System.InvalidOperationException
的问题。 (问题# 3199 ) Session.Stop
现在将正确地让会话保持停止状态,直到调用Session.Start
。 以前,即使没有明确请求,在许多情况下也可能导致会话恢复。 (核心13.3.0 )- 当使用带恢复的客户端重置并且恢复实际上不会导致任何新的本地提交时,同步客户端可能会陷入以下循环:客户端重置期间发生致命错误:'A previous 'Recovery' Mode reset from
未成功,放弃“恢复”模式以防止循环”错误消息。 (核心13.3.0 ) - 修复了如果在引导期间对刚刚进入视图的对象进行写入的情况下,Flexible Sync中的历史记录会出现偏差的问题。 (核心13.3.0 )
- 修复打开缓存的冻结 Realm 时的多个数据争用问题。 新的冻结 Realm 被添加到缓存中,并在它们完全初始化之前释放锁,如果立即从另一个线程的缓存中读取它们,则会导致争用。 (核心13.3.0 )
- 如果在下载“新”Realm 时,客户端重置(带恢复)或丢弃本地中断中断,则同步客户端可能会崩溃并出现 MultpleSyncAgents 异常。 (核心13.3.0 )
- 在 FLX 引导期间从服务器发送的大于16 MB 的变更集可能会导致同步客户端崩溃并显示 LogicError。 (核心13.3.0 )
- 在 Catalyst应用和Realm Studio之间共享Realm文件无法正确同步对Realm 文件的访问权限。 (核心13.4.0 )
兼容性
- Realm Studio: 13.0.0或更高版本。
内部资料
- 使用 Core 13.4.0 。
- 更新了
DynamicRealmObjectHelper.TryGetPrimaryKeyValue
以不使用反射。 (问题# 3166 ) - 修复运行调试构建时的 UWP 测试工作流程。 (问题# 3030 )
10.19.0 ( 2023 - 01 - 06 )
增强功能
删除了 CallAsync 中参数的冗余序列化/反序列化。 (问题# 3079 )
添加了描述事务当前状态的字段
Transaction.State
。 (问题# 2551 )改进了将 null 作为参数传递给 EmailPasswordAuth.CallResetPasswordFunctionAsync 的参数时的错误消息。 (问题# 3011 )
删除了生成类属性的支持字段,这应该会对Realm对象使用的内存进行细微改进(问题# 2647 )
在
IDictionary
上添加了两个扩展方法,以获取包装字典值的IQueryable
集合:dictionary.AsRealmQueryable()
允许您从IDictionary<string, T>
获取IQueryable<T>
,然后可以将其视为常规可查询集合,并使用 LINQ 或Filter(string)
进行筛选/排序。dictionary.Filter(query, arguments)
将过滤列表并返回筛选后的字典值集合。 它大致相当于dictionary.AsRealmQueryable().Filter(query, arguments)
。
生成的可查询集合的行为与通过调用
realm.All<T>()
获得的结果相同,即它会在发生更改时发出通知并自动更新。 (问题# 2647 )通过自动恢复和将顶级表转换为嵌入式表来提高客户端重置的性能。 (核心升级)
Flexible Sync 现在将等待服务器在引导后发送所有待处理的历史记录,然后再将订阅标记为完成。 (核心升级)
略微提高了
Realm.RemoveAll()
的性能,该功能会从打开的 Realm 数据库中删除所有对象。 (问题# 2233 )改进未为 Realm 或应用配置设置 BaseFilePath 时的错误消息。 (问题2863 )
向所有Realm集合添加了
IList
实施,以支持 UWP ListView 数据绑定。 (问题# 1759 )
固定
- 修复Realm参数初始化运行两次从而导致意外行为的问题。
- 防止
IEmbeddedObject
和IAsymmetricObject
在添加到 Realm 时用作RealmValue
,并显示更有意义的错误消息。 - 如果在收到客户端重置错误和开始下载新Realm之间对加密Realm的最后一个外部引用已关闭,则修复释放后使用的问题。 (核心升级)
- 修复了在客户端重置与恢复期间,对嵌入式对象恢复列表操作时出现的断言失败问题,而该嵌入式对象在从顶级对象到列表的路径前缀中具有链接列。 (核心升级)
- 使用加密密钥打开未加密的文件有时会报告误导性的错误消息,该消息表明问题不是解密失败。 (核心升级)
- 修复了一个罕见的死锁,当同步工作线程也刚刚处理完来自服务器的变更集时,提交写事务后立即关闭同步 Realm 时可能会出现该死锁。 (核心升级)
- 修复一个争用条件,该条件可能导致将“操作已取消”错误传递给异步打开回调,而不是传递导致操作失败的实际同步错误。 (核心升级)
- 引导程序不会应用于单个写事务(write transaction)中,它们将一次应用1 MB 的变更集,或按照 SDK 的配置进行应用。 (核心升级)
- 修复 Apple 平台上的数据库损坏和加密问题。 (核心升级)
- 为源生成的文件添加了完全限定名称,以避免命名冲突。 (问题# 3099
- 修复了在绑定中使用非托管对象时会导致异常的问题(问题# 3094 )
- 修复在用户注销时获取用户配置文件会导致断言失败的问题。 (核心升级)
- 删除了“.tmp_compaction_space” 在 Windows 上压缩 Realm 后剩余的文件。 (核心升级)
- 修复了在等待
SubscriptionSet.WaitForSynchronizationAsync
时关闭同步Realm时可能发生的崩溃的问题。 (问题# 2952 ) - 如果属性的新值与当前值相同,请避免对用户界面绑定属性调用 setter。 这避免了Maui的一些问题,当 CollectionView/ListView 显示在屏幕上时,这些问题似乎不必要地调用了绑定属性的 setter。 如果该对象不属于当前用户的权限,则这是有问题的,因为它将导致补偿写入。 在某些有限的情况下,当涉及单元回收时,这可能会导致错误循环(已在iOS上验证)。 (问题# 3128 )
- 修复源生成器不会为属性初始化程序中使用的类型添加命名空间的问题。 (问题# 3135 )
- 修复了一个问题,该问题会阻止 Realm 在已关闭域重新加载的 Unity 应用程序中正常工作。 (问题# 2898 )
- 修复了在.NET 2.1 或更高版本中使用
string.Contains
时出现的错误,其中Atlas Search string不是字面量。 (问题# 3134 ) - 为一些不再使用的
ErrorCode
枚举成员添加了[Obsolete]
通知。 (问题# 3155
兼容性
- Realm Studio: 12.0.0或更高版本。
内部资料
- 使用 Core 12.13.0 。
- 将
Realm.RefreshAsync
替换为原生实施。 (PR # 2995 )
10.18.0 ( 2022 - 11 - 02 )
增强功能
引入了
Realm.SourceGenerator
,它是一个可以生成Realm模型类的源生成器。 这是我们不断实现Realm库现代化努力的一部分,并且将来可以更轻松地引入某些语言级别的功能。 为了使用源生成,需要声明模型类来实现其中一个基本接口(IRealmObject
、IEmbeddedObject
或IAsymmetricObject
),并声明为部分模型类。 示例:public partial class Person: IRealmObject { public int Age { get; set; } public string Name { get; set; } public PhoneNumber Phone { get; set; } } public partial class PhoneNumber: IEmbeddedObject { public string Number { get; set; } public string Prefix { get; set; } }
然后,源生成器将负责添加接口的完整实施。
大多数时候,将“经典” Realm模型类(从
RealmObject
、EmbeddedObject
或AsymmetricObject
派生的类)转换为使用新的源生成意味着只需将该类定义为部分类,并切换相应的基类接口实施。 经典的Realm模型定义仍然受支持,但将来会被淘汰。请注意,源生成器仍处于beta,因此如果您在使用时遇到任何问题,请告诉我们。 一些附加说明:
OnManaged
和OnPropertyChanged
现在是部分方法。- 不支持继承,因此Realm模型不能从任何其他类派生。
- 不支持嵌套类。
固定
- 修复了订阅
Session
实例上的PropertyChanged
通知时引发的 NullReferenceException,然后在取消订阅之前对该实例进行垃圾收集。 (PR # 3061 ) - 删除了 iOS 二进制文件中的位码支持,因为 App Store 提交不再接受位码。 (问题# 3059 )
- 修复了在
IEmbeddedObject
上访问父项时返回父项的问题。 (问题# 2742 ) - 为冻结集合创建枚举器时,性能略有提高并减少了分配(问题# 2815 )。
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
10.17.0 ( 2022 - 10 - 06 )
增强功能
- 优先集成本地更改而不是远程更改 — 缩短用户在提交本地更改时可能需要等待的时间。 停止在历史记录中存储下载的变更集。 (核心升级)
- 大幅提高对字典的键或值进行排序或区分的性能。 现在,最昂贵的操作执行时间复杂度为 O(log N) 次,而不是 O(N log N) 次,大型字典的排序时间减少了99 % 以上。 (核心升级)
- 无缝处理App Services应用程序部署模型的迁移。 (核心升级)
固定
- 修复同步会话关闭且应用同时销毁时出现的释放后使用问题。 (核心升级)
- 修复了只要在对象初始化之前引发异常,
RealmObjectBase
的终结器中就会出现NullReferenceException
的情况。 (问题# 3045 )
兼容性
- Realm Studio: 12.0.0或更高版本。
内部资料
- 使用 Core 12.9.0
10.16.0 ( 2022 - 10 - 03 )
增强功能
引入了适用于写入密集型工作负载的
AsymmetricObject
,此类工作负载通常非常看重性能。 这个新对象:- 从客户端到服务器单向同步数据
- 添加到 Realm 后无法查询、删除或修改
- 仅可与 Flexible 同步一起使用
- 不能是任何类型关系的接收端
- 可以包含
EmbeddedObject
,但不能链接到RealmObject
或AsymmetricObject
。
在同一写事务(write transaction)中,添加
AsymmetricObject
和RealmObject
是合法的class Measurement : AsymmetricObject { [PrimaryKey, MapTo("_id")] public Guid Id { get; private set; } = Guid.NewGuid(); public double Value { get; set; } public DataTimeOffset Timestamp { get; private set; } = DateTimeOffset.UtcNow; } class Person : RealmObject { //............ } //..... var measurement = new Measurement { Value = 9.876 }; realm.Write(() => { realm.Add(measurement); realm.Add(new Person()); }); _ = asymmetricObject.Value; // runtime error _ = realm.All<Measurement>(); // compile time error
添加了两个客户端重置处理程序
RecoverUnsyncedChangesHandler
和RecoverOrDiscardUnsyncedChangesHandler
,它们会在客户端重置时尝试自动将未同步的本地更改与远程更改合并。 具体来说,使用RecoverOrDiscardUnsyncedChangesHandler
时,如果无法按照服务器规则执行自动合并,您可以回退到丢弃本地策略。 与从现在开始DiscardUnsyncedChangesHandler
.RecoverOrDiscardUnsyncedChangesHandler
将成为默认设置相比,这两种新策略进一步简化了客户端重置事件的处理。 示例如下添加了两个客户端重置处理程序
RecoverUnsyncedChangesHandler
和RecoverOrDiscardUnsyncedChangesHandler
,它们会在事件客户端重置时尝试自动将未同步的本地更改与远程更改合并。 具体来说,使用RecoverOrDiscardUnsyncedChangesHandler
时,如果无法按照服务器规则执行自动合并,您可以回退到丢弃未同步的策略。 与从现在开始DiscardUnsyncedChangesHandler
.RecoverOrDiscardUnsyncedChangesHandler
将成为默认相比,这两种新策略进一步简化了客户端重置事件的处理。 有关上述策略的更多信息,请参阅我们的Docs页面。 其中一个新处理程序的用法示例如下:var conf = new PartitionSyncConfiguration(partition, user) { ClientResetHandler = new RecoverOrDiscardUnsyncedChangesHandler { // As always, the following callbacks are optional OnBeforeReset = (beforeFrozen) => { // executed right before a client reset is about to happen }, OnAfterRecovery = (beforeFrozen, after) => { // executed right after an automatic recovery from a client reset has completed }, OnAfterDiscard = (beforeFrozen, after) => { // executed after an automatic recovery from a client reset has failed but the DiscardUnsyncedChanges fallback has completed }, ManualResetFallback = (session, err) => { // handle the reset manually } } };
(PR # 2745 )
引入对常量列表表达式(例如
realm.All<Car>().Filter("Color IN {'blue', 'orange'}")
)的string查询支持。 这还包括对列表与列表匹配的一般查询支持,例如realm.All<Car>().Filter("NONE Features IN {'ABS', 'Seat Heating'}")
。 (核心升级)提高新Realm 文件首次连接到服务器时的性能,尤其是在离线状态下写入大量数据时。 (核心升级)
将同步工作线程上完成的更多工作移出用于应用服务器更改的写入事务,从而减少阻止其他线程写入的时间。 (核心升级)
提高同步变更集解析器的性能,从而加快应用服务器变更集的速度。 (核心升级)
固定
- 添加了每当项目未定义
[TargetFramework]
时的更有意义的错误消息。 (问题# 2843 ) - 首次使用
SyncConfiguration
打开只读Realm时不会设立模式版本,这可能会导致m_schema_version != ObjectStore::NotVersioned
断言失败。 (核心升级) - 上传完成回调(即
Session.WaitForUploadAsync
)可能在完成这些操作的下载消息完全集成之前调用。 (核心升级) - 修复了在 exFAT 驱动器上运行MacOS 时出现的异常“fcntl() with F_BARRIERFSYNC failed: In当时 (核心升级)
- 同步具有大尾数的十进制128可能会导致崩溃。 (核心升级)
Realm.Refresh()
在某些情况下实际上并未升级到最新版本。 如果存在比当前版本更新且不需要阻止的版本,则会前进到该版本,这与记录的行为相反。 (核心升级)- 修复了与通知相关的几个问题。 (核心升级)
- 修复 RealmCoordinator::m_sync_session 上的数据争用,如果多个线程同时执行Realm的初始打开,则可能会发生该数据争用。
- 如果 SyncSession 的寿命比父Realm的寿命长,然后被同一文件的新Realm采用,则其他进程不会收到对该文件进行同步写入的通知。
- 修复在 Apple 平台上的主线程上执行写入时导致 QoS 反转警告的一个原因。 现在可以通过 QoS 感知的方式等待异步通知准备就绪。
- 如果您在 Flexible Sync 中的链接上设置订阅,服务器将不知道如何处理( # 5409 ,因为 v 11.6.1 )
- 如果不区分大小写的查询搜索包含 4 字节 UTF8 字符的string ,则程序会崩溃。 (核心升级)
- 添加了验证,以防止使用Realm .Add 添加已删除的对象。 (问题# 3020 )
兼容性
- Realm Studio: 12.0.0或更高版本。
内部资料
- 使用 Core 12.7.0 。
10.15.1 ( 2022 - 08 - 08 )
固定
- 修复了10.15.0中引入的问题,该问题会阻止非匿名用户针对 Atlas App Services 进行身份验证。 (问题# 2987 )
- 为
User.ToString()
添加了覆盖项,可输出用户 ID 和提供者。 (PR # 2988 ) - 向
User
添加了 == 和 != 操作符重载,以匹配User.Equals
的行为。 (PR # 2988 )
兼容性
- Realm Studio: 12.0.0或更高版本。
内部资料
- 使用 Core 12.4.0 。
10.15.0 ( 2022 - 08 - 05 )
增强功能
- Mac Catalyst 和 预览对.NET6Maui 的支持。(PR # 2959 )
- 减少内存映射和虚拟地址空间的使用(核心升级)
固定
- 修复打开 Flexible Sync Realm(核心升级)时出现的数据争用问题。
- 修复了将
RealmObject
中的RealmValue
设置为 null 或任何其他非 RealmObject 值时缺失的反向链接删除问题。 删除目标对象时,用户可能会遇到“未找到密钥”的异常或断言失败,例如mixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type
。 (核心升级) - 修复 Windows 上没有活动同步会话时导致同步客户端 CPU 使用率过高的问题。 (核心升级)
- 改进了在 iOS 14以及内存受限或存在碎片的设备上集成具有许多小字符串(每个变更集总计 > 1024字节)的变更集时,同步客户端的性能。 (核心升级)
- 修复在 realm-apply-to-state 工具中解码保留字符串时出现的异常。 (核心升级)
- 修复在使用模拟进程间条件变量的平台(非 Android Linux以外的大多数平台)上多个线程等待写锁(write lock)时提交ACID 事务时出现的数据争用问题。 (核心升级)
- 修复某些虚拟解决空间运行的情况(视为/报告为 mmap 故障)(核心升级)
- 超过110位有效位的十进制128值未与服务器正确同步(核心升级)
兼容性
- Realm Studio: 12.0.0或更高版本。
内部资料
- 使用 Core 12.4.0 。
10.14.0 ( 2022 - 06 - 02 )
增强功能
- 为
Realm.WriteAsync
添加了更有效的替代方案。 以前的API会启动一个背景线程,在其中打开Realm并在背景线程上运行同步写事务(write transaction)。 新的API将异步获取写锁(write lock)(开始ACID 事务)并异步提交ACID 事务,但实际的写入区块将在原始线程上执行。 这意味着在区块区块使用,而无需依赖线程安全引用。 重要的是,您可以混合和匹配异步和同步调用。 在背景线程上调用任何Realm.WriteAsync
时,调用只是同步运行,因此为了便于阅读,您应该使用Realm.Write
。 新API由Realm.WriteAsync<T>(Func<T> function, CancellationToken cancellationToken)
、Realm.WriteAsync(Action action, CancellationToken cancellationToken)
、Realm.BeginWriteAsync(CancellationToken cancellationToken)
和Transaction.CommitAsync(CancellationToken cancellationToken)
组成。 而Transaction.Rollback()
则不需要对应的异步对象。 已弃用的API调用包括Realm.WriteAsync(Action<Realm> action)
、Real.WriteAsync<T>(Func<Realm, IQueryable<T>> function)
、Realm.WriteAsync<T>(Func<Realm, IList<T>> function)
和Realm.WriteAsync<T>(Func<Realm, T> function)
。 以下是用法示例:
(PR # 2899 )using Realms; var person = await _realm.WriteAsync(() => { return _realm.Add( new Person { FirstName = "Marco" }); }); // you can use/modify person now // without the need of using ThreadSafeReference
- 添加了从服务器删除用户的方法
App.DeleteUserFromServerAsync
。 它还会使用户在本地失效,并删除所有本地数据。 它不会删除用户从服务器上传的任何数据。 (问题# 2675 ) - 添加了布尔属性
ChangeSet.IsCleared
,该属性在集合被清除时为 true。 此外,当集合被清除时,Realm 集合现在会通过操作Reset
而不是Remove
引发CollectionChanged
事件。 请注意,这仅适用于集合属性,例如IList
和ISet
。 (问题# 2856 ) - 将
PopulateInitialSubscriptions
添加到FlexibleSyncConfiguration
- 这是首次打开 Realm 时将调用的回调。 它允许您创建初始订阅,这些订阅将在 Realm 打开之前添加到 Realm 中。 (问题# 2913 ) - 将 SharedInfo 版本升级为12 。 这需要更新在多进程场景中访问该文件的任何应用,包括Realm Studio。
- 同步客户端将妥善处理来自服务器的补偿写入错误消息,并将有关哪些对象导致发生补偿写入的详细信息传递给 SDK 的同步错误处理程序。 ( # 5528 )
固定
- 向 Set 添加对象,删除父对象,然后删除前面提到的对象会导致崩溃 ( # 5387 )
- 如果引导中断,Flexible 同步将无法正确恢复同步 ( # 5466 )
- Flexible 同步现在将确保仅在收到整个引导程序时才会应用来自服务器的引导程序 - 确保更改服务器上的读取快照不会导致孤立对象 ( # 5331 )
- 部分修复 Apple 平台上写入性能的性能下降。 提交空写事务(write transaction)比10.13.0快10倍, 但仍比10.7.1之前慢 由于使用了更具崩溃安全性的文件同步(自 v 10.7.1起)。 (Swift 问题# 7740 )。
兼容性
- Realm Studio: 12.0.0或更高版本。
内部资料
- 使用 Core 12.1.0 。
10.13.0 ( 2022 - 05 - 18 )
增强功能
- 添加了将 Sync Realm 转换为 Local Realm 以及将 Local Reals 转换为 Sync Realm 的功能。 (问题# 2746 )
- 添加了对新的客户端重置策略的支持,称为Discard Unsynced Changes 。 这种新策略极大地简化了同步 Realm 上客户端重置事件的处理。
此添加使得
Session.Error
已被弃用。 要暂时继续使用当前的Session.Error
,必须执行以下操作:
为了利用新的“丢弃未同步更改”功能,应执行以下操作(所有回调都是可选的):var conf = new PartitionSyncConfiguration(partition, user) { ClientResetHandler = new ManualRecoveryHandler(); };
相反,如果您希望在弃用期结束后继续使用手动解决方案,则应执行以下操作var conf = new PartitionSyncConfiguration(partition, user) { ClientResetHandler = new DiscardLocalResetHandler { OnBeforeReset = (beforeFrozen) => { // executed right before a client reset is about to happen }, OnAfterReset = (beforeFrozen, after) => { // executed right after a client reset is has completed }, ManualResetFallback = (session, err) => { // handle the reset manually } } };
var conf = new PartitionSyncConfiguration(partition, user) { ClientResetHandler = new ManualRecoveryHandler((sender, e) => { // user's code for manual recovery });
固定
- 修复了在 Xamarin.iOS 上启动时 Realm API 抛出的
System.DllNotFoundException
(问题# 2926 ,自10.12.0起)
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.14.0 。
10.12.0 ( 2022 - 05 - 05 )
增强功能
- 预览.NET6 iOS、Android 和 对Maui 的支持。我们暂定支持新的.NET 6移动工作负载(MacCatalyst 除外,稍后将启用)。 .NET工具本身仍处于预览阶段,因此我们尚未对新平台进行良好的测试覆盖。 请在以下网址报告您发现的任何问题: https: 域 。
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.14.0 。
10.11.2 ( 2022 - 04 - 12 )
固定
- 修复使用加密时的损坏错误。 (核心问题# 5360 )
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.14.0 。
10.11.1 ( 2022 - 03 - 31 )
固定
- 修复了一个问题,即使将项目配置为使用本机,也会导致在 Xamarin 应用程序中使用托管 HttpClientHandler。 (问题# 2892 )
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.12.0 。
10.11.0 ( 2022 - 03 - 28 )
增强功能
- 添加了属性
Session.ConnectionState
以获取Session
的SessionConnectionState
。 此外,Session
现在实现了INotifyPropertyChanged
,以便您可以监听Session.ConnectionState
的更改。 (问题# 2801 ) - Realm 现在支持在 Windows ARM 64上运行 .NET Framework、.NET Core 和 UWP 应用。 (问题# 2704和# 2817 )
- 添加了属性
AppConfiguration.HttpClientHandler
,允许您覆盖HTTP Realm.NETSDK 用于进行 调用的默认HTTP 客户端处理程序。请注意,这仅影响HTTP调用的行为,例如用户登录、函数调用和远程MongoDB调用。 同步客户端使用原生WebSocket实施,不会使用提供的消息处理程序。 (问题# 2865 )
固定
- [Unity] 修复了导致通过
Tools->Realm->Weave Assemblies
编辑器菜单调用编织器失败并出现错误UnityEngine.UnityException: get_dataPath can only be called from the main thread
的问题。 (问题# 2836 ) - 修复了枚举无效 Realm 集合(例如,属于已删除对象的列表)时引发
RealmInvalidObjectException
的问题。 (问题# 2840 ) - 查询解析器不接受“in”作为属性名称(核心问题# 5312 )
- 应用程序有时会因“KeyNotFound”或断言“has_refs()”等异常而崩溃。 其他表明文件损坏的问题也可能由此得到修复。 这里提到的问题是指能够解决问题的问题。 (核心问题# 5283 )
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.12.0 。
- 通过打开某些 Windows 程序集的解释器,在iOS设备上启用运行基准测试。
10.10.0 ( 2022 - 02 - 28 )
指南表示问题
此发布修复了 Guid 值在数据库中存储方式的一个重大错误。 它为本地(非同步)数据库提供自动迁移,但在升级使用 Sync 的应用时需要额外的小心。
上下文
Guid 由4组件表示 - int
、 short
、 short
和byte[8]
。 Microsoft 的 Guid 与 UUID 规范的不同之处在于,它们使用系统的字节序对前三个组件进行编码(所有现代 CPU 均使用小端字节序),而 UUID 将其组件编码为大端字节序。 最终结果是,相同的字节在被string Guid
.NETSDK 解释为UUID
与被Realm 数据库解释为 时具有不同的 表示形式,例如f2952191-a847-41c3-8362-497f92cb7d24
与912195f2-47a8-c341-8362-497f92cb7d24
(注意前三个组件中的字节交换)。 您可以通过在Realm Studio中打开.NET SDK创建的数据库并检查 Guid 属性的值来发现问题。
修复
我们提供的修复是调整 .NET SDK 的行为,以将 GUID 读取/写入到具有大端表示的数据库中。 这意味着 SDK 和数据库将一致显示相同的值。 这会产生一些影响,“本地 Realm”和“同步 Realm”部分将对此进行描述。
本地 Realm
对于本地 Realm,我们在第一次使用新 SDK 打开 Realm 时执行一次性迁移。 在此迁移过程中,我们会将所有 Guid 字段更新为大端格式。 这意味着它们的string表示形式将保持不变,但数据库中的值将更改以匹配它。 这意味着升级过程应该是无缝的,但如果您决定降级到较旧版本的 SDK,则会看到字节顺序发生翻转。 即使降级,迁移也不会多次执行。
同步 Realm
不为同步 Realm 提供客户端迁移。 这是因为系统的分布式性质意味着将不可避免地存在一段时间的不一致状态。 取而代之的是,读取已存储在数据库中的 Guid
属性的值,这意味着与以前版本的 SDK 相比, string表示形式将翻转,但现在将与Atlas / Compass / Realm Studio中的表示形式相匹配。 您的应用程序将属于三个常规群组:
- 如果您不关心客户端上 Guid 属性的string值,则无需执行任何操作。 这些值仍然是唯一且有效的指南。
- 如果您确实使用客户端应用程序中的string GUID 值(例如,将用户 ID 与 CMS 关联起来),但对客户端设备拥有完全控制权(例如,因为这是公司内部应用程序),那么建议您执行一次性迁移Atlas中的数据,并强制所有用户升级到该应用的最新版本。
- 如果无法强制所有用户同时更新,则可以通过为拥有的每个 Guid属性添加一个额外的属性来执行实时迁移,并写入一个trigger函数来在两者之间迁移数据。 旧版本的应用将写入原始属性,而新版本将写入新属性, trigger将在两者之间转换。
如果您正在使用同步并需要更新到最新版本的 SDK,但尚未准备好迁移数据,请参阅Opting out
部分。
选择退出
如果由于某种原因,您想要选择退出固定行为,可以通过将Realm.UseLegacyGuidRepresentation
属性设置为true
来临时选择退出。 不建议这样做,但如果您需要更多时间来测试迁移,同时仍能获得错误修复和其他改进,则可以使用此方法。 将其设置为true
有两个作用:
- 它带回了前10.10.0 使用小端表示法读取/写入 Guid 值的行为。
- 它禁用本地 Realm 的迁移代码。 请注意,如果您在
UseLegacyGuidRepresentation
设立为false
时已打开Realm 文件,则迁移不会恢复。
增强功能
- 取消了一项限制,该限制会阻止您在迁移期间更改对象的主键。 现在可以使用动态 API 和强类型API来实现此目的:
var config = new RealmConfiguration { SchemaVersion = 5, MigrationCallback = (migration, oldVersion) => { // Increment the primary key value of all Foos foreach (var obj in migration.NewRealm.All<Foo>()) { obj.Id = obj.Id + 1000; } } }
- [Unity ] Unity编辑器中的Realm菜单项已移至
Tools/Realm
,以减少混乱并与其他3第三方编辑器插件保持一致。 (问题# 2807 )
固定
- 修复了 xUnit 测试的一个问题,该问题会导致每当在非异步测试中访问Realm时抛出
System.Runtime.InteropServices.SEHException
。 (问题# 1865 ) - 修复了一个错误,该错误会导致冻结 Realm 时进行不必要的元数据分配。 (问题# 2789 )
- 修复了可能导致 Realm 托管对象(例如
RealmObject
、列表、结果等)在迁移区块期间分配,以使Realm保持打开状态,直到它们被垃圾收集。 这会产生微妙的影响,例如无法在迁移后立即删除Realm ,或者无法使用不同的配置打开Realm 。 (PR # 2795 ) - 修复了导致Unity 3D 的 IL2 C++编译器无法正确进程Realm依赖项之一的问题。 (问题# 2666 )
- 修复了Realm NuGet包中的 osx 运行时路径,使其也应用于 Apple Silicon(通用)架构(问题# 2732 )
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.10.0
10.9.0 ( 2022 - 01 - 21 )
增强功能
添加了对与MongoDB Realm进行同步的新模式(称为“Flexible Sync”)的支持。 使用Flexible Sync时,客户端会决定它对哪些查询感兴趣,并向服务器询问与这些查询匹配的所有对象。 匹配的对象将像以前一样存储在本地Realm中,并且可以离线查询和访问。 此功能处于beta,因此非常感谢反馈(无论是积极的还是消极的),并且与往常一样,我们还不建议将其用于生产工作负载。
- 添加了名为
FlexibleSyncConfiguration
的新配置类型。 使用此类型可获取使用新的服务器同步模式的Realm
实例。 - 已弃用
SyncConfiguration
类,改用PartitionSyncConfiguration
。 这两个类是等效的,引入新类型是为了更好地与FlexibleSyncConfiguration
进行对比。 这两种类型是等效的,都允许您打开使用旧“分区同步”模式的Realm
实例。 - 添加了一个名为
SubscriptionSet
的新类型。 它是一个集合,包含为此Realm创建的各种活动查询订阅。 可以通过Realm.Subscriptions
属性访问该集合。 对于本地和分区同步Realm,该值将为null
;对于灵活同步Realm,该值非 null。
一个最小的示例如下所示:
var config = new FlexibleSyncConfiguration(user); var realm = Realm.GetInstance(config); // Add a new subscription realm.Subscriptions.Update(() => { var year2022 = new DateTimeOffset(2022, 1, 1); var saleOrders = realm.All<SaleOrder>().Where(o => o.Created > year2022); realm.Subscriptions.Add(saleOrders); }); // Wait for the server to acknowledge the subscription and return all objects // matching the query await realm.Subscriptions.WaitForSynchronizationAsync(); // Now we have all orders that existed on the server at the time of // subscribing. From now on, the server will send us updates as new // orders get created. var orderCount = realm.All<SaleOrder>().Count();
- 可以为同一类的查询创建多个订阅,在这种情况下,将使用逻辑
OR
将它们组合起来。 例如,如果您为2022中创建的所有订单创建一个订阅,并为当前用户创建的所有订单创建另一个订阅,则您的本地 Realm 将包含这两个结果集的并集。 - 订阅可以命名(这样更容易取消订阅)或未命名。 使用同一查询添加多个未命名订阅是一项无需操作的操作。
- 即使生成的差异并不大,修改活动订阅集在服务器端也是一项代价高昂的操作。 因此,我们建议尽可能对订阅更新进行批处理,以避免服务器实例过载。 一种好的做法是预先声明用户订阅 — 通常是在第一次打开 Realm 时,并且仅在绝对必要时才更新它们。
- 有关API和当前限制的更多信息,请参阅Docs 。
- 添加了名为
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.8.0 。
- 发布测试是针对 realm-qa 而不是 realm-dev 执行的。 (PR # 2771 )
10.8.0 ( 2022 - 01 - 17 )
增强功能
- 添加了
RealmConfigurationBase.FallbackPipePath
属性。 在大多数情况下,此属性可以留空,但在无法创建命名管道的文件系统上打开 Realm 时应使用该属性,例如 Android 上使用 FAT 32的外部存储。 在这种情况下,该路径需要指向另一个文件系统上可以创建命名管道的位置。 (PR # 2766 ) - 在基于字符串的查询语法 (
realm.All<Foo>().Filter("some-query")
) 中添加了支持算术运算(+、-、*、/)的支持。 操作数可以是数值类型(整数、浮点数、 double精度浮点数或十进制128)的属性和/或常量。 您现在可以写入类似"(age + 5) * 2 > child.age"
的查询。 (核心升级)
固定
- 修复了在 macOS 上打开Unity项目时可能导致
Sharing violation on path ...
错误的争用条件。 (问题# 2720 ,由@tomkrikorian修复) - 修复在只读Realm上多次调用
Realm.GetInstance
时引发的错误。 (问题# 2731 ) - 修复了一个错误,该错误会导致对
IQueryable
调用Count()
时忽略LIMIT
子句 - 例如 像realm.All<Foo>().Filter("Bar > 5 LIMIT(1)).Count()
这样的表达式会忽略基于字符串的谓词中的限制,并返回所有匹配项的计数。 (问题# 2755 ) - 修复了
RealmResultsVisitor.TraverseSort
中的逻辑以允许对接口属性进行排序。 (问题# 1373 ,@daawaan 贡献)
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.8.0 。
- 更新了预发布包的命名以使用小写“pr”,例如
10.7.1-pr-2695.1703
而不是10.7.1-PR-2695.1703
。 (PR # 2765 ) - 从使用 CLI 导入/导出应用程序迁移到通过管理 API 配置应用程序。 (PR # 2768 )
10.7.1 ( 2021 - 11 - 19 )
固定
- 删除用户时,如果Realm路径太长而触发了回退哈希名称(取决于操作系统,但在 Linux 上为300字符),则同步用户的Realm不会被删除。 (核心升级)
- 如果客户端的时钟提前30分钟以上,则不要继续尝试刷新访问权限令牌。 (核心升级)
- 如果身份验证请求失败,请勿人为地休眠同步线程。 这可能是由于当同步在离线超过30分钟后尝试连接时,应用程序出现用户界面挂起。 (核心升级)
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.6.1 。
10.7.0 ( 2021 - 11 - 09 )
增强功能
- 添加了
Realm.SyncSession
属性,如果该 Realm 是同步会话,则该属性将返回该Realm的同步会话,或者如果该Realm是本地 Realm,则该属性将返回null
。 这将替换现已弃用的GetSession(this Realm)
扩展方法。 (PR # 2711 )
固定
- 修复了一个错误,该错误会导致在打开只读 Realm 时引发
RealmException
错误,而该只读 Realm 的模式是磁盘上模式的超集。 现在,代码将正常工作,并将磁盘上模式中不存在的任何类视为空集合,例如realm.All<ThisIsNotInOnDiskSchema>().Count == 0
。 (问题# 2619 ) - 修复了一个错误,当打开 Windows 中的勒索软件保护时,该错误会在二进制应用文件夹中创建“文档”文件夹。 (问题# 2685 )
- 修复了以下问题:如果
PropertyChanged.Fody
在Realm编织器之后运行,则会导致生成不正确的属性实施。 (问题# 1873 ) - [Unity] 保留了序列化和反序列化自定义用户数据所需的其他构造函数。 (PR # 2519 )
- 修复了在同时创建具有显式设置
Schema
属性的RealmConfiguration
时会导致InvalidOperationException
的问题。 (问题# 2701 ) - [Unity ] 修复了在未通过Unity包经理安装Realm包的情况下针对iOS进行构建时可能导致
NullReferenceException
的问题。 (问题# 2698 ) - 修复了一个错误,如果提供的Realm模式与磁盘上的模式不匹配,则可能导致冻结对象的属性返回不正确的值/引发异常。 (问题# 2670 )
- 修复了当同步会话在释放对Realm的外部引用的同时快速关闭时出现的罕见断言失败或死锁。 (核心升级)
- 修复了使用已删除的用户打开同步Realm时出现的断言失败问题。 相反,会引发异常。 (核心升级)
- 修复了一个罕见的段错误,如果用户在访问令牌刷新响应进入时注销,则可能会trigger该错误。 (核心升级)
- 修复了同步 Realm 下载完成后继续调用进度通知器的错误。 (核心升级)
- 允许从 Fallocate() 返回 EPERM。 这改进了对在具有有趣文件系统(例如Linux Amazon Web ServicesLambda)的 环境中运行的支持。感谢@ztane的报告和修复建议。 (核心升级)
- 修复了当用户的刷新令牌过期时用户处于登录状态的问题。 (核心升级)
- SyncManager 存在一些不一致的锁定,可能会导致数据争用和/或死锁,而这些情况大多是在执行非常奇怪的操作的测试之外永远不会发生的。 (核心升级)
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.6.0 。
- iOS包装器现在使用 Xcode 10引入的“新构建系统”进行构建,并由 Xcode 12默认使用。 更多信息请参阅 cmake 的Docs 。
- 现在,当使用
GetInstanceAsync
打开同步 Realm 时,我们会刷新生成的 Realm 实例。 (问题# 2256 ) - 为 cloud-dev 上运行的所有平台添加了同步测试。 (问题# 2049 )
- 添加了在模拟器上运行的 Android 测试。 (问题# 2680 )
- 开始使用 Sleet(提要URL )将预发布包发布到 S3。 (问题# 2708 )
- 为所有版本启用 LTO。 (PR # 2714 )
10.6.0 ( 2021 - 09 - 30 )
增强功能
在
ISet
上添加了两个扩展方法,以获取包装该集合的IQueryable
集合:set.AsRealmQueryable()
允许您从ISet<T>
获取IQueryable<T>
,然后可以将其视为常规可查询集合,并使用 LINQ 或Filter(string)
进行筛选/排序。set.Filter(query, arguments)
将过滤该设立并返回过滤后的集合。 它大致相当于set.AsRealmQueryable().Filter(query, arguments)
。
生成的可查询集合的行为与通过调用
realm.All<T>()
获得的结果相同,即它会在发生更改时发出通知并自动更新。 (问题# 2555 )在
Migration
上添加了两个新方法(问题编号2543 ):RemoveType(typeName)
允许在迁移期间从域中完全删除类型及其模式。RenameProperty(typeName, oldPropertyName, newPropertyName)
允许在迁移期间重命名属性。
Realm 模式现在可以在运行时构建,而不是从模型类自动生成。 自动生成将继续运行,应能满足绝大多数Realm用户的需求。 当对象的形状取决于某些仅在运行时已知的信息时,或者在极少数情况下(通过将已知大小的集合表示为类的属性来提供性能优势),可能需要手动构建模式。 (问题# 824 )
RealmConfiguration.ObjectClasses
现已弃用,取而代之的是RealmConfiguration.Schema
。RealmSchema
具有来自Type[]
的隐式转换操作符,因此以前看起来像ObjectClasses = new[] { typeof(Foo), typeof(Bar) }
的代码可以轻松更新为Schema = new[] { typeof(Foo), typeof(Bar) }
。Property
已通过从其属性中删除 setter 来将其转换为只读结构体。 它们之前没有执行任何操作,因此我们预计没有人使用它们。- 在
Property
上添加了多个工厂方法,通过明确有效选项的范围来简化Realm属性的声明,例如Property.FromType<int>("IntProperty")
或Property.Object("MyPersonProp", "Person")
。Property
的构造函数现已公开,以支持高级场景,但我们建议使用工厂方法。 - 公开
ObjectSchema.Builder
并简化其API。 它允许您构造单个对象模式的可变表示,并为其添加/删除属性。 您可以获取一个空构建器,也可以使用现有模型类(即 从RealmObject
或EmbeddedObject
继承)。 - 公开
RealmSchema.Builder
并简化其 API。 它允许您构造整个 Realm 模式的可变表示,并向其添加/删除对象模式。 - 如何使用新 API 的简单示例如下:
public class Person : RealmObject { public string Name { get; set; } public Address Address { get; set; } } // Declare schema from existing model classes var config = new RealmConfiguration { Schema = new[] { typeof(Person), typeof(Address) } }; // Manually construct a schema - we don't need to call .Build() on the builders // because we have implicit conversion operators defined that will call it for us. // Explicitly calling .Build() is also perfectly fine, if a little more verbose. var config = new RealmConfiguration { Schema = new RealmSchema.Builder { new ObjectSchema.Builder("MyClass", isEmbedded: false) { Property.FromType<int>("Id", isPrimaryKey: true), Property.PrimitiveDictionary("Tags", RealmValueType.String) }, new ObjectSchema.Builder("EmbeddedClass", isEmbedded: true) { Property.Primitive("DateProp", RealmValueType.Date, isNullable: true) } } }; // Enhance an existing model with new properties that will be accessible via // the dynamic API. var personSchema = new ObjectSchema.Builder(typeof(Person)) { Property.FromType<string>("NewStringProp") }; var config = new RealmConfiguration { Schema = new RealmSchema.Builder { personSchema, new ObjectSchema.Builder(typeof(Address)) } }; // Regular Person properties can be accessed as usual while runtime defined ones // need to go through the dynamic API. var person = realm.All<Person>().First(); var name = person.Name; var stringPropValue = person.DynamicApi.Get<string>("NewStringProp");
Linux以Realm模式(即 从磁盘读取模式),并且模式包含没有属性的对象。 (问题# 1978 )
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.4.1 。
- 将性能测试移至自托管运行器上运行。 (PR # 2638 )
10.5.1 ( 2021 - 09 - 22 )
固定
- 修复了一个错误,该错误会导致在编译包含仅限 getter 的
RealmObject
属性的类期间报告NullReferenceException
。 (问题# 2576 ) - 修复了使用 ClickOnce 部署 WPF .NET Framework 应用程序时会导致
Unable to load DLL 'realm-wrappers'
的问题。 这是由于应用于 Realm 依赖的原生库的 BuildAction 类型不正确造成的。 (问题# 1877 ) - [Unity ]
Multiple precompiled assemblies with the same name Mono.Cecil.dll
修复了以下问题:如果将Realm包导入已经引用 的项目,则Unity构建失败并显示Mono.Cecil
。(问题# 2630 ) - 修复了一个错误,该错误有时会导致在非常特定的边缘场景中运行时找不到程序集。 有关此类场景的更多详细信息,请参阅其PR的描述。 (问题# 1568 )
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.4.1 。
10.5.0 ( 2021 - 09 - 09 )
增强功能
- ThreadSafeReference 不再为查询支持的结果以外的任何内容固定源ACID 事务版本。 (核心升级)
- 现在,只要集合不是在当前写事务(write transaction)中创建的,就可以在写事务(write transaction)中创建对由集合支持的结果的 ThreadSafeReference。 (核心升级)
- 同步 Realm 不再打开两次,从而将使用的地址空间和文件描述符减少一半。 (核心升级)
固定
- 如果另一个同步客户端删除了主键为 null 的对象,则可能会触发
KeyNotFound: No such object
异常。 (核心升级) - 修复了一个争用条件,如果应用之前在用户注销期间崩溃,则可能导致断言
m_state == SyncUser::State::LoggedIn
。 (核心升级)
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.4.1 。
- 添加了将版本发布到 Slack 的操作。 (问题# 2501 )
- 添加了 MSBuild 内联任务以提取最新版本的变更日志。 (问题# 2558 )
- 发布成功后,合并原始 PR,标记发布,然后更新变更日志。 (PR # 2609 )
10.4.1 ( 2021 - 09 - 03 )
固定
- 修复了一个回归,该回归会阻止 SDK 在较早的Linux版本上运行。 (问题# 2602 )
- 修复了在使用动态 API 时绕过主键更改检查而出现的问题,即如果
"some-new-value"
与myObj
的主键值不同,myObj.DynamicApi.Set("Id", "some-new-value")
现在将正确抛出NotSupportedException
。 (PR # 2601 )
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.3.1 。
- 开始将代码覆盖率上传到工作服。 (问题# 2586 )
- 已删除 RealmObjectBase 继承者中的
[Serializable]
属性。 (PR # 2600 )
10.4.0 ( 2021 - 08 - 31 )
固定
- 修复了一个问题,该问题会导致 Unity 上的
Logger.Default
始终恢复为Debug.Log
,即使设置了自定义记录器也是如此。 (问题# 2481 ) - 修复
Logger.Console
在Unity上仍会使用Console.WriteLine
而不是Debug.Log
的问题。 (问题# 2481 ) - 向 RealmObjectBase 添加了序列化注解,以防止 Newtonsoft.Json 和类似的序列化器尝试序列化基本属性。 (问题# 2579 )
- 修复了在 WPF 中从用户界面绑定集合中删除元素时可能导致
InvalidOperationException
的问题。 (问题# 1903 ) - 用户配置文件现在可以在两次运行之间正确保留。 (核心升级)
- 修复通过包含 RealmObject 继承者的 RealmValue 列表的嵌套层次结构传递通知时发生的崩溃。 (核心升级)
- 修复了当 RealmValue属性链接到的对象失效时发生的崩溃(仅限同步)。 (核心升级)
- 修复替换列表中的嵌入式对象时,prior_size 历史记录损坏的问题。 (核心升级)
- 修复了当本地已存在 RealmValue属性时,对该属性应用 AddColumn 指令时,同步客户端中的断言失败问题。 (核心升级)
- 修复了当本地已存在
RealmValue
属性时,为该属性应用AddColumn
指令时,同步客户端中Invalid data type
断言失败的问题。 (核心升级)
增强功能
在
IList
上添加了两个扩展方法,以获得包装列表的IQueryable
集合:list.AsRealmQueryable()
允许您从IList<T>
获取IQueryable<T>
,然后可以将其视为常规可查询集合,并使用 LINQ 或Filter(string)
进行筛选/排序。list.Filter(query, arguments)
将过滤列表并返回筛选后的集合。 它大致相当于list.AsRealmQueryable().Filter(query, arguments)
。
生成的可查询集合的行为与通过调用
realm.All<T>()
获得的结果相同,即它会在发生更改时发出通知并自动更新。 (问题# 1499 )为 Realm 模式添加了缓存。 这将加快显式设置
RealmConfiguration.ObjectClasses
的Realm.GetInstance
调用的速度。 速度增益将取决于模型类的数量和复杂性。 对包含所有有效 Realm 属性类型的模式进行测试的参考基准测试显示,Realm.GetInstance 的速度提高了25 %。 (问题# 2194 )提高为具有复杂模式的 Realm 创建集合通知器的性能。 在 SDK 中,这意味着首次运行同步查询、首次调用订阅通知将显着减少调用线程上的工作量。
提高计算通知变更集的性能,尤其是对于深度嵌套的对象图以及具有 List 或 Set 属性且集合中对象数量较少的对象。
查询解析器现在接受
BETWEEN
操作符。 可以像realm.All<Person>().Filter("Age BETWEEN {20, 60}")
一样使用,表示“'年龄'必须位于开区间 ] 20 ; 60 [”中。 (核心升级)
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.3.1 。
- 删除了 RealmStates 字典,该字典用于保存已打开 Realm 的所有状态的线程本地字典。 它仅用于在删除期间检测打开的 Realm,现在由原生
delete_realm_files
方法处理。 (PR # 2251 ) - 停止向混合面板发送分析。
- 开始将基准测试结果上传到MongoDB Charts 。 (问题# 2226 )
- 从 GHA 中删除了专用基准测试工作流程。 (问题# 2562 )
- 在Github Actions 上构建Windows包装器时,请使用 Win 81 SDK。 (问题# 2530 )
- 添加了 CodeQL 工作流程。 (问题# 2155 )
- 随着时间的推移,开始跟踪包和包装器的大小。 (问题# 2225 )
- 已从 RealmObjectBase 中删除
[Serializable]
属性,因为BinarySerializer
现已过时。 (PR # 2578 ) - 在Github Actions 中添加了代码覆盖率作业。 (PR # 2581 )
- 添加了在 Windows 8.1上运行的 CI 测试。 (PR # 2580 )
10.3.0 ( 2021 - 07 - 07 )
注意:此发布使用 xcframework 并为iOS原生库启用位码。 这会显着增加包大小,并且可能会增加 .ipa 为iOS进行编译时的大小。 但是,位码部分以及不必要的架构将被App Store修剪,因此发送给用户的实际下载大小将保持不变或小于以前。
固定
- 修复了阻止在Windows 8.1上加载
realm-wrappers.dll
的问题。 (问题# 2298 ) - 修复了侦听包含链接的基元 Mixed 列表更改时的断言失败问题。 (核心升级)
- 修复在侦听对包含无效链接的字典或设立进行更改时出现的断言失败问题。 (核心升级)
- 修复了一个无限递归循环,在计算一组包含循环的对象上的更改时,该循环可能导致Stack Overflow 。 (核心升级)
- 在字典实施中添加冲突处理。 (核心升级)
- 修复了清除包含对象链接的“混合”列表或集合后出现的崩溃问题。 (核心升级)
- 修复了一个递归循环,当管理员撤销该令牌时,该循环在尝试刷新用户应用令牌时最终会崩溃。 现在,这种情况会导致用户注销并报告错误。 (核心升级)
- 修复了调用
Realm.DeleteRealm
和并发打开域文件之间的争用。 (核心升级) - [Unity] 添加了代码以保留多个基本序列化器的构造函数,以确保大多数基本序列化/反序列化工作负载开箱即用。 (PR # 2489 )
增强功能
- 更改了原生 iOS 库以使用 xcframework。 这意味着现在支持在 M 1台 Mac 上运行模拟器。 (问题# 2240 )
- 在原生 iOS 库中添加了位码。 这对 Xamarin.iOS 没有影响,但允许 Unity 应用程序利用 App Store 服务器执行的优化,并最终支持发布的新架构。 (问题# 2240 )
兼容性
- Realm Studio: 11.0.0或更高版本。
- 此发布将 xcframework 用于iOS原生库,这需要Xamarin. iOS 14.14.2.5或更高版本。
内部资料
- 使用 Core 11.0.4 。
10.2.1 ( 2021 - 06 - 30 )
此版本更改了 Unity 二进制文件的打包方式,不再需要额外包含作为独立模块的依赖项的 Unity 包。 如果您使用的是io.realm.unity-bundled
软件包,请将其删除并添加新发布的io.realm.unity
软件包。
固定
- [Unity] 修复了以下问题:由于建模错误而无法编制程序集,该问题仅在日志中显示一次错误,然后无法使用
No RealmObjects. Has linker stripped them?
打开Realm 。 现在,每次代码更改/尝试编织时都会显示编织错误,并且运行时错误将明确建议手动重新运行编织器。 (问题# 2310 ) - [Unity] 修复了使用 Sync 时导致应用程序在退出时挂起的问题。 (PR # 2467 )
- [Unity ] 修复了一个问题,如果应用使用同步,则会导致 macOS 上的Unity编辑器在程序集重新加载后挂起。 (问题# 2482 )
- 修复了由于错误地将 UInt 32转换为 TableKey 以及 Int 64转换为 ObjKey 而在 Android x 86上发生崩溃的问题。 (问题# 2456 )
增强功能
- 无
兼容性
- Realm Studio: 11.0.0或更高版本。
内部资料
- 使用 Core 11.0.3 。
- 对象上的 GetHashCode() 现在除了对象键之外还使用表键。 (问题# 2473 )
10.2.0 ( 2021 - 06 - 15 )
固定
- 修复了一个错误:在查询上应用多个
OrderBy
子句会导致子句相互附加,就好像它们是.ThenBy
一样,而不是最后一个子句替换前面的子句。 (PR # 2255 ) - 在显式指定
SyncConfiguration.ObjectTypes
时,添加了一项检查以验证模式并确保所有EmbeddedObject
类都可以从继承RealmObject
的类访问。 有关此主题的更多信息,请参阅此处。 (PR # 2259 ) - 修复了一个错误,在构建适用于iOS的Unity项目时,该错误可能会导致类似
Undefined symbols for architecture xxx: "_realm_thread_safe_reference_destroy"
的错误。 (问题# 2318 ) - 现在,如果您尝试定义
RealmInteger
值的集合,则编织器将发出错误。 此功能从未受支持,但以前它会静默失败,而现在会出现编译时错误。 (问题# 2308 ) - 修复在 Unity 项目中使用托管对象(列表或结果)集合会导致编译后的二进制文件无效的问题。 (PR # 2340 )
- 修复了定义了迁移回调但Realm实际上并不需要运行该回调时出现的内存泄漏问题 (PR # 2331 )
- 重新添加了对iOS版本的32位支持。 (问题# 2429 )
- 删除了在为设备构建 Unity 项目时提及 Realm 和 Realm.UnityUtils 的模式为空的冗余警告。 (问题# 2320 )
- 修复了以下问题:如果您在调用 后不久设立 设置为 ,则可能导致抛出 。
NullReferenceException
SyncConfiguration.OnProgress
null
Realm.GetInstanceAsync(syncConfig)
(问题# 2400 ) - 替换嵌入式对象时,发出同步指令,将嵌入式对象的链接设置为空,以便正确清除。 这解决了本来会表现为
Failed to parse, or apply received changeset: ERROR: ArrayInsert: Invalid prior_size (list size = 4, prior_size = 0)
的问题 ( # 4740 - 使ExternalCommitHelper 的 Linux 实现可与更改了 epoll 行为的 Linux 新版本一起使用,包括 Android 12 (问题号4666 )
- 文件格式发生了变化,我们现在再次在主键列上拥有搜索索引。 这是必需的,因为我们现在停止从主键派生 ObjKey,而只是使用递增的计数器值。 这样一来,所有新对象都将在同一集群中创建,而不是像以前那样分散。 这也意味着从文件格式版本11及更早格式的升级速度会快得多。 (核心升级)
增强功能
添加对
Guid
数据类型的支持。 它可以用作主键并且是可索引的。 (PR # 2120 )添加对字典的支持。 目前仅支持string键,而值类型可以是任何受支持的类型(基元类型、
RealmValue
或从 RealmObject/EmbeddedObject 继承的自定义类型)。 列表、集合或其他字典不能用作值类型。 要将字典添加到模型中,请定义类型为IDictionary<string, T>
的仅 getter属性:public class MyObject : RealmObject { public IDictionary<string, decimal> Denominations { get; } } // Realm will automatically manage the underlying dictionary, so there's no need // to define a constructor or assign it to some value. var obj = new MyObject(); obj.Denominations.Add("quarter", 0.25d);
添加对
RealmValue
数据类型的支持。 这种新类型可以表示任何有效的 Realm 数据类型,包括对象。 还支持RealmValue
的集合(列表、集合和字典),但RealmValue
本身不能包含集合。 请注意,类型为RealmValue
的属性不能为 null,但可以包含 null,由值RealmValue.Null
。 (PR # 2252 )public class MyObject : RealmObject { public RealmValue MyValue { get; set; } public IList<RealmValue> ValuesList { get; } public ISet<RealmValue> ValuesSet { get; } public IDictionary<string, RealmValue> ValuesDict { get; } } var obj = new MyObject(); obj.MyValue = RealmValue.Null; obj.MyValue = 1; obj.MyValue = "abc"; if (obj.MyValue.Type == RealmValueType.String) { var myString = obj.MyValue.AsString(); }
添加支持对象集或原始值的支持。 集是无序集合,可确保其元素的唯一性。 Realm使用其内部相等比较器,无法通过覆盖自定义类上的
Equals
或GetHashCode
来自定义其行为。 对象始终通过数据库引用进行比较,即数据库中的两个不同对象始终不同,即使它们的内容相同,并且对同一数据库对象的多个引用始终相等。public class MyObject : RealmObject { public ISet<string> UniqueStrings { get; } } // Realm will automatically manage the underlying set, so there's no need // to define a constructor or assign it to some value. var obj = new MyObject(); var didAdd = obj.UniqueStrings.Add("foo"); // true didAdd = obj.UniqueStrings.Add("foo"); // false
添加了对基于string的查询中的值替换的支持。 这将启用遵循以下语法的表达式:
realm.All<T>().Filter("field1 = $0 && field2 = $1", 123, "some-string-value")
。 (问题# 1822 )将原原生二进制文件的大小减小了 ~ 5 %。 (PR # 2239 )
添加了新类 -
Logger
,它允许您通过设置Logger.Default
用自定义记录器实现覆盖默认记录器实现(之前写入stdout
或stderr
)。 这将取代AppConfiguration.CustomLogger
和AppConfiguration.LogLevel
,后两者将在未来版本中删除。 内置实现包括:Console
- 对大多数项目使用System.Console
,对 Unity 项目使用UnityEngine.Debug
:Logger.Default = Logger.Console;
Null
— 忽略所有消息:Logger.Default = Logger.Null;
Function
— 代理调用所提供的函数:Logger.Default = Logger.Function(message => myExternalLogger.Log(message));
自定义记录器可以从
Logger
类派生,并为Log
方法提供自己的实施,或者使用Function
并提供Action<string>
。 (PR # 2276 )RealmObjectBase
现在可以正确覆盖并实现GetHashCode()
。 (问题# 1650 )添加了
RealmObject.ToString()
的覆盖项,以输出有关对象内容的更有意义的信息。 它将输出对象的类型、主键(如果已定义)以及对象是托管还是删除的信息。 (问题# 2347 )添加了用于动态访问对象属性的新 API。 它们旨在支持提前编译的平台,例如带有Unity IL2C++ 编译的 Xamarin.iOS 和 。其目的是最终使这些成为默认 API,同时也支持基于 DLR 的传统 API。 示例:
// Make sure to cast away the dynamic immediately on AOT platforms. var people = (IQueryable<RealmObject>)realm.DynamicApi.All("Person"); foreach (var person in people) { var firstName = person.DynamicApi.Get<string>("FirstName"); var address = person.DynamicApi.Get<EmbeddedObject>("Address"); var city = address.DynamicApi.Get<string>("City"); } // When casting a dynamic object, always cast first to object and then // to the actual object type to remove any callsites being generated. var newPerson = (RealmObject)(object)realm.DynamicApi.Create("Person", 123); newPerson.DynamicApi.Set("FirstName", "Peter");
添加了Unity编辑器选项以启用编织编辑器程序集。 这应该是“关闭”,除非您的项目具有引用Realm的编辑器程序集 -示例,测试 Realm 相关功能的 EditMode 测试程序集。 保持其“打开”状态可能会稍微减慢构建速度,因为需要评估更多装配体以进行编织。 (问题# 2346 )
现在,在任何文件格式升级之前,我们都会对 Realm 文件进行备份。 备份将保留3个月。 文件格式升级之前的备份可以更好地分析任何升级失败。 如果满足以下条件,我们也会恢复备份:a) 尝试打开“未来”文件格式的 Realm 文件,以及 b) 存在适合当前文件格式的备份文件。 ( # 4166 )
兼容性
- Realm Studio: 11.0.0 -alpha。 0或更高版本。
内部资料
- 使用 Core 11.0.3 。
- 为除 Android 之外的所有平台启用了 LTO 版本。 (PR # 2239 )
- 测试项目已更新为 dotnetcore 3.1 。 这意味着不再针对 dotnetcore 2.0执行测试。
- 当我们遇到转换操作符时,删除了 ResultsVisitor 中的 Lambda 编译。 这是必需的,因为IL2 C++无法动态编译 lambda。 相反,我们现在使用
Operator.Convert<TTarget>(object)
,它的效率比Operator.Convert<TSource, TTarget>
稍低,但仍然比Convert.ChangeType
快很多,而且不会出现Decimal128
转换方面的缺陷。 主要缺点是,我们不再支持参数为自定义用户类型并定义了隐式转换运算符的查询。
10.1.4 ( 2021 - 05 - 12 )
固定
- 修复了一个错误,该错误可能导致崩溃,并显示类似
Invalid ref translation entry [0, 78187493520]
的消息。 (核心升级) - 修复在变更通知回调中执行写入时的断言失败,例如
!m_notifier_skip_version.version
或m_notifier_sg->get_version() + 1 == new_version.version
。 (核心升级) - 修复修改的集合通知报告。 这可以通过以下方式观察到:在已排序或非重复结果上接收到错误的修改索引,或者在仅发生修改时有时不会调用通知块。 (核心升级)
- 在尝试启动同步会话之前,主动检查访问令牌的到期时间并进行刷新。 这可以防止某些错误日志出现在客户端上,例如:
ERROR: Connection[1]: Websocket: Expected HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 Unauthorized
。 (核心升级) - 与其他运行的线程相比,退出时 TableRecycler 的销毁是无序的。 这可能会导致崩溃,其中一些崩溃是由于 TableRecycler 位于堆栈顶部造成的。 (核心升级)
- 修复了与
uncaught exception in notifier thread: N5realm11KeyNotFoundE: No such object
相关的错误。 当另一个客户端删除链接的对象时,在同步的应用中可能会出现这种情况。 (核心升级) - 使用错误的加密密钥或不同的加密配置打开元数据域将删除该元数据域并使用新的密钥或配置创建新的元数据域。 (核心升级)
- 将
ThreadSafeReference
创建为只读Realm会导致崩溃。 (核心升级)
兼容性
- Realm Studio: 10.0.0或更高版本。
内部资料
- 使用 Core 10.7.2 。
10.1.3 ( 2021 - 04 - 29 )
固定
- 修复了一个编译器错误,该错误会导致在Windows上使用同步时引发
"Access violation"
错误。
兼容性
- Realm Studio: 10.0.0或更高版本。
内部资料
- 使用 Core 10.5.6 。
10.1.2 ( 2021 - 03 - 19 )
固定
- 在32位设备上,升级到 v 10时可能会出现“没有此类对象”的异常。 (核心升级)
- 通知工作线程会在每次提交后重新运行查询,而不是仅提交修改后的表,如果该表具有指向未在查询中使用的表的任何传出链接,则可能会影响查询结果。 (核心升级)
- 修复“无效的引用转换条目 [ 16045690984833335023 , 78187493520 ]”断言失败,该失败在使用同步或多进程写入单个Realm 文件时可能出现。 (核心升级)
- 在集成来自服务器的大量数据期间,您可能会收到
"Assertion failed: !fields.has_missing_parent_update()"
。 (核心升级) - 同步较大的十进制128值将导致
"Assertion failed: cx.w[1] == 0"
。 (核心升级) - 避免导致 Windows 可能挂起的争用情况。 (核心升级)
增强功能
- 无
固定
- 无
兼容性
- Realm Studio: 10.0.0或更高版本。
内部资料
- 使用 Core 10.5.6 。
10.1.1 ( 2021 - 02 - 25 )
固定
- 修复了可能导致 UWP 应用因使用不受支持的API (
__C_specific_handler
) 而被Microsoft Store 拒绝的问题。 (问题# 2235 ) - 如果在非常特定的时间提交写事务(write transaction),则Realm通知侦听器线程有时可能会遇到断言失败“!skip_version.version”。 (核心升级)
增强功能
- 无
固定
- 无
兼容性
- Realm Studio: 10.0.0或更高版本。
内部资料
- 使用 Core 10.5.3 。
10.1.0 ( 2021 - 02 - 09 )
增强功能
- 同步客户端现在会记录从服务器收到的错误消息,而不仅仅是错误消息的大小。 (核心升级)
- 同步 WebSocket 关闭时从服务器返回的错误现在会被捕获并显示为 SyncError。 (核心升级)
- 显着提高了不带过滤的查询的顺序读取性能。 (核心升级)
固定
- 修复在具有不同ACID 事务版本的线程中使用冻结查询时出现的问题,从而能够访问权限冻结集合中未来版本的对象。 (核心升级)
- 修复了以下问题:文件格式升级后创建对象可能会失败,并出现断言“Assertion failed: lo() <= std::numeric_limits<uint 32 _t>::max()”(核心升级)
- 修复了以下问题:如果在源表中的索引零处创建新对象,则从不使用过滤的查询结果中获取元素会给出不正确的结果。 (核心升级)
- 修复了同步期间应用程序崩溃并显示
Assertion failed: ref + size <= next->first
的问题。 (核心升级)
兼容性
- Realm Studio: 10.0.0或更高版本。
内部资料
- 使用 Core 10.5.0 。
- 修复正在发送的分析版本。
10.0.1 ( 2021 - 02 - 02 )
重大更改
- 我们不再支持Realm Cloud(旧版),而是支持新的MongoDB Realm Cloud 。 MongoDB Realm是一个无服务器平台,使开发者能够快速构建应用程序,而无需设立服务器基础架构。 MongoDB Realm构建在MongoDB Atlas之上,会自动集成与数据库的连接。 ( # 2011 )
- 删除支持基于查询的同步的支持,包括配置参数和
SyncSubscription
类型。 ( # 2011 ) - 删除与同步权限相关的所有内容,包括基于路径的权限系统和基于查询的同步的对象级特权。 MongoDB Realm 中的权限是在服务器端定义的。 ( # 2011 )
- 已将
Realm
类上用于动态访问权限的所有API移至Realm.DynamicApi
:Realm.CreateObject(string className, object primaryKey)
现在是Realm.DynamicApi.CreateObject(string className, object primaryKey)
。Realm.All(string className)
现在是Realm.DynamicApi.All(string className)
。Realm.RemoveAll(string className)
现在是Realm.DynamicApi.RemoveAll(string className)
。Realm.Find(string className, long? primaryKey)
现在是Realm.DynamicApi.Find(string className, long? primaryKey)
。Realm.Find(string className, string primaryKey)
现在是Realm.DynamicApi.Find(string className, string primaryKey)
。
- 现在要求同步Realm中的所有顶级对象都有一个名为
_id
的主键。 您可以使用MapTo("_id")
属性来避免对模型属性使用不惯用的名称。 - 提高了Xamarin的最低目标。将iOS应用程序迁移到iOS 9 。
- 将 Xamarin.Android 应用的最低 API 级别提高到16 (Android 4.1 )。
- 已将
FullSyncConfiguration
重命名为SyncConfiguration
。 - 已删除
RealmObject.FreezeInPlace
。 要冻结域对象,请使用Freeze
扩展方法。 (问题# 2180 )
增强功能
添加了对同步到MongoDB而不是Realm Object MongoDB Server的支持。 必须在zh-cn- 6522657350 d 227149 .getsmartling.com/zh-cn创建应用程序。
添加了
App
类,它是与 MongoDB Realm 应用同步的入口点。添加了
User.CustomData
,其中包含一份非结构化文档,其中包含有关用户的其他信息。 自定义数据在 MongoDB Realm 应用中配置。已添加
User.Functions
。 这是调用远程 MongoDB Realm 函数的入口点。 函数允许您为应用程序定义和执行服务器端逻辑。 函数使用现代 JavaScript (ES 6 +) 编写,并以无服务器方式执行。 调用函数时,您可以动态访问当前应用程序的组件以及有关执行函数的请求和发送请求的登录用户的信息。添加了
User.GetMongoClient
,为远程 MongoDB 服务上的 CRUD 操作公开 API。添加了
User.GetPushClient
,公开用于注册推送通知设备的 API。更改
SyncConfiguration
以接受分区值而不是服务器 Uri。 分区值的类型目前可以是string
、long
或ObjectId
。 通过分区值打开 Realm 相当于之前通过 URL 打开 Realm。 在这种情况下,分区旨在与数据更紧密地关联。 例如,如果您是一家拥有多个分店的大型零售商,则分区键可以是商店ID ,并且每个Realm将仅包含与指定商店相关的数据。添加对 Decimal 128数据类型的支持。 这是一个128位 IEEE 754十进制浮点数。 这种类型的属性可以声明为
MongoDB.Bson.Decimal128
类型或内置decimal
类型。 请注意,.NET 的内置十进制数为96位,因此它无法表示由Decimal128
表示的完整数字范围。 (PR # 2014 )添加支持
ObjectId
数据类型的支持。 这是一个12字节的唯一标识符,在MongoDB数据库中通常用作文档ID。 它可以用主键。 (PR # 2035 )添加对嵌入式对象的支持。 嵌入式对象是由单个父对象拥有的对象,当该父对象被删除或其父对象不再引用它们时,嵌入式对象也会被删除。 嵌入式对象是通过子类化
EmbeddedObject
而不是RealmObject
来声明的。 不允许重新分配嵌入式对象,也不允许从多个父对象链接到该对象。 也不允许直接查询嵌入式对象,因为它们应被视为属于其父项的复杂结构,而不是独立运行的对象。 一个简单的示例是:public class Address : EmbeddedObject { public string Street { get; set; } public string City { get; set; } } public class Person : RealmObject { public string Name { get; set; } // Address is an embedded object - you reference it as usual public Address Address { get; set; } } public class Company : RealmObject { public string PhoneNumber { get; set; } // Embedded objects can be contained in lists too public IList<Address> OfficeAddresses { get; } }
添加了用于实例化嵌入式对象的新动态方法:
Realm.DynamicApi.CreateEmbeddedObjectForProperty
应用于创建嵌入式对象并将其分配给父项的属性。 例如:// static API var person = new Person(); person.Address = new Address { City = "New York" }; // dynamic API var dynamicPerson = realm.DynamicApi.CreateObject("Person"); var address = realm.DynamicApi.CreateEmbeddedObjectForProperty(dynamicPerson, "Address") address.City = "New York";
Realm.DynamicApi.AddEmbeddedObjectToList
应用于创建嵌入式对象并将其添加到父项的列表属性中。Realm.DynamicApi.InsertEmbeddedObjectInList
应用于创建嵌入式对象并将其插入父级列表属性中的指定索引处。Realm.DynamicApi.SetEmbeddedObjectInList
应用于创建嵌入式对象并将其设立在父项列表属性中的索引处。// static API var company = new Company(); company.OfficeAddresses.Add(new Address { City = "New York" }); company.OfficeAddresses.Insert(0, new Address { City = "Palo Alto" }); company.OfficeAddresses[1] = new Address { City = "New Jersey" }; // dynamic API var dynamicCompany = realm.DynamicApi.CreateObject("Company"); var officeToAdd = realm.DynamicApi.AddEmbeddedObjectToList(dynamicCompany.OfficeAddresses); officeToAdd.City = "New York"; var officeToInsert = realm.DynamicApi.InsertEmbeddedObjectInList(dynamicCompany.OfficeAddresses, 0); officeToInsert.City = "Palo Alto"; var officeToSet = realm.DynamicApi.SetEmbeddedObjectInList(dynamicCompany.OfficeAddresses, 1); officeToSet.City = "New Jersey";
Realm文件的内存映射方案已更改,以更好地支持打开超大文件。
替换了string查询解析器的实施(用于
realm.All().Filter("some-string-query")
的解析器)。 这使得原生二进制文件的大小减少了约5 %,同时查询执行时间与旧解析器持平。 (PR # 2185 ,核心升级)优化了处理类型之间转换的内部代码。 这应该会导致大多数数据操作的性能略有提升,这在提前编译的平台(例如 iOS/UWP)上最为明显。 由于此更改的性质,以前在处理动态对象时自动进行的转换可能不再自动进行。 如果您遇到带有消息
No conversion exists from *type A* to *type B*
的NotSupportedException
并认为这是一个错误,请打开一个 Github 问题。 (PR # 2149 )添加了额外的编译时检查以检测错误的 List
声明并建议 IList 用于 Realm 对象中的集合属性。 (问题# 2083 ) 为可返回值的
Realm.Write
和Realm.WriteAsync
添加了重载。 (问题# 2081 )
固定
- 解决了 .NET Native 编译器(用于 UWP 项目)的问题,该问题可能导致在版本
Incompatible MarshalAs detected in parameter named 'value'. Please refer to MCG's warning message for more information.
中引发以下异常。 (问题# 2169 ) - 修复了一个错误,该错误可能导致在.NET Core 3.0或更高版本上运行的应用程序迁移期间读取不正确的属性值。 当不同的类具有相同名称的持久属性时,此问题就会出现,并可能导致访问错误的属性,例如
foo.Name
可能会返回foo.Bar
。 这种情况仅在迁移期间使用动态API时才会发生,并且不会影响使用强类型API或在.NET Core 3 .x/ .NET 5以外平台上运行的应用。 - 修复了一个错误,该错误可能在多进程场景中导致死锁,在该多进程场景中,多个进程股票同一个Realm 文件并侦听来自该文件的通知。 (核心升级)
- 修复了删除和重新创建具有嵌入式对象的对象时出现的问题。 (核心升级)
- 修复了一个争用条件,该条件会导致“通知程序线程中未捕获的异常:N 5 域 15 InvalidTableRefE: transaction_ended”,以及在首次运行集合期间的特定时间关闭或使源Realm导致崩溃通知程序(核心升级)
- 修复当没有匹配项时对索引string列进行不区分大小写查询时崩溃的问题(核心升级)
兼容性
- Realm Studio: 10.0.0或更高版本。
内部资料
- 使用 Core 10.3.3 。
- 已迁移到 bison 解析器。
- 除了 Mixpanel 之外,还将分析提交到 S 3 /Segment。
- 现在,分析还可以报告同步功能是否正在使用中。
- SDK 现在还针对.NET 5进行了测试。
- 此版本使用捆绑 Core、Sync 和操作系统的单一存储库版本。
- 将基于表达式的操作符替换为 T 4 。 (PR # 2149 )
5.1.3 ( 2021 - 02 - 10 )
固定
- 如果对索引的string列进行不区分大小写的查询,则查询可能会失败,从而导致“没有这样的键”异常。 (核心升级)
- 修复当没有匹配项时,对索引string列进行不区分大小写查询时崩溃的问题。 (核心升级)
- 在32位设备上升级的文件最终可能会不一致,从而引发“未找到密钥”异常。 (核心升级)
- 修复文件格式升级后创建对象可能会失败并出现断言
Assertion failed: lo() <= std::numeric_limits<uint32_t>::max()
的问题。 (核心升级)
兼容性
- Realm对象服务器: 3.23.1或更高版本。
- Realm Studio: 5.0.0或更高版本。
内部资料
- 使用同步5.0.32和核心6.2.3 。
- 将 QuickJournal示例更新到最新的Realm和Xamarin.Forms 版本。 (PR # 2057 )
5.1.2 ( 2020 - 10 - 20 )
固定
- 修复了一个问题,该问题会导致在 UWP 应用程序的主线程上访问 Realm 实例时引发
Realm accessed from incorrect thread
异常。 (问题# 2045 )
兼容性
- Realm对象服务器: 3.23.1或更高版本。
- Realm Studio: 5.0.0或更高版本。
内部资料
- 使用同步5.0.28和核心6.1.3 。
- 将 QuickJournal示例更新到最新的Realm和Xamarin.Forms 版本。 (PR # 2057 )
5.1.1 ( 2020 - 10 - 02 )
增强功能
- 无
固定
- 对索引属性进行查询可能会出现“未找到密钥”异常。 (核心升级)
- 修复对不可为空的索引整数列的 null 查询返回零条目结果的问题。 (核心升级)
兼容性
- Realm对象服务器: 3.23.1或更高版本。
- Realm Studio: 5.0.0或更高版本。
内部资料
- 使用同步5.0.28和核心6.1.3 。
5.1.0 ( 2020 - 09 - 30 )
增强功能
- 大幅提高对索引string或整型列进行 NOT IN 查询的性能。 (核心升级)
固定
- 修复了一个问题,该问题会导致在 WPF 应用程序的主线程上使用Realm引发异常,并显示“从不正确的线程访问Realm ”消息。 (问题# 2026 )
- 修复了一个问题,该问题可能导致打开加密 Realm 时出现异常,并显示“此版本的 Realm 不支持打开格式版本为0的 Realm 文件”消息。 (核心升级)
- 略微提高大多数从Realm 文件读取数据的操作的性能。 (核心升级)
- 对以前具有多个匹配项且现在具有一个匹配项的索引string列重新运行 equals查询,有时会引发“未找到键”异常。 (核心升级)
- 查询链接为条件一部分的表时,如果最近向目标表添加了对象,则应用程序可能会崩溃。 (核心升级)
兼容性
- Realm对象服务器: 3.23.1或更高版本。
- Realm Studio: 5.0.0或更高版本。
内部资料
5.0.1 ( 2020 - 09 - 10 )
注意:此版本将Realm 文件格式提升到11版本。 无法降级到10版本或更早版本。 使用旧版本Realm创建的文件将自动升级。 只有Realm Studio 5.0.0或更高版本才能打开新的文件格式。
增强功能
- 添加了“冻结对象”的概念 - 这些是已在特定版本中“冻结”的对象、查询、列表或 Realm。 这允许您从任何线程访问数据,但数据永远不会改变。 所有冻结对象都可以正常访问和查询,但尝试更改它们或添加变更侦听器将引发异常。 (问题# 1945 )
- 添加了
Realm.Freeze()
、RealmObject.Freeze()
、RealmObject.FreezeInPlace()
、IQueryable<RealmObject>.Freeze()
、IList<T>.Freeze()
和IRealmCollection<T>.Freeze()
。 这些方法将生成调用它们的实例的冻结版本。 - 添加了
Realm.IsFrozen
、RealmObject.IsFrozen
和IRealmCollection<T>.IsFrozen
,它们会返回数据是否被冻结。 - 已添加
RealmConfigurationBase.MaxNumberOfActiveVersions
。 如果同时存在的Realm数据版本过多,设置此项将导致Realm抛出异常。 版本过多会急剧增加Realm文件的大小。
- 添加了
- 添加支持
SynchronizationContext
限制的 Realm 的支持。 队列限制的 Realm 并不绑定到特定线程,而是绑定到SynchronizationContext
,无论它是在同一线程还是不同线程上分派工作。 在SynchronizationContext.Current
为空时打开Realm (尤其是Task.Run(...)
)仍会将Realm限制在打开它的线程中。 - 在Realm文件中存储大型二进制 blob 不再强制文件大小至少为最大 blob 的8倍。
- 减小存储在Realm 文件中的ACID 事务日志的大小,从而减少大型事务导致的文件大小增长。
- string主键不再需要单独的索引,从而在不影响查找性能的情况下提高插入和删除性能。
固定
- 修复在向列表添加对象并同时删除包含该列表的对象时引发
Access to invalidated List object
的问题。 (问题# 1971 ) - 修复了在应用了带有排序子句的string筛选器的查询上使用
.ElementAt()
时返回不正确结果的问题。 (PR # 2002 )
兼容性
- Realm对象服务器: 3.23.1或更高版本。
- Realm Studio: 5.0.0或更高版本。
内部资料
- 使用同步5.0.22和核心6.0.25 。
4.3.0 ( 2020 - 02 - 05 )
增强功能
- 公开一个 API,以便在通过
userId
isAdmin
创建档案时配置用户的 和Credentials.CustomRefreshToken
。以前,这些值是从 JSON web token 本身推断出来的,但由于无法强制执行服务器配置,决定 JSON web token 有效负载中的哪些字段表示userId
和isAdmin
字段,现在由使用者决定来确定这些值。 - 改进 Apple 平台上 SSL 问题的日志记录和错误处理。
固定
- 现在可以使用
System.Runtime.Serialization.Formatters
和System.Xml.Serialization
序列化器正确序列化 Realm 对象。 (问题# 1913 )该类的私有状态字段已用[NonSerialized]
和[XmlIgnore]
属性修饰,以便热切选择退出序列化器不会尝试序列化Realm
和ObjectSchema
等字段,这些字段包含非托管数据的句柄。 - 修复了对
IList<string>
属性应用[Required]
时会导致编译错误的问题。 (贡献者: braudabaugh ) - 修复了导致包含 Realm NuGet 包的项目无法调试的问题。 (PR # 1927 )
- 同步客户端在集成变更集失败后将无法重新连接。 该错误会导致客户端的 Realm 文件进一步损坏。 (自3.0.0起)。
- 过去,在查询反向链接属性时,基于字符串的查询解析器 (
results.Filter(...)
) 需要类名使用class_
前缀。 此问题已修复,因此只需公共ObjectSchema
名称即可。 示例,@links.class_Person.Siblings
变为@links.Person.Siblings
。 - 修复
ClientResyncMode.DiscardLocalRealm
无法重置模式的问题。
兼容性
- Realm对象服务器: 3.23.1或更高版本。
内部资料
- 将 Sync 从4.7.5升级到4.9.5 ,并将 Core 从5.23.3升级到5 。 23 。 8 。
4.2.0 ( 2019 - 10 - 07 )
增强功能
- 已将
int IndexOf(object)
和bool Contains(object)
添加到IRealmCollection
接口。 (PR # 1893 ) - 公开了一个API -
SyncConfigurationBase.EnableSessionMultiplexing()
,允许在同步客户端上切换会话多路复用。 (PR 1896 ) - 添加了对使用
Realm.GetInstanceAsync
时更快初始下载的支持。 (问题1847 ) - 向
Realm.GetInstanceAsync
添加了可选的cancellationToken
参数,支持彻底取消进行中的下载。 (PR 1859 ) - 添加了对客户端重新同步的支持,客户端重新同步将在服务器回滚时自动恢复本地 Realm。 这在很大程度上取代了完全同步 Realm 的客户端重置机制。 可以使用
FullSyncConfiguration.ClientResyncMode
进行配置。 (PR # 1901 ) - 已将
Credentials.UsernamePassword
中的createUser
参数设为可选项。 如果未指定,则在用户已存在的情况下,将创建或登录该用户。 (PR # 1901 ) - 使用 Fody 6.0.0 ,解决了与其他基于 Fody 的项目的较新版本的一些兼容性问题。 (问题# 1899 )
固定
- 修复了调用
RealmCollectionBase<T>.IndexOf
时的无限递归问题。 (问题# 1892 )
兼容性
- Realm对象服务器: 3.23.1或更高版本。
内部资料
- 将 Sync 从4.7.0升级到4.7.1 。
- 绕过同步代理,实现对 Cloud 上同步工作线程的直接访问权限:如果域的令牌刷新响应包含同步工作线程 路径字段,则绑定将覆盖同步会话的 URL 前缀。
4.1.0 ( 2019 - 08 - 06 )
重大更改
- 已从
Credentials.Nickname
中删除isAdmin
参数。 无论如何,它对新的 ROS 版本没有任何影响,因为不支持登录管理员昵称用户 - 这一更改只是使其明确。 (问题# 1879 ) - 将
Credentials.Nickname
方法标记为已弃用 - ROS 中已弃用对昵称身份验证提供商的支持,并将在未来版本中删除。 (问题# 1879 ) - 已从
PermissionDeniedException.DeleteRealmInfo
中删除deleteRealm
参数,因为传递false
不起作用。 现在,调用该方法等同于使用deleteRealm: true
进行调用。 (PR # 1890 )
增强功能
- 在 Windows 域路径和文件名中添加了对 unicode 字符的支持。 (核心升级)
- 添加了新的凭证类型:
Credentials.CustomRefreshToken
,可用于创建具有自定义刷新令牌的用户。 然后,ROS 将根据配置的refreshTokenValidators
进行验证,以便在打开Realm时获取访问权限令牌。 如果创建这样的用户,则开发者有责任确保令牌有效并根据需要进行刷新,以确保访问权限令牌。 为此,您现在可以通过调用User.RefreshToken = "my-new-token"
来设立用户对象的刷新令牌。 这只应与通过调用Credentials.CustomRefreshToken
获取的用户结合使用。 (PR # 1889 )
固定
- 构造 IncludeDescriptor 会进行不必要的表比较。 这会导致使用
includedBacklinks
创建基于查询的订阅 (Subscription.Subscribe
) 时性能不佳。 (核心升级) - 涉及索引 int 列的查询会给出不正确的结果,而该列受顺序与表顺序不同的 LinkList 约束。 (核心升级)
- 涉及索引 int 列的查询如果运行多次,则会出现内存泄漏。 (核心升级)
兼容性
- Realm对象服务器: 3.23.1或更高版本。
内部资料
- 将 Sync 从4.5.1升级到4.7.0 ,并将 Core 5.20.0升级到5 。 23 。 1 。
4.0.1 ( 2019 - 06 - 27 )
固定
修复了一个问题,该问题会导致iOS应用无法发布到App Store ,并出现以下错误:
此捆绑包 Payload/.../Frameworks/realm-wrappers.framework 无效。 Info.plist 文件缺少所需的键:CFBundleVersion。
(第1870期,从4.0.0开始)
修复了可能导致 iOS 应用在设备上启动时崩溃的问题。 (第1871期,从4.0.0开始)
4.0.0 ( 2019 - 06 - 13 )
重大更改
- 以下已弃用的方法和类已被删除:
SyncConfiguration
类已分割为FullSyncConfiguration
和QueryBasedSyncConfiguration
。 使用这些类之一连接到Realm对象服务器。TestingExtensions.SimulateProgress
方法已被删除,因为它已经有一段时间不起作用了。Property.IsNullable
属性已被删除。 要检查属性是否可为 null,请检查Property.Type
中是否有PropertyType.Nullable
标志。Credentials.Provider
类已被删除。 以前,它包含一些主要供内部使用的常量。User.ConfigurePersistance
方法已被SyncConfigurationBase.Initialize
取代。User.LogOut
已删除,取而代之的是User.LogOutAsync
。User.GetManagementRealm
已删除,取而代之的是包装器API的User.ApplyPermissionsAsync
设立。User.GetPermissionRealm
已删除,取而代之的是User.GetGrantedPermissions
包装器API。
- 已弃用
IQueryable<T>.Subscribe(string name)
扩展方法,改用IQueryable<T>.Subscribe(SubscriptionOptions options)
。 - 重新设计了权限API的内部实施。 在大多数情况下,方法签名没有更改,或者在方法签名发生更改的情况下, API仍然接近原始版本(例如
IQueryable<T>
已更改为IEnumerable<T>
)。 (问题 # 1863 )- 将
User.GetGrantedPermissionsAsync
的返回类型从IQueryable<PathPermission>
更改为IEnumerable<PathPermission>
。 这意味着该集合不再像常规的 Realm 支持的集合那样可观察。 如果需要通知此集合的更改,则需要自己实现基于轮询的机制。 PathPermission.MayRead/MayWrite/MayManage
已弃用,取而代之的是更加一致的AccessLevel
API。- 在
User.ApplyPermissionsAsync
中,将realmUrl
参数重命名为realmPath
。 - 在
User.OfferPermissionsAsync
中,将realmUrl
参数重命名为realmPath
。 - 删除了
PermissionOfferResponse
和PermissionChange
类。 - 删除了
IPermissionObject
接口。 - 删除了
ManagementObjectStatus
枚举。 - 删除了
User.GetPermissionChanges
和User.GetPermissionOfferResponses
方法。 User.GetGrantedPermissionsAsync
中的millisecondTimeout
参数已删除。PermissionException
类已替换为HttpException
。
- 将
AuthenticationException
类已合并到HttpException
类中。
增强功能
添加了
Session.Start()
和Session.Stop()
方法,可暂停/恢复与Realm对象服务器的同步。 (问题 # 138 )添加了
IQueryable<T>.Subscribe(SubscriptionOptions, params Expression<Func<T, IQueryable>>[] includedBacklinks)
扩展方法,该方法允许您为订阅配置其他选项,例如名称、生存时间以及是否应更新现有订阅。includedBacklinks
参数允许您指定在执行基于查询的同步时,哪些反向链接属性应包含在传递闭包中。 示例:class Dog : RealmObject { public Person Owner { get; set; } } class Person : RealmObject { [Backlink(nameof(Dog.Owner))] public IQueryable<Dog> Dogs { get; } } var options = new SubscriptionOptions { Name = "adults", TimeToLive = TimeSpan.FromDays(1), ShouldUpdate = true }; var people = realm.All<Person>() .Where(p => p.Age > 18) .Subscribe(options, p => p.Dogs); await people.WaitForSynchronzationAsync(); // Dogs that have an owner set to a person that is over 18 // will now be included in the objects synchronized locally. var firstPersonDogs = people.Results.First().Dogs;
添加了
Realm.GetAllSubscriptions()
扩展方法,该方法允许您获取所有已注册的基于查询的同步订阅的集合。 (问题 # 1838 )向
PathPermission
添加了AccessLevel
属性,以取代现已弃用的MayRead/MayWrite/MayManage
。 (问题 # 1863 )向
PathPermission
添加了RealmOwnerId
属性,用于指示 Realm 的所有者是谁。 (问题 # 1863 )添加了对使用
dotnet build
进行构建的支持(之前仅支持msbuild
命令行)。 ( PR # 1849 )改进当查询具有长 OR 条件链时未索引string列的查询性能。 (核心升级)
通过利用硬件优化的加密函数,显着提高了加密和解密的性能。 (核心升级)
将 Realm 压缩到加密文件中可能需要很长时间。 现在,通过调整相对于 Realm 中已用空间的写入缓冲区大小,优化了该进程。 (核心升级)
除了最初支持的“@”分隔符之外,基于字符串的查询解析器 (
results.Filter("...")
) 现在还支持带有“T”分隔符的可读时间戳。 示例:startDate > 1981-11-01T23:59:59:1
(核心升级)
固定
- 修复了以下问题:在 LINQ 查询中使用
StringExtensions.Contains(string, string, StringComparison)
扩展方法会导致 .NET Core 2.1 + 或 Xamarin.iOS/Android 上引发异常 项目。(问题 # 1848 ) - 在创建 int 主键为“null”的对象后创建对象会遇到断言失败。 (核心升级)
兼容性
- Realm对象服务器: 3.23.1或更高版本。
内部资料
- 将 Sync 从3.14.11升级到4.5.1 ,并将 Core 5.12.7升级到5 。 20 。 0 。
3.4.0 ( 2019 - 01 - 09 )
注意! 您需要将Realm对象MongoDB Server至少升级到版本 3.11.0 或使用Realm Cloud。 如果您尝试连接到 ROS 3.10 .x 或更早版本,您将看到类似Wrong protocol version in Sync HTTP request, client protocol version = 25, server protocol version = 24
的错误。
增强功能
- 现在,即使没有本地更改,也会向服务器报告下载进度。 这允许服务器更积极地进行历史压缩,尤其是当有许多客户端很少或从不进行本地更改时。 ( # 1772 )
- 在集成 ROS 发送的同步更改时减少内存使用量。
- 添加了通过指定
SyncConfigurationBase.CustomLogger
能力自定义日志函数的功能,用于处理 Sync 发出的日志。 必须在打开同步Realm之前进行设立。 ( # 1824 ) - 使用协议25的客户端现在会向服务器报告下载进度,即使它们未进行本地更改也是如此。 这允许服务器更积极地进行历史压缩,尤其是当有许多客户端很少或从不进行本地更改时。 ( # 1772 )
- 将 User-Agent 标头添加到向HTTPRealm 对象 发出的MongoDB Server 请求中。默认情况下,其中包含有关 Realm 库版本和 .NET 平台的信息。 在打开同步的 Realm 之前设置
SyncConfigurationBase.UserAgent
可以提供其他详细信息(例如应用程序名称/版本)。 如果开发 Xamarin 应用,您可以使用 Xamarin.Essentials 插件自动执行此操作:SyncConfiguration.UserAgent = $"{AppInfo.Name} ({AppInfo.PackageName} {AppInfo.VersionString})"
。
固定
- 修复了一个错误,该错误可能导致崩溃并显示
Assertion failed: ndx < size() with (ndx, size()) = [742, 742]
等消息。 - 修复了导致设置
SyncConfigurationBase.LogLevel
时向 Sync 发送不正确的LogLevel
的错误。 ( # 1824 ,自2.2.0起) - 修复了导致
Realm.GetInstanceAsync
与QueryBasedSyncConfiguration
一起使用时无法运行的错误。 ( # 1827 ,自3.1.0起)
重大更改
- 已弃用的方法
realm.SubscribeToObjectsAsync
已在此版本中删除。 ( # 1772 ) User.ConfigurePersistence
已弃用,取而代之的是SyncConfigurationBase.Initialize
。
兼容性
- Realm对象服务器: 3.11.0或更高版本。 同步协议版本已提升到版本25 。 服务器向后兼容使用协议版本24或更低版本的客户端,但版本25的客户端不向后兼容协议版本24的服务器。 必须先升级服务器,然后才能升级任何客户端。
内部资料
- 将 Sync 从3.9.2升级到3.14.11 ,并将 Core 从5.8.0升级到5 。 12 。 7 。
3.3.0 ( 2018 - 11 - 08 )
增强功能
- 在
SyncConfigurationBase
上公开了OnProgress
属性。 它允许您指定一个进度回调,在使用Realm.GetInstanceAsync
报告下载进度时将调用该回调。 ( # 1807 )
固定
- 以前,尝试在后台线程(没有
SynchronizationContext
)上调用Subscription.WaitForSynchronizationAsync
会无限期挂起。 现在,将引发一个有意义的异常,以指示不支持此操作,并且应在具有同步上下文的线程上调用此方法。 ( dotnet-private# 130 ,因为 v 3.0.0 )
兼容性
- Realm对象服务器: 3.0.0或更高版本。
- API 向后兼容3 .xy 系列中的所有以前版本。
- 文件格式:生成格式为 v 9的 Realm(读取并升级所有以前的格式)
3.2.1 ( 2018 - 09 - 27 )
缺陷修复
- 修复了一个错误,该错误通常会导致订阅查询时出现异常,并显示类似
An unknown error has occurred. State: *some-number-larger than 127*
的消息。 ( dotnet-private# 128 ,因为3.0.0
)
3.2.0 ( 2018 - 08 - 04 )
增强功能
RealmObject
现在,从 Realm 中删除继承者后,继承者会引发PropertyChanged
异常。 事件参数中的属性名称将为IsValid
。- 在 Linux 上捆绑一些常见的证书颁发机构,因此通过 SSL 连接到 ROS 实例对于大多数证书来说应该是开箱即用的。 值得注意的是,它现在可开箱即用地用于 Realm Cloud 实例。
缺陷修复
- 在构建比较无效/非托管 RealmObject 的查询时(例如
realm.All<Foo>().Where(f => f.Bar == someBar)
),现在将引发有意义的异常,而不是晦涩的 ArgumentNullException。 - 将
ShouldCompactOnLaunch
添加到库的 PCL 版本中。 ( dotnet-private# 125 )
3.1.0 ( 2018 - 07 - 04 )
增强功能
- 公开了一个
ChangeSet.NewModifiedIndices
集合,其中包含有关在新版本的集合中更改的对象索引的信息(即在考虑插入和删除后)。 - 将 Fody 更新为3.0 。
缺陷修复
WriteAsync
将不再在主线程上执行同步Refresh
。 ( # 1729 )- 尝试将托管Realm对象添加到同一磁盘上Realm的不同实例中将不再引发异常。
- 删除了Realm集合的
IList
合规。 此版本修复了在 Android 上从绑定到Realm集合的 ListView 中取消选择项目时导致应用挂起的问题。
重大更改
SyncConfiguration
现已弃用,并将在未来版本中删除。 已公开两个新的配置类 — QueryBasedSyncConfiguration和FullSyncConfiguration 。 如果您将SyncConfiguration
与IsPartial = true
一起使用,则更改代码以使用QueryBasedSyncConfiguration
。 同样,如果未设置IsPartial
或已设置为false
,则使用FullSyncConfiguration
。- 删除了Realm集合的
IList
合规。 这将阻止自动更新 UWP 项目中绑定到Realm集合的 ListViews 数据。
3.0.0 ( 2018 - 04 - 16 )
增强功能
- 允许将
[MapTo]
应用于类,以更改与该类对应的表的名称。 ( # 1712 ) - 添加了改进的 API,用于在部分同步的 Realm 中添加订阅。
IQueryable<T>.Subscribe
可用于订阅任何查询,返回的Subscription<T>
对象可用于观察订阅的状态并最终删除订阅。 有关更多信息,请参阅文档。 ( # 1679 ) - 添加了细粒度的权限系统,用于部分同步的 Realm。 这样就可以在单个对象或类的级别定义权限。 有关更多信息,请参阅文档。 ( # 1714 )
- 公开基于字符串的
IQueryable<T>.Filter(predicate)
方法以启用更高级的查询场景,例如:- 点击链接:
realm.All<Dog>().Filter("Owner.FirstName BEGINSWITH 'J'")
。 - 集合查询:
realm.All<Child>().Filter("Parents.FirstName BEGINSWITH 'J'")
- 查找父项名称以 J 或realm.All<Child>().Filter("Parents.@avg.Age > 50")
开头的所有子项 - 查找父项平均年龄大于50的所有子项。 - 子查询:
realm.All<Person>().Filter("SUBQUERY(Dogs, $dog, $dog.Vaccinated == false).@count > 3")
- 查找所有拥有超过3只未接种疫苗的狗的人。 - 排序:
realm.All<Dog>().Filter("TRUEPREDICATE SORT(Owner.FirstName ASC, Age DESC)")
- 查找所有狗,并按主人的名字升序排序,然后按狗的年龄降序排序。 - Distinct:
realm.All<Dog>().Filter("TRUEPREDICATE DISTINCT(Age) SORT(Name)")
- 查找所有狗,按名称排序,并为每个年龄值选择一只狗。 - 有关更多示例,请查看查询语言参考Docs或NSPredicate Cheatsheet 。
- 点击链接:
SyncConfiguration
构造函数现在接受相对 URI。 ( # 1720 )- 添加了以下用于重置用户密码和确认其电子邮件的方法:
RequestPasswordResetAsync
、CompletePasswordResetAsync
、RequestEmailConfirmationAsync
和ConfirmEmailAsync
。 这些仅应用于通过Credentials.UsernamePassword
创建的用户,这些用户提供了电子邮件作为用户名。 ( # 1721 )
缺陷修复
- 修复了解析线程安全引用时可能在 Android 设备上导致死锁的错误。 ( # 1708 )
重大更改
- 使用与 ROS 2 .x 不兼容的 Sync 3.0客户端。
Permission
已重命名为PathPermission
,以更准确地反映其用途。 此外,现有的修改权限的方法仅适用于完整的 Realm。 引入新的方法和类来配置对部分同步Realm的访问权限。RealmConfiguration.DefaultConfiguration
的类型已更改为RealmConfigurationBase
,以允许将任何子类设置为默认值。 ( # 1720 )SyncConfiguration
构造函数参数现在是可选的。user
值默认为当前登录的用户,serverUri
值默认为realm://MY-SERVER-URL/default
,其中MY-SERVER-URL
是用户进行身份验证所依据的托管。 ( # 1720 )- 为保持一致性,
User.LoginAsync(credentials, serverUrl)
和User.GetLoggedInUser(identity, serverUrl)
中的serverUrl
参数已重命名为serverUri
。 ( # 1721 )
2.2.0 ( 2017 - 03 - 22 )
增强功能
- 向
RealmConfigurationBase
添加了IsDynamic
属性,允许您打开 Realm 文件并从磁盘读取其模式。 ( # 1637 ) - 添加了新的
InMemoryConfiguration
类,允许您创建内存中Realm 实例。 ( # 1638 ) - 允许直接设置列表元素 - 例如
foo.Bars[2] = new Bar()
或foo.Integers[3] = 5
。 ( # 1641 ) - 添加JSON web token ( JSON web token )凭证提供商。 ( # 1655 )
- 添加了匿名和昵称凭证提供程序。 ( # 1671 )
缺陷修复
- 修复初始集合更改通知未传递给所有订阅者的问题。 ( # 1696 )
- 修复了一个极端情况:对于不再由 Realm 托管的对象,
RealmObject.Equals
会返回true
。 ( # 1698 )
重大更改
SyncConfiguration.SetFeatureToken
已弃用,不再需要使用 Sync on Linux或服务器端功能。 ( # 1703 )
2.1.0 ( 2017 - 11 - 13 )
增强功能
- 添加了可应用于类或程序集的
[Explicit]
属性。 如果一个类用它修饰,那么它就不会包含在 Realm 的默认模式中(即 您必须将RealmConfiguration.ObjectClasses
显式设置为包含该类的数组)。 同样,如果将其应用于程序集,则该程序集中的所有类都将被视为显式类。 在开发依赖于 Realm 的3第三方库时,这非常有用,可以避免内部类泄漏到用户模式中。 ( # 1602 )
缺陷修复
- 修复了一个错误,该错误会阻止编写检查相关对象是否为 null 的查询,例如
realm.All<Dog>().Where(d => d.Owner == null)
。 ( # 1601 ) - 解决了禁用“仅我的代码”时导致调试器报告引发未观察到的异常的问题。 ( # 1603 )
- 在同步的Realm上调用
Realm.DeleteRealm
现在将正确删除realm.management
文件夹。 ( # 1621 ) - 修复了访问使用动态模式(例如在迁移中)打开的 Realm 中对象的原始列表属性时发生崩溃的问题。 ( # 1629 )
2.0.0 ( 2017 - 10 - 17 )
增强功能
- 添加了对原始值集合的支持。 您现在可以将属性定义为
IList<T>
,其中T
可以是Realm支持的任何类型,但另一个IList
除外。 因此,许多以前对RealmObject
有约束的方法现在可以接受任何类型,并且如果与不受支持的类型参数一起使用,则可能会引发运行时异常。 ( # 1517 ) - 添加了
HelpLink
,它指向大多数 Realm 异常的文档相关部分。 ( # 1521 ) - 添加了
RealmObject.GetBacklinks
API 以动态获取引用当前对象的所有对象。 ( # 1533 ) - 添加了新的异常类型
PermissionDeniedException
,用于表示在使用同步 Realm 时出现权限被拒绝错误,该同步 Realm 会公开方法DeleteRealmUserInfo
来通知绑定应立即保留或删除有问题的 Realm 文件。 这允许以更稳健的方式从权限被拒绝错误中恢复。 ( # 1543 ) - Realm 用于管理 Apple 平台上同步相关元数据的加密密钥的钥匙串服务名称现在设置为捆绑包标识符。 之前存储在特定于 Realm 的钥匙串服务中的密钥将透明地迁移到针对每个应用程序的钥匙串服务中。 ( # 1522 )
- 添加了新的异常类型 —
IncompatibleSyncedFileException
— 允许您处理和执行从传统 ( 1 迁移 ) Realm 文件复制到新的2 .x 格式。 使用Realm.GetInstance
或Realm.GetInstanceAsync
时可能会引发该错误,并会公开GetBackupRealmConfig
方法,该方法允许您以动态模式打开旧Realm 文件并迁移任何所需的数据。 ( # 1552 ) - 在 Windows 上启用加密。 ( # 1570 )
- 在 Windows 上启用 Realm 压缩。 ( # 1571 )
UserInfo
得到了显着增强。 它现在包含存储在Realm对象服务器上的用户的元数据,以及与该用户关联的所有用户帐户数据的列表。 ( # 1573 )- 引入了新方法 -
User.LogOutAsync
来替换现已弃用的同步调用。 ( # 1574 ) - 在
RealmObject
上公开了BacklinksCount
属性,该属性返回通过对一或对多关系引用当前对象的对象数量。 ( # 1578 ) - string主键现在支持将
null
作为值。 ( # 1579 ) - 添加对部分同步的预览支持。 部分同步允许以仅将用户请求的对象同步到设备的方式打开同步的Realm 。 要使用它,可以在
SyncConfiguration
上设置IsPartial
属性,打开Realm ,然后使用您感兴趣的对象类型调用Realm.SubscribeToObjectsAsync
,该字符串是一个string ,其中包含确定您要订阅哪些对象的查询to,以及报告结果的回调。 您可以根据需要向同步Realm添加任意数量的订阅。 ( # 1580 ) - 确保 Realm 集合(
IList<T>
、IQueryable<T>
)在foreach
循环中进行迭代时不会更改。 ( # 1589 )
缺陷修复
Realm.GetInstance
会将 Realm 升级到最新版本,因此此后您无需再手动调用Refresh
。 ( # 1523 )- 修复了导致 iOS 共享扩展项目无法运行的问题。 ( # 1535 )
重大更改
Realm.CreateObject(string className)
现在多了一个参数object primaryKey
。 使用动态 API 创建新对象时,必须传递该参数。 如果要创建的对象没有声明主键,请传递null
。 ( # 1381 )AcceptPermissionOfferAsync
现在返回用户已被授予权限的Realm的相对 URL,而不是绝对 URL。 ( # 1595 )
1.6.0 ( 2017 - 08 - 14 )
增强功能
- 公开
Realm.WriteCopy
API ,用于复制Realm 文件,并可以选择使用不同的密钥对其进行加密。 ( # 1464 ) - 所有Realm集合(
IQueryable<T>
和IList<T>
)的运行时表示现在都实现了IList
接口,而该接口是在 UWP 应用程序中将数据绑定到ListView
所需的。 ( # 1469 ) - 公开
User.RetrieveInfoForUserAsync
API ,以允许管理员用户在Realm对象MongoDB Server中查找其他用户的身份。 例如,这可用于通过了解用户的Facebook ID来查找用户。 ( # 1486 ) - 在创建模式时添加了一项检查,以验证没有重复的对象名称。 ( # 1502 )
- 在将无效的 URL 模式传递给
SyncConfiguration
或User.LoginAsync
时,添加了更全面的错误消息。 ( # 1501 ) - 为
Realm.GetInstanceAsync
引发的异常添加了更有意义的错误信息。 ( # 1503 ) - 添加了新类型
RealmInteger<T>
,以通过基本整数类型公开 Realm 特定的 API。 它可用于在同步 Realm 中实现计数器功能。 ( # 1466 ) - 添加了
PermissionCondition.Default
以对现有用户和新用户应用默认权限。 ( # 1511 )
缺陷修复
- 修复比较查询中的非常量字符值时引发的异常。 ( # 1471 )
- 修复比较查询中的非常量字节或短值时引发的异常。 ( # 1472 )
- 修复在 Realm 的 IQueryable 结果上调用非泛型版本的
IQueryProvider.CreateQuery
时会引发异常的错误。 ( # 1487 ) - 现在,尝试在 LINQ查询中使用
IList
或IQueryable
属性会引发NotSupportedException
,而不是导致应用崩溃。 ( # 1505 )
重大更改
1.5.0 ( 2017 - 06 - 20 )
增强功能
- 在
User
类上公开了用于处理权限的新 API:( # 1361 )ApplyPermissionsAsync
OfferPermissionsAsync
和AcceptPermissionOfferAsync
允许您授予、撤销、提供和接受权限。GetPermissionOffers
GetPermissionOfferResponses
和GetPermissionChanges
允许您查看通过上述方法添加的对象。GetGrantedPermissionsAsync
允许您检查授予当前用户或由当前用户授予的权限。
- 与
RealmConfiguration
一起使用时(即 本地Realm ),Realm.GetInstanceAsync
将执行可能代价高昂的操作,例如在背景线程上执行迁移或压实。 ( # 1406 ) - 公开
User.ChangePasswordAsync(userId, password)
API以允许管理员用户更改其他用户的密码。 ( # 1412 ) - 公开
SyncConfiguration.TrustedCAPath
API以允许提供自定义 CA,该 CA 将用于验证Realm对象MongoDB Server的 SSL 流量。 ( # 1423 ) - 公开
Realm.IsInTransaction
API以检查该Realm是否有活动ACID 事务。 ( # 1452 )
缺陷修复
- 修复查询应用了
[MapTo]
的属性时出现的崩溃问题。 ( # 1405 ) - 修复同步 Realm 在某些情况下无法连接到远程服务器的问题,例如在打开 Realm 但后来重新获得网络连接时应用程序处于脱机状态。 ( # 1407 )
- 修复当实际已更改属性低于
Backlink
属性时,会将不正确的属性名称传递给RealmObject.PropertyChanged
订阅者的问题。 ( # 1433 ) - 修复在 PCL 测试程序集中引用 Realm 而不实际使用它时引发的异常。 ( # 1434 )
- 修复了
SyncConfiguration.EnableSSLValidation
在传递给Realm.GetInstanceAsync
时被忽略的错误。 ( # 1423 )
重大更改
PermissionChange
、PermissionOffer
和PermissionOfferResponse
的构造函数现在是私有的。 使用新的User.ApplyPermissionsAsync
、User.OfferPermissionsAsync
和User.AcceptPermissionOfferAsync
API。 ( # 1361 )User.GetManagementRealm
和User.GetPermissionRealm
现已弃用。 在User
上使用与权限相关的新API可以实现相同的结果。 ( # 1361 )User.ChangePassword(password)
已重命名为User.ChangePasswordAsync(password)
。 ( # 1412 )- 删除了以下过时的API:( # 1425 )
Realm.ObjectForPrimaryKey<T>(long id)
Realm.ObjectForPrimaryKey<T>(string id)
Realm.ObjectForPrimaryKey(string className, long id)
Realm.ObjectForPrimaryKey(string className, string id)
Realm.Manage<T>(T obj, bool update)
Realm.Close()
Realm.CreateObject<T>()
IOrderedQueryable<T>.ToNotifyCollectionChanged<T>(Action<Exception> errorCallback)
IOrderedQueryable<T>.ToNotifyCollectionChanged<T>(Action<Exception> errorCallback, bool coalesceMultipleChangesIntoReset)
IRealmCollection<T>.ObjectSchema
Realm.DeleteRealm
now,如果在该Realm实例仍处于打开状态时调用,则会抛出异常。
1.4.0 ( 2017 - 05 - 19 )
增强功能
- 公开可用于初始化目的的
RealmObject.OnManaged
虚拟方法,因为构造函数在对象了解其Realm之前运行。 (# 1383 ) - 公开
Realm.GetInstanceAsync
API以异步打开同步Realm。 它将在背景线程上下载操作开始时的所有可用远程内容,然后返回可用的Realm。 这也是用户仅具有读取权限的 Realm 的唯一支持的打开方式。
1.3.0 ( 2017 - 05 - 16 )
通用Windows平台
隆重推出适用于通用Windows平台 (UWP) 的Realm移动数据库。 借助 UWP支持,您现在可以使用 Realm 的对象数据库为数百万由...提供支持Windows 10提供支持的移动设备、PC 和 Xbox 设备构建移动应用。 新增的 UWP支持允许.NET开发者使用Windows桌面 (Win 32 ) 或 UWP 为几乎任何现代Windows平台构建应用程序,以及通过Xamarin为iOS和 Android 构建应用程序。 请注意,同步支持尚不适用于 UWP,但我们正在努力解决这个问题,很快就会实现。
增强功能
- 针对string属性的不区分大小写查询现在使用基于Atlas Search的新索引。 (# 1380 )
- 如果使用 Realm 的“密码”身份验证提供程序,则添加
User.ChangePassword
API 以更改当前用户的密码。 需要任何版本的Realm对象MongoDB Server 1.4.0 或更高版本。 (# 1386 ) SyncConfiguration
现在有一个EnableSSLValidation
属性(默认为true
),允许在每台服务器的基础上指定 SSL 验证。 (# 1387 )- 在配置 Realm 时添加
RealmConfiguration.ShouldCompactOnLaunch
回调属性,以确定是否应在返回之前对其进行压缩。 (# 1389 ) - 在 iOS 上静默某些良性链接器警告。 (# 1263 )
- 使用可达性API最大限度地减少网络连接丢失时的重新连接延迟。 (# 1380 )
缺陷修复
- 修复
Session.Reconnect
不会重新连接所有会话的错误。 (# 1380 ) - 修复了多次订阅
PropertyChanged
时发生的崩溃。 (# 1380 ) - 修复重新连接到 Object MongoDB Server时出现的崩溃 (#1380)
- 修复了打开域 (# 1380 ) 时在某些 Android 7 .x 设备上崩溃的问题
1.2.1 ( 2017 - 05 - 01 )
缺陷修复
- 修复了在某些 Android 设备上引发
EntryPointNotFoundException
的问题。 (# 1336 )
增强功能
- 显示
IRealmCollection.IsValid
以指示 Realm 集合是否有效,可以使用。 (# 1344 ) - 更新 Fody 参考,增加对使用 Mono 5进行构建的支持。 (# 1364 )
1.2.0 ( 2017 - 04 - 04 )
Realm现在作为.NET标准1.4库进行分布式,因为这是支持 UWP 的要求。 虽然这在内部是一个相当大的举动,但使用它的应用程序不应受到影响。 升级后,您将看到添加了许多新的 NuGet 依赖项 - 这些是参考程序集,已经是 mscorlib 的一部分,因此不会影响应用程序的大小或性能。 此外,我们还发布了一个新的特定于平台的 DataBinding包,其中包含辅助方法,这些方法通过在设置属性时自动创建事务来启用双向数据绑定场景。
如果升级后遇到任何问题,建议清除bin
和obj
文件夹,然后重新启动Xamarin Studio。 如果这没有帮助,请文件问题,说明您的解决方案设置以及遇到的问题类型。
早期版本的 Realm 无法读取使用此版本写入的文件。 此版本与低于 1.3.0 的Realm对象MongoDB Server版本不兼容。
缺陷修复
- 修复
RemoveAll(string)
重载,使其正常工作。 (# 1288 ) - 解决了刷新无效会话的令牌时可能导致崩溃的问题。 (# 1289 )
- 在使用
IObservable
创建时,从session.GetProgressObservable
将正确调用OnComplete
mode: ProgressMode.ForCurrentlyOutstandingWork
。(# 1292 ) - 修复访问string属性时出现的内存泄漏问题。 (# 1318 )
- 修复了将
EncryptionKey
与同步 Realm 一起使用时出现的问题。 (# 1322 )
增强功能
- 引入 API 以在线程之间安全地传递对象。 通过将线程对象的线程安全引用传递给
ThreadSafeReference.Create
工厂方法,创建对该对象的线程安全引用,然后可以使用Realm.ResolveReference
将其安全地传递给另一个线程以在新 Realm 中进行解析。 (# 1300 ) - 引入用于尝试重新连接所有会话的 API。 它可以与连接插件结合使用,以监控连接更改并主动请求重新连接,而不是依赖内置的重试机制。 (# 1310 )
- 启用对对一关系的排序,例如
realm.All<Parent>().OrderBy(p => p.Child.Age)
。 (# 1313 ) - 引入可在针对根本的数据库引擎的 LINQ 查询中使用的
string.Like
扩展方法。 (# 1311 ) - 添加
User.IsAdmin
属性,指示用户是否为Realm对象MongoDB Server管理员。 (# 1320 )
重大更改
DateTimeOffset
0001-1-1
1970-1-1
在将对象传递给 后,未设置的属性现在将正确默认为realm.Add
,而不是 。(# 1293 )- 对于所有
IRealmCollection
实现,尝试获取超出范围的索引处的项目现在应该正确抛出ArgumentOutOfRangeException
。 (# 1295 ) - .lock 的布局 文件已更改,这可能会影响不同进程尝试同时写入同一 Realm 文件的场景。 (# 1296 )
PropertyChanged
通知使用一种更可靠的新机制,其行为与旧机制略有不同。 仅在提交ACID 事务后才会发送通知(使其与处理集合通知的方式一致)。 为确保用户界面及时更新,应避免保留长期事务。 (# 1316 )
1.1.1 ( 2017 - 03 - 15 )
缺陷修复
- 解决了阻止在 Visual Studio 上针对iOS进行编译的问题。 (# 1277 )
1.1.0 ( 2017 - 03 - 03 )
增强功能
- 添加了Azure Active Directory (AzureAD)凭证提供商。 (# 1254 )
重大更改
这是添加 UWP 支持的准备版本。 我们已从 Realm 程序集中删除了所有特定于平台的逻辑,而是在编译时进行了编织。 虽然这已经在所有常见场景中进行了测试,但它可能会在处理非常复杂的项目图表时产生问题。 如果您在 iOS 项目中遇到以下任何问题:
- 运行任务时编译失败
WeaveRealmAssemblies
- 首次访问 Realm 时应用程序崩溃
请文件问题并解释您的解决方案设置。
1.0.4 ( 2017 - 02 - 21 )
缺陷修复
Realm
NuGet 包不再破坏Realm.Database
中的 Win 32原生二进制文件的路径。 (# 1239 )- 修复了对具有
PropertyChanged
个订阅者的对象进行垃圾回收会导致崩溃的错误。 (# 1237 )
1.0.3 ( 2017 - 02 - 14 )
已过beta !
经过大约一年半的努力,我们很自豪地将其称为1.0版本。 虽然仍有工作要做,但 Realm Xamarin 现已被数千名开发者使用,并被证明是可靠的。
同步
Realm Xamarin现在可与Realm移动平台配合使用。 这意味着您可以写入与Realm对象服务器无缝同步的Xamarin应用,从而允许您使用Xamarin写入复杂的应用,这些应用是离线优先的,只需添加几行代码即可自动同步。 您可以在文档中阅读相关内容。
Windows 桌面
Realm Xamarin 不再仅限于 iOS 和 Android。 现在可以使用它为 Windows 桌面编写 .NET 程序。 将 NuGet 包添加到常规 .NET 项目并开始使用 Realm。 Windows 尚不支持某些功能。 最值得注意的是,同步功能尚不适用于 Windows,而且还缺少跨进程的加密和通知。 我们正在努力,很快就会为您提供支持。
重大更改
IRealmCollection<T>.ObjectSchema
已弃用并替换为ISchemaSource.ObjectSchema
。 (# 1216 )
缺陷修复
[MapTo]
属性现在在查询中受到尊重。 (# 1219 )- 让 Realm 实例被垃圾收集而不是丢弃它,将不再导致崩溃。 (# 1212 )
- 在
PropertyChanged
回调中取消订阅RealmObject.PropertyChanged
不应再导致崩溃。 (# 1207 ) WriteAsync
现在会推进读取ACID 事务,以便异步所做的更改可立即在原始线程中可用。 (# 1192 )- 对反向链接属性的查询不应再产生意外结果。 (# 1177 )
0.82.1 ( 2017 - 01 - 27 )
缺陷修复
- 解决了以下问题:获取Realm 实例、读取对象,然后在同一线程上获取另一个实例会导致对象无效,并在访问其任何成员时使应用程序崩溃。
0.82.0 ( 2017 - 01 - 23 )
重大更改
- 将所有异常移至
Realms.Exceptions
命名空间下。 (# 1075 ) - 已将
RealmSchema
移至Realms.Schema
命名空间。 (# 1075 ) - 将
ErrorEventArgs
构造函数设为内部构造函数。 (# 1075 ) - 将
ObjectSchema.Builder
和RealmSchema.Builder
内部。 (# 1075 ) - 将具有
IList
属性的对象传递给Add(obj, update: true)
将不再合并列表。 相反,IList
属性将仅包含对象中的项目。 (# 1040 )
增强功能
- 在
RealmObject
中添加了虚拟OnPropertyChanged
方法,您可以重写该方法以在当前对象发生变更时收到通知。 (# 1047 ) - 添加了编译时检查,确保
[Required]
应用于正确的属性类型。 (# 1072 ) Realm.Add(RealmObject obj)
将返回传入的对象,类似于Realm.Add<T>(T obj)
。 (# 1162 )- 为
string.Contains
添加了扩展方法,该方法接受StringComparison
参数并可在查询中使用。 查询时,只能使用StringComparison.Ordinal
和StringComparison.OrdinalIgnoreCase
。 如果未在查询中使用,则StringComparison
的所有值均有效。 (# 1141 )
缺陷修复
- 将具有从未被访问过的
IList<T>
属性的独立运行对象添加到Realm将不再抛出NullReferenceException
。 (# 1040 ) IList<T>
当由只读Realm托管时,属性现在将正确返回IsReadOnly = true
。 (# 1070 )- 编织器现在应正确解析 PCL 和 netstandard 程序集中的引用。 (# 1117 )
- 向 PCL 参考程序集中添加一些缺失的方法。 (# 1093 )
- 尝试访问其成员时,已处置 Realm 不会抛出
ObjectDisposedException
。 此外,处置 Realm 不会使同一线程上的其他实例失效。 (# 1063 )
0.81.0 ( 2016 - 12 - 14 )
重大更改
- 接受参数的
IQueryable<T>.ToNotifyCollectionChanged
扩展方法现已弃用。 您应该改用一种新的无参数方法。 如果要处理错误,可以通过订阅Realm.OnError
事件来实现。 (# 938 ) RealmResults<T>
现在标记为internal
,Realm.All<T>()
将返回IQueryable<T>
。 我们添加了允许订阅通知的新扩展方法IQueryable<T>.SubscribeForNotifications(NotificationCallbackDelegate<T>)
。 (# 942 )Realm.CreateObject<T>
已弃用,并将在下一个主要发布中删除。 (如果类具有 PrimaryKey,则在使用即将推出的同步 Realm 时,可能会导致危险的数据丢失)。 (# 998 )RealmConfiguration.ReadOnly
已重命名为RealmConfiguration.IsReadOnly
,现在是属性而不是字段。 (# 858 )Realm.All
已重命名为Realm.GetAll
,且前者已被废弃。 (# 858 )Realm.ObjectForPrimaryKey
已重命名为Realm.Find
,且前者已被废弃。 (# 858 )Realm.Manage
已重命名为Realm.Add
,且前者已被废弃。 (# 858 )RealmConfiguration.PathToRealm
已重命名为Realm.GetPathToRealm
,且前者已被废弃。 (# 858 )RealmResults.NotificationCallback
已作为非嵌套类提取并重命名为NotificationCallbackDelegate
。 (# 858 )Realm.Close
已删除,取而代之的是Realm.Dispose
。 (# 858 )RealmList<T>
现在标记为internal
。 您应使用IList<T>
来定义集合关系。 (# 858 )
增强功能
- 在数据绑定场景中,如果在写事务(write transaction)之外的绑定调用了 setter,我们将创建一个隐式 setter 并提交。 这样就可以实现双向数据绑定,而无需保留长期事务。 (# 901 )
- Realm模式现在可以使用新的
[Required]
属性来Express不可为空的引用类型属性。 (# 349 ) - 公开了一个新的
Realm.Error
事件,您可以订阅该事件以获取有关用户代码之外发生的异常的通知。 (# 938 ) - 从 返回的集合的运行时类型以及为
Realm.All
IList<T>
上的 属性创建的集合现在实现了RealmObject
INotifyCollectionChanged
,因此您可以将它们传递以进行数据绑定,而无需任何额外的转换。(# 938 , # 909 ) - 所有 RealmObject 均实施
INotifyPropertyChanged
。 这允许您直接传递它们以进行数据绑定。 - 添加了
Realm.Compact
方法,允许您回收Realm所使用的空间。 (# 968 ) Realm.Add
返回添加的对象。 (# 931 )- 支持反向链接,即
LinkingObjects
。 (# 219 ) - 添加了
IList<T>.Move
扩展方法,允许您对集合中的元素重新排序。 对于托管列表,它会调用原生方法,因此比删除和插入项目的效率稍高,但更重要的是,它会使用NotifyCollectionChangedAction.Move
引发CollectionChanged
,从而产生漂亮的移动动画,而不是重新加载 ListView。 (# 995 )
缺陷修复
- 订阅 RealmObject 上的
PropertyChanged
并在不同线程上修改同一对象的实例现在可以正确引发该事件。 (# 909 ) - 使用
Insert
在IList
属性的末尾插入项将不再引发异常。 (# 978 )
0.80.0 ( 2016 - 10 - 27 )
重大更改
- 此版本更新了文件格式。 旧版本无法打开使用此版本创建的文件。 (# 846 )
RealmList<T>
现已标记为内部。 如果您在任何地方使用它,则应迁移到IList<T>
。 (# 880 )
增强功能
iOS链接全部应该可以工作 - 我们现在为
RealmObject
子类的所有 wed 成员添加一个 [Preserve] 属性,这样您就不需要手动添加[Preserve(allMembers=true)]
(# 822 )Realm.Manage
调用速度更快。 除非您只设置几个属性,而将其余属性保留为默认值,否则您应该首选它而不是Realm.CreateObject
。 (# 857 )已将
bool update
参数添加到Realm.Manage
中。 当传递update: true
时,Realm 将尝试查找并更新具有相同 PrimaryKey 的持久化对象。 如果未找到具有相同 PrimaryKey 的对象,则会添加未命名的对象。 如果传入的对象没有 PrimaryKey,则会添加 PrimaryKey。 任何相关对象都将根据它们是否具有主键来添加或更新。 (# 871 )注意:对象引用不相同的循环关系将无法进行调节。 例如,这将按预期工作:
var person = new Person { Name = "Peter", Id = 1 }; person.Dog = new Dog(); person.Dog.Owner = person;
但是,这不会 — 会将 Person 的属性设置为它看到的最后一个实例的属性:
var person = new Person { Name = "Peter", Id = 1 }; person.Dog = new Dog(); person.Dog.Owner = new Person { Id = 1 };
这在从JSON反序列化数据时非常重要,因为在这种情况下,您可能有多个具有相同ID但具有不同属性的对象实例。
Realm.Manage
如果传递了托管对象,将不再引发异常。 相反,它会立即返回。 (# 871 )添加了
Realm.Manage
的非通用版本。 (# 871 )添加了对可为 null 的整数主键的支持。 现在,您可以拥有
long?
PrimaryKey属性,其中null
是有效的唯一值。 (# 877 )在应用 Realm 属性(例如
[Indexed]
或[PrimaryKey]
)。 (# 882 )添加了对 LINQ 中 Realm 对象的
==
和!=
比较的支持 (# 896 ),例如:var peter = realm.All<Person>().FirstOrDefault(d => d.Name == "Peter"); var petersDogs = realm.All<Dog>().Where(d => d.Owner == peter);
在 LINQ 中添加了对
StartsWith(string, StringComparison)
、EndsWith(string, StringComparison)
和Equals(string, StringComparison)
筛选的支持。 (# 893 )注意:目前仅支持
Ordinal
和OrdinalIgnoreCase
比较。 尝试传入不同的值会导致运行时错误。 如果未提供参数,则使用Ordinal
。
0.78.1 ( 2016 - 09 - 15 )
缺陷修复
Realm.ObjectForPrimaryKey()
现在,如果找不到对象,则会返回 null (# 833 )。- 现在,查询除持久属性之外的任何内容都会抛出异常,而不是导致崩溃(# 251和 # 723 )
使用1.5.1核心
0.78.0 ( 2016 - 09 - 09 )
重大更改
- 为了与其他 SDK 保持一致,术语
ObjectId
已替换为PrimaryKey
。 这会影响用于修饰属性的[ObjectId]
属性。
增强功能
- 如果单个对象指定了
[PrimaryKey]
属性,则可以使用Realm.ObjectForPrimaryKey()
快速检索单个对象。 (# 402 ) - 现在支持手动迁移。 您可以在更新数据模型时准确指定数据的迁移方式。 (# 545 )
- 如果表达式另一侧的整数类型与属性的整数类型无法完全匹配,LINQ 搜索将不再抛出
NotSupportedException
。 - 现在支持其他 LINQ 方法:(# 802 )
- last
- LastOrDefault
- FirstOrDefault
- SingleOrDefault
- ElementAt
- ElementAtOrDefault
缺陷修复
- 现在可以搜索 char字段类型。 (# 708 )
- 现在,如果您更改了
RealmObject
子类声明且未递增SchemaVersion
(# 518 ),则会抛出 RealmMigrationSchemaNeededException - 修复了以下错误:如果对
Realm
进行了垃圾回收 (# 779 ),则在处理Transaction
时会引发ObjectDisposedException
- 将引发的异常更正为
IndexOutOfRangeException
为ArgumentOutOfRangeException
使用1.5.1核心
0.77.2 ( 2016 - 08 - 11 )
增强功能
- 现在,将“构建详细程度”设置为
Detailed
或Normal
将为每个属性交织显示一条消息,如果您怀疑 Fody 编织错误,这将非常有用。 - 更好的异常消息将有助于诊断EmptySchema问题 (# 739 )
- LINQ 表达式的部分求值意味着支持更多表达式类型作为二进制表达式中的操作数 (# 755 )
- 支持针对
string
、byte[]
和Nullable<T>
属性检查null
的 LINQ 查询。 - 支持 LINQ 查询中持久属性上的
string.IsNullOrEmpty
。 - 模式构建已简化,以减少打开Realm时的开销
- 模式版本号现在从0开始,而不是 UInt 64 .MaxValue
缺陷修复
RealmResults<T>
应隐式实现IQueryable.Provider
(# 752 )- 隐式关闭的 Realm 将不再使其他实例失效 (# 746 )
使用1.4.2核心
0.77.1 ( 2016 - 07 - 25 )
细微更改
- 修复了编织纯 PCL 项目的错误,在 v 0.77.0中发布 (# 715 )
- 由于在 LINQ 中使用不兼容的参数而导致的异常消息现在包含有问题的参数 (# 719 )
- 由于 PCL 签名和平台版本不匹配,使用 ToNotifyCollectionChanged 的 PCL 项目可能会崩溃。
使用1.4.0核心
0.77.0 ( 2016 - 07 - 18 )
损坏的版本— 不会构建 PCL 项目
重大更改
- 先前版本中的排序顺序更改已恢复。
主要变更
- 现在可以对Realm的模式进行内省。 (# 645 )
- Realm类接收了
Realm.CreateObject
和Realm.All
的重载,它们接受string参数而不是泛型参数,从而能够对编译时未知确切类型的对象使用dynamic
关键字。 (# 646 ) - 现在可以使用
IList<DestClass>
声明“一对多”关系,而不需要使用RealmList<DestClass>
。 由于会缓存列表,这比使用RealmList
要快得多。 (问题 # 287 ) - 现在可以使用相关对象列表创建独立运行对象。 将此类对象传递给
Realm.Manage
将导致从该对象向下的整个对象图表变为托管对象。
细微更改
- 修复了在 iOS 上非常快速地并行创建许多短期 Realm 时发生的崩溃(问题 # 653 )
RealmObject.IsValid
可调用此函数来检查托管对象是否已被删除- 访问无效对象的属性会引发异常,而不是因段错误而崩溃 (# 662 )
- 创建Realm时抛出的异常不会再留下泄漏处理(问题 # 503 )
使用1.4.0核心
0.76.1 ( 2016 - 06 - 15 )
细微更改
- 当当前
Realm
中存在活动的TypeLoadException
System.Reflection.Emit.AssemblyBuilder
AppDomain
时, 静态构造函数将不再抛出 。 - 修复了在 iOS 设备上使用通知 API 时出现的
Attempting to JIT compile
异常。 (问题 # 620 )
重大更改
API没有变化,但排序顺序略有变化,重音字符被分组在一起,某些特殊字符以不同的方式排序。 “三分之一”现在排序在“三分之一”之前。
它使用ftp://ftp.unicode.org/Public/UCA/latest/allkeys.txt中的表
它将所有看起来相同的字符分组,即将 a、à、å 放在一起,甚至放在 ø、o、ö 之前。 这是一个缺陷,因为在丹麦语中,å 应该排在最后。 但这是我们现在能做的最好的事情,直到我们更加了解区域设置为止。
使用1.1.2核心
0.76.0 ( 2016 - 06 - 09 )
主要变更
RealmObject
如果您在类上指定接口,则类现在将隐式实现INotifyPropertyChanged
。 感谢Joe Brock的贡献!
细微更改
long
在查询中受支持(问题编号607 )- 已修复查找
System.String System.String::Format(System.IFormatProvider,System.String,System.Object)
的链接器错误(问题 # 591 ) RealmObject
的二级后代和RealmObject
类中的静态属性现在会使编织器正确报告错误,因为我们(尚)不支持这些错误。 (问题 # 603 )- 对独立运行对象调用
.Equals()
不再抛出异常。 (问题 # 587 )
0.75.0 ( 2016 - 06 - 02 )
重大更改
- Realm文件的文件格式已更改。 文件将自动升级,但无法使用旧版本的Realm打开Realm 文件。 注意:如果您使用的是为旧格式指定的Realm浏览器,则需要升级. 在此处获取最新版本。
RealmResults<T>
不再隐式实现INotifyCollectionChanged
。 请改用新的ToNotifyCollectionChanged
方法。
主要变更
RealmResults<T>
可以通过新的SubscribeForNotifications
方法观察粒度更改。Realm
获得了WriteAsync
方法,该方法允许在背景线程上执行写事务(write transaction)。- Realm模型现在可以使用
byte[]
属性来存储二进制数据。 RealmResults<T>
获得了新的ToNotifyCollectionChanged
扩展方法,该方法可生成适用于 MVVM 数据绑定的类似ObservableCollection<T>
的包装器。
小幅修复
- 现在支持可为 null 的
DateTimeOffset
属性。 - 将
null
设置为string属性现在将正确返回null
- 现在,安装 Fody 失败会导致类似“Realms.RealmException:Fody 未正确安装”的异常。 RDB 2 _with_full_Realm.Dog 是一个 RealmObject,但尚未进行编织。” 而不是
NullReferenceException
- PCL
RealmConfiguration
缺少一些成员。 - 现在可在非默认 nuget 存储库路径中发现 Fody 编织器。
0.74.1 已发布 ( 2016 - 05 - 10 )
小幅修复
- 现在,在其他线程/进程中修改 Realm 时,Realm 可以在 Android 上正确刷新。
- 修复大量线程读写组合下的崩溃问题。
细微更改
- 两个
Realm
和RealmWeaver
NuGet 包已合并为一个Realm
包。 String.Contains(String)
、String.StartsWith(String)
和String.EndsWith(String)
方法现在支持变量表达式。 以前,它们仅适用于文字字符串。RealmResults<T>
现在,当其根本的表或查询结果被写事务(write transaction)更改时,会通过使用NotifyCollectionChangedAction.Reset
引发CollectionChanged
事件来实现INotifyCollectionChanged
。
0.74.0 beta (2016-04-02)
主要变更
- Realm 程序集编织器现在在每次构建期间提交匿名使用数据,因此我们可以跟踪唯一构建器的统计信息,就像 Java、Swift 和 Objective-C 产品一样(问题 # 182 )
Realm.RemoveRange<>()
添加了 和Realm.RemoveAll<>()
方法,允许您从域中删除对象。Realm.Write()
添加了方法,用于在隐式提交的ACID 事务中执行代码- 现在,您可以使用
RealmConfiguration.ObjectClasses
来限制给定 Realm 中允许使用的类。 - LINQ 改进:
- 无需使用
== true
即可进行简单的 bool 搜索(问题 # 362 ) - !运算符可对简单布尔属性或复杂表达式求反(问题 # 77 )
- Count、Single 和 First 现在可以用在 where表达式之后,(#369) 例如
realm.All<Owner>().Where(p => p.Name == "Dani").First();
以及使用Lambda表达式realm.All<Owner>().Single( p => p.Name == "Tim");
- 现在使用
OrderBy
、OrderByDescending
、ThenBy
和ThenByDescending
子句提供排序。 排序可以应用于来自Where
子句的查询结果,也可以在All<>
之后应用来对整个类进行排序。 String.Contains(String)
、String.StartsWith(String)
和String.EndsWith(String)
方法现在可以在where 子句中使用。- 可以在查询中比较 DateTimeOffset 属性。
- 无需使用
- 已删除对旧版 ARM V 5和 V 6设备上的
armeabi
版本的支持。
细微更改
- 完成
RealmList.CopyTo
,以便您可以应用ToList
应用于相关列表(问题 # 299 ) - NuGet 现在使用
libwrappers.so
为 Android 目标插入$(SolutionDir)packages
,因此它可以处理跨平台 (Xamarin Forms)应用模板与纯 Android 模板中的不同相对路径。 Realm.RealmChanged
事件通知您对域所做的更改Realm.Refresh()
确保域使用其他线程的变更进行更新。
0.73.0 beta (2016-02-26)
主要变更
RealmConfiguration.EncryptionKey
添加了这样的文件,可以加密这些文件,并打开来自其他 Realm 源的现有加密文件(假设您拥有密钥)
小幅修复
- 对于 PCL 用户,如果您在没有链接特定于平台的 dll 的情况下使用
RealmConfiguration.DefaultConfiguration
,您现在将收到带有PlatformNotSupportedException
的警告消息。 之前抛出了TypeInitExepction
。 - 更新到 Core v 0.96.2和匹配的 ObjectStore(问题 # 393 )
0.72.1 beta (2016-02-15)
无功能更改。 刚刚添加了适用于 Android 64位目标x86_64
和arm64-v8a
的库构建。
0.72.0 beta (2016-02-13)
使用Realm核心0.96.0
主要变更
- 添加了对 PCL 的支持,因此现在可以在 PCL GUI 或视图模型库中使用 NuGet。
0.71.1 beta (2016-01-29)
小幅修复
构建针对模拟器的 iOS 应用程序有时会出现如下错误:
Error MT5209: Native linking error...building for iOS simulator,
but linking in object file built for OSX, for architecture i386 (MT5209)
此问题已通过删除 NuGet 中包含的冗余模拟器库得到修复
0.71.0 beta (2016-01-25)
使用Realm核心0.95.6 。
平台变更
现在支持:
- Mac 上的Xamarin Studio - iOS和 Android
- Windows上的Xamarin Studio - Android
- Windows上的 Visual Studio - iOS和 Android
主要变更
- 添加了 Android支持,如上所列。
- 添加了
RealmConfiguration
,以提供指定路径和其他设置的可重用方法。 - 添加了
Realm.Equals
、Realm.GetHashCode
和Realm.IsSameInstance
以提供相等性检查,以便您可以确认在同一线程(共享内部实例)中打开的 Realm 是相等的。 - 添加了
Realm.DeleteFiles(RealmConfiguration)
以帮助清理相关文件。 - 添加了可为 null 的基本类型,例如
int?
。 - 优化了
Realm.All<userclass>().Count()
以快速计数给定类的所有对象。 - 独立对象现在支持相关列表。
LINQ
Count()
已实施的Where()
上。Any()
已实施的Where()
上。First( lambda )
并实施Single( lambda )
。- 为了实现适当的惰性,对
Where()
进行的重大优化是在内部实例化所有对象。
API重大更改
[PrimaryKey]
属性重命名为[ObjectId]
。Realm.Attach(object)
重命名为Manage(object)
。- 相关对象列表现在使用
IList<otherClass>
而不是RealmList
进行声明。
缺陷修复
- 导致 iPhone 模拟器链接器错误的错误已修复 (# 375 )
0.70.0 首次beta (2015-12-08)
需要从 NuGet下载的私有副本进行安装。
州
- 仅通过iOS XamarinStudio 支持 。
- 通过简单的 LINQ
Where
搜索进行基本模型和读/写入操作。 - NuGet 托管为从私有域/realm-dotnet 存储库下载。