- None
- None
- Realm Studio: 15.0.0 or later.
- Using Core x.y.z.
- Fixed a possible disruption of sync traffic under heavy load when using managed web sockets where malformed binary messages cause the server to drop the connection and force the client to reconnect and upload again. (Issue #3671).
- Realm Studio: 15.0.0 or later.
- Using Core x.y.z.
- Introduce a
ReconnectBackoffOptions
property onSyncTimeoutOptions
that allows control over the delay the sync client applies before attempting to reconnect. (PR #3661). - Role and permissions changes no longer require a client reset to update the local realm. (Core 14.11.0)
- On Windows devices Device Sync will additionally look up SSL certificates in the Windows Trusted Root Certification Authorities certificate store when establishing a connection. (Core 14.11.0)
- Sync log statements now include the app services connection id in their prefix (e.g
Connection[1:<connection id>] Session[1]: log message
) to make correlating sync activity to server logs easier during troubleshooting. (Core 14.11.2) - Improve sync bootstrap performance by reducing the number of table selections in the replication logs for embedded objects. (Core 14.12.0)
- Released a read lock which was pinned for the duration of a mutable subscription even after commit. This frees resources earlier, and may improve performance of sync bootstraps where the starting state is large. (Core 14.12.0)
- Client reset cycle detection now checks if the previous recovery attempt was made by the same core version, and if not attempts recovery again. (Core 14.12.0)
- Updated bundled OpenSSL version to 3.3.1. (Core 14.12.0)
- Sync download progress was only updated when bootstraps completed, making it always be 0 before the first completion and then forever 1. (Core 14.11.0)
- Sync client can crash if a session is resumed while the session is being suspended. (Core 14.11.0)
- If a sync session is interrupted by a disconnect or restart while downloading a bootstrap, stale data from the previous bootstrap may be included when the session reconnects and downloads the bootstrap. This can lead to objects stored in the database that do not match the actual state of the server and potentially leading to compensating writes. (Core 14.11.0)
- Fixed unnecessary server roundtrips when there is no download to acknowledge. (Core 14.11.0)
- App subscription callback was getting fired before the user profile was retrieved on login, leading to an empty user profile when using the callback. (Core 14.11.1)
- Sync client may report duplicate compensating write errors. (Core 14.11.2)
- Fixed an "invalid column key" exception when using a RQL "BETWEEN" query on an int or timestamp property across links. (Core 14.12.0)
- Fixed conflict resolution bug related to ArrayErase and Clear instructions, which could sometimes cause an "Invalid prior_size" exception to prevent synchronization. (Core 14.12.0)
- Fixed bug which would prevent eventual consistency during conflict resolution. Affected clients would experience data divergence and potentially consistency errors as a result. (Core 14.12.0)
- Fixed issues loading the native Realm libraries on Linux ARMv7 systems when they linked against our bundled OpenSSL resulting in errors like
unexpected reloc type 0x03
. (Core 14.12.0) Realm.Copy()
would sometimes incorrectly throw an exception claiming that there were unuploaded local changes when the source Realm is a synchronized Realm. (Core 14.12.0)
- Realm Studio: 15.0.0 or later.
- Using Core 14.12.0.
- The
Logger
has been deprecated in favor ofRealmLogger
, whichLogger
currently derives from. (PR #3634)- The
Logger.LogLevel
set
andget
accessors have been deprecated. Please useRealmLogger.SetLogLevel()
andRealmLogger.GetLogLevel()
(see Enhancements below). - The
Logger.Function(Action<LogLevel, string> logFunction)
have been deprecated. Please useRealmLogger.Function(Action<LogLevel, LogCategory, string> logFunction)
(see Enhancements below).
- The
- Allow
ShouldCompactOnLaunch
to be set onSyncConfiguration
, not onlyRealmConfiguration
. (Issue #3617) - Reduce the size of the local transaction log produced by creating objects, improving the performance of insertion-heavy transactions (Core 14.10.0).
- Performance has been improved for range queries on integers and timestamps. Requires that you use the "BETWEEN" operation in
Realm.All<T>().Filter(...)
. (Core 14.10.1) - Allowed
ShouldCompactOnLaunch
to be set onSyncConfiguration
, not onlyRealmConfiguration
. (Issue #3617) - Introduced a
LogCategory
and allowed for more control over which category of messages should be logged and at which criticality level. (PR #3634)- Allowed setting and getting a
LogLevel
for a givenLogCategory
. The hierarchy of categories starts atLogCategory.Realm
.RealmLogger.SetLogLevel(LogLevel.Warn, LogCategory.Realm.Sync); RealmLogger.GetLogLevel(LogCategory.Realm.Sync.Client.Session); // LogLevel.Warn
- Added a function logger that accepts a callback that will receive the
LogLevel
,LogCategory
, and the message when invoked.RealmLogger.Default = RealmLogger.Function((level, category, message) => /* custom implementation */);
- Added a
RealmLogger.Log()
overload taking a category. The pre-existingLog()
API will implicitly log atLogCategory.Realm.SDK
.RealmLogger.Default.Log(LogLevel.Warn, LogCategory.Realm, "A warning message");
- Allowed setting and getting a
- On Windows devices Device Sync will additionally look up SSL certificates in the Windows Trusted Root Certification Authorities certificate store when establishing a connection. (Core 14.11.0)
- Role and permissions changes no longer require a client reset to update the local realm. (Core 14.11.0)
- A
ForCurrentlyOutstandingWork
progress notifier would not immediately call its callback after registration. Instead you would have to wait for some data to be received to get your first update - if you were already caught up when you registered the notifier you could end up waiting a long time for the server to deliver a download that would call/expire your notifier. (Core 14.8.0) - After compacting, a file upgrade would be triggered. This could cause loss of data if
ShouldDeleteIfMigrationNeeded
is set totrue
. (Issue #3583, Core 14.9.0) - Passing in a deleted object as a substitution argument to
.Filter()
would throw a confusing error with a message starting withinvalid RQL for table
. It now throws a more descriptive error instead. (Issue #3619) - Fix some client resets (such as migrating to flexible sync) potentially failing with AutoClientResetFailed if a new client reset condition (such as rolling back a flexible sync migration) occurred before the first one completed. (Core 14.10.0)
- Encrypted files on Windows had a maximum size of 2GB even on x64 due to internal usage of
off_t
, which is a 32-bit type on 64-bit Windows. (Core 14.10.0) - The encryption code no longer behaves differently depending on the system page size, which should entirely eliminate a recurring source of bugs related to copying encrypted Realm files between platforms with different page sizes. One known outstanding bug was (RNET-1141), where opening files on a system with a larger page size than the writing system would attempt to read sections of the file which had never been written to. (Core 14.10.0)
- There were several complicated scenarios which could result in stale reads from encrypted files in multiprocess scenarios. These were very difficult to hit and would typically lead to a crash, either due to an assertion failure or DecryptionFailure being thrown. (Core 14.10.0)
- Encrypted files have some benign data races where we can memcpy a block of memory while another thread is writing to a limited range of it. It is logically impossible to ever read from that range when this happens, but Thread Sanitizer quite reasonably complains about this. We now perform a slower operations when running with TSan which avoids this benign race. (Core 14.10.0)
- Tokenizing strings for full-text search could pass values outside the range [-1, 255] to
isspace()
, which is undefined behavior. (Core 14.10.0) - Opening an Flexible Sync Realm asynchronously may not wait to download all data. (Core 14.10.1)
- Clearing a List of
RealmValue
in an upgraded file would lead to an assertion failing. (Core 14.10.1) - You could get unexpected merge results when assigning to a nested collection. (Core 14.10.2)
- Fixed removing backlinks from the wrong objects if the link came from a nested list, nested dictionary, top-level dictionary, or list of
RealmValue
, and the source table had more than 256 objects. This could manifest asarray_backlink.cpp:112: Assertion failed: int64_t(value >> 1) == key.value
when removing an object. (Core 14.10.3) - Fixed the collapse/rejoin of clusters which contained nested collections with links. This could manifest as
array.cpp:319: Array::move() Assertion failed: begin <= end [2, 1]
when removing an object. (Core 14.10.3) Session.WaitForUpload()
was inconsistent in how it handled commits which did not produce any changesets to upload. Previously it would sometimes complete immediately if all commits waiting to be uploaded were empty, and at other times it would wait for a server roundtrip. It will now always complete immediately. (Core 14.10.3)- When a property is remapped, calling
.Filter("... SORT/DISTINCT(mapped-to-name)")
with the internal name could throw an error likeCannot sort on key path 'NAME': property 'PersonObject.NAME' does not exist
. (Core 14.10.4) - Sync client can crash if a session is resumed while the session is being suspended. (Core 14.11.0)
- If a sync session is interrupted by a disconnect or restart while downloading a bootstrap, stale data from the previous bootstrap may be included when the session reconnects and downloads the bootstrap. This can lead to objects stored in the database that do not match the actual state of the server and potentially leading to compensating writes. (Core 14.11.0)
- Fixed unnecessary server roundtrips when there is no download to acknowledge. (Core 14.11.0)
- Realm Studio: 15.0.0 or later.
- Using Core v14.10.3.
-
Improved calculation of
SyncProgress.ProgressEstimate
. (Issue #3580) -
Added support for
Migration.FindInNewRealm
which is a helper that allows you to lookup the object in the post-migration Realm that corresponds to an object from the pre-migration Realm. (Issue #3600) -
Added
[System.Reflection.Obfuscation]
on the generatedRealmSchema
field to improve compatibility with obfuscation tools that change field and property names of generated classes. (Issue #3574) -
Added support for list and dictionaries of
RealmValue
(IList<RealmValue>
andIDictionary<string, RealmValue>
) to be contained in aRealmValue
. Lists and dictionaries can contain an arbitrary number of collections themselves. It is possible to convert an existing collection to aRealmValue
using the new static methodsRealmValue.List
andRealmValue.Dictionary
or using the implicit operators if converting from common types likeList
,RealmValue[]
orDictionary
. Finally, it is possible to obtain the contained collections by using the new conversion methodAsList
andAsDictionary
. For example: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)
- Accessing
App.CurrentUser
from within aUser.Changed
notification would deadlock. (Core 14.7.0) - Inserting the same link to the same key in a dictionary more than once would incorrectly create multiple backlinks to the object. This did not appear to cause any crashes later, but would have affected the value returned by
RealmObject.BacklinksCount
and queries involving backlinks counts. (Core 14.7.0) - Fixed an issue that would cause
RealmObject.DynamicApi.GetList/Set/Dictionary
to fail when the collection contains primitive values. (Issue #3597)
- Realm Studio: 15.0.0 or later.
- Using Core 14.7.0.
- Added an experimental API to update the base url for an application at runtime -
App.UpdateBaseUriAsync()
. This intended to be used for roaming between edge server and cloud. (Issue #3521)
- The returned value from
MongoClient.Collection.FindOneAsync
is now a nullable document to more explicitly convey thatnull
may be returned in case no object matched the filter. (PR #3586) - Fixed crash when integrating removal of already removed dictionary key. (Core 14.5.2)
App.AllUsers
included logged out users only if they were logged out while the App instance existed. It now always includes all logged out users. (Core 14.6.0)- Fixed several issues around encrypted file portability (copying a "bundled" encrypted Realm from one device to another): (Core 14.6.0)
- Fixed
Assertion failed: new_size % (1ULL << m_page_shift) == 0
when opening an encrypted Realm less than 64Mb that was generated on a platform with a different page size than the current platform. - Fixed a
DecryptionFailed
exception thrown when opening a small (<4k of data) Realm generated on a device with a page size of 4k if it was bundled and opened on a device with a larger page size. - Fixed an issue during a subsequent open of an encrypted Realm for some rare allocation patterns when the top ref was within ~50 bytes of the end of a page. This could manifest as a DecryptionFailed exception or as an assertion:
encrypted_file_mapping.hpp:183: Assertion failed: local_ndx < m_page_state.size()
.
- Fixed
- Schema initialization could hit an assertion failure if the sync client applied a downloaded changeset while the Realm file was in the process of being opened. (Core 14.6.0)
- Improve perfomance of "chained OR equality" queries for UUID/ObjectId types and RQL parsed "IN" queries on string/int/uuid/objectid types. (Core 14.6.0)
- Fixed a bug when running a IN query (or a query of the pattern
x == 1 OR x == 2 OR x == 3
) when evaluating on a string property with an empty string in the search condition. Matches with an empty string would have been evaluated as if searching for a null string instead. (Core 14.6.1)
- Realm Studio: 15.0.0 or later.
- Using Core 14.6.1.
File format version bumped. Old files will be automatically upgraded but cannot be downgraded and opened with older versions of the .NET SDK.
- Added automatic serialization and deserialization of Realm classes when using methods on
MongoClient.Collection
, without the need to annotate classes withMongoDB.Bson
attributes. This feature required to change the default serialization for various types (includingDateTimeOffset
). If you prefer to use the previous serialization, you need to callRealm.SetLegacySerialization
before any kind of serialization is done, otherwise it may not work as epxected. #3459 SyncProgress.TransferredBytes
andSyncProgress.TransferableBytes
have been removed in favour ofSyncProgress.ProgressEstimate
, a double value between 0.0 and 1.0 that expresses the percentage estimate of the current progress. (Issue #3478)- Support for upgrading from Realm files produced by RealmCore v5.23.9 (Realm .NET v5.0.1) or earlier is no longer supported. (Core 14.0.0)
String
andbyte[]
are now strongly typed for comparisons and queries. This change is especially relevant when querying for a string constant on aRealmValue
property, as now only strings will be returned. If searching for binary data is desired, then that type must be specified by the constant. In RQL (.Filter()
) the new way to specify a binary constant is to useRealmValueProp = bin('xyz')
orRealmValueProp = binary('xyz')
. (Core 14.0.0)- Sorting order of strings has changed to use standard unicode codepoint order instead of grouping similar english letters together. A noticeable change will be from "aAbBzZ" to "ABZabz". (Core 14.0.0)
- In RQL (
Filter()
), if you want to query using@type
operation, you must useobjectlink
to match links to objects.object
is reserved for dictionary types. (Core 14.0.0) - Opening realm with file format 23 or lower (Realm .NET versions earlier than 12.0.0) in read-only mode will crash. (Core 14.0.0)
-
Reduced memory usage of
RealmValue
. (PR #3441) -
Add support for passing a key paths collection (
KeyPathsCollection
) when usingIRealmCollection.SubscribeForNotifications
. Passing aKeyPathsCollection
allows to specify which changes in properties should raise a notification.A
KeyPathsCollection
can be obtained by:- building it explicitly by using the methods
KeyPathsCollection.Of
orKeyPathsCollection.Of<T>
; - building it implicitly with the conversion from a
List
or array ofKeyPath
or strings; - getting one of the static values
Full
andShallow
for full and shallow notifications respectively.
A
KeyPath
can be obtained by implicit conversion from a string or built from an expression using theKeyPath.ForExpression<T>
method.For example:
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 )
- building it explicitly by using the methods
-
Added the
MongoClient.GetCollection<T>
method to get a collection of documents from MongoDB that can be deserialized in Realm objects. This methods works the same asMongoClient.GetDatabase(dbName).GetCollection(collectionName)
, but the database name and collection name are automatically derived from the Realm object class. #3414 -
Improved performance of RQL (
.Filter()
) queries on a non-linked string property using: >, >=, <, <=, operators and fixed behaviour that a null string should be evaulated as less than everything, previously nulls were not matched. (Core 13.27.0) -
Updated bundled OpenSSL version to 3.2.0. (Core 13.27.0)
-
Storage of Decimal128 properties has been optimised so that the individual values will take up 0 bits (if all nulls), 32 bits, 64 bits or 128 bits depending on what is needed. (Core 14.0.0)
-
Add support for collection indexes in RQL (
Filter()
) queries. For example: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)
(Core 14.0.0)
-
Added support for indexed
RealmValue
properties. (PR #3544) -
Improve performance of object notifiers with complex schemas and very simple changes to process by as much as 20%. (Core 14.2.0)
-
Improve performance with very large number of notifiers as much as 75%. (Core 14.2.0)
-
Improve file compaction performance on platforms with page sizes greater than 4k (for example arm64 Apple platforms) for files less than 256 pages in size. (Core 14.4.0)
-
The default base url in
AppConfiguration
has been updated to point toservices.cloud.mongodb.com
. See https://www.mongodb.com/docs/atlas/app-services/domain-migration/ for more information. (Issue #3551)
- Fixed RQL (
.Filter()
) queries likeindexed_property == NONE {x}
which mistakenly matched on only x instead of not x. This only applies when an indexed property with equality (==, or IN) matches withNONE
on a list of one item. If the constant list contained more than one value then it was working correctly. (Core 13.27.0) - Uploading the changesets recovered during an automatic client reset recovery may lead to 'Bad server version' errors and a new client reset. (Core 13.27.0)
- Fixed crash in fulltext index using prefix search with no matches. (Core 13.27.0)
- Fixed a crash with Assertion
failed: m_initiated
during sync session startup. (Core 13.27.0) - Fixed a TSAN violation where the user thread could race to read m_finalized with the sync event loop. (Core 13.27.0)
- Fix a minor race condition when backing up Realm files before a client reset which could have lead to overwriting an existing file. (Core 13.27.0)
- Boolean property
ChangeSet.IsCleared
that is true when the collection gets cleared is now also raised forIDictionary
, aligning it toISet
andIList
. (Core 14.0.0) - Fixed equality queries on
RealmValue
properties with an index. (Core 14.0.0) - Fixed a crash that would happen when more than 8388606 links were pointing to a specific object.
- Fixed wrong results when querying for
NULL
value inIDictionary
. (Core 14.0.0) - A Realm generated on a non-apple ARM 64 device and copied to another platform (and vice-versa) were non-portable due to a sorting order difference. This impacts strings or binaries that have their first difference at a non-ascii character. These items may not be found in a set, or in an indexed column if the strings had a long common prefix (> 200 characters). (Core 14.0.0)
- Fixed an issue when removing items from a LnkLst that could result in invalidated links becoming visable which could cause crashes or exceptions when accessing those list items later on. This affects sync Realms where another client had previously removed a link in a linklist that has over 1000 links in it, and then further local removals from the same list caused the list to have fewer than 1000 items. (Core 14.2.0)
- Fix a spurious crash related to opening a Realm on background thread while the process was in the middle of exiting. (Core 14.3.0)
- Fix opening realm with cached user while offline results in fatal error and session does not retry connection. (Core 14.4.0)
- Fix an assertion failure "m_lock_info && m_lock_info->m_file.get_path() == m_filename" that appears to be related to opening a Realm while the file is in the process of being closed on another thread. (Core 14.5.0)
- Fixed diverging history due to a bug in the replication code when setting default null values (embedded objects included). (Core 14.5.0)
- Null pointer exception may be triggered when logging out and async commits callbacks not executed. (Core 14.5.0)
- Realm Studio: 15.0.0 or later.
- Using Core 14.5.1.
- Automatic client reset recovery now does a better job of recovering changes when changesets were downloaded from the server after the unuploaded local changes were committed. If the local Realm happened to be fully up to date with the server prior to the client reset, automatic recovery should now always produce exactly the same state as if no client reset was involved. (Core 13.24.1)
- Exceptions thrown during bootstrap application will now be surfaced to the user rather than terminating the program with an unhandled exception. (Core 13.25.0)
- Allow the using
>
,>=
,<
,<=
operators inRealm.Filter()
queries for string constants. This is a case sensitive lexicographical comparison. Improved performance of RQL (.Filter()
) queries on a non-linked string property using: >, >=, <, <=, operators and fixed behaviour that a null string should be evaluated as less than everything, previously nulls were not matched. (Core 13.26.0-14-gdf25f) Session.GetProgressObservable
can now be used with Flexible Sync. (Issue #3478)
- Automatic client reset recovery would duplicate insertions in a list when recovering a write which made an unrecoverable change to a list (i.e. modifying or deleting a pre-existing entry), followed by a subscription change, followed by a write which added an entry to the list. (Core 13.24.0)
- During a client reset recovery a Set of links could be missing items, or an exception could be thrown that prevents recovery. (Core 13.24.0)
- During a client reset with recovery when recovering a move or set operation on a
IList<RealmObject>
orIList<RealmValue>
that operated on indices that were not also added in the recovery, links to an object which had been deleted by another client while offline would be recreated by the recovering client. But the objects of these links would only have the primary key populated and all other fields would be default values. Now, instead of creating these zombie objects, the lists being recovered skip such deleted links. (Core 13.24.0) - Errors encountered while reapplying local changes for client reset recovery on partition-based sync Realms would result in the client reset attempt not being recorded, possibly resulting in an endless loop of attempting and failing to automatically recover the client reset. (Core 13.24.0)
- Changesets have wrong timestamps if the local clock lags behind 2015-01-01T00:00:00Z. The sync client now throws an exception if that happens. (Core 13.24.1)
- If the very first open of a flexible sync Realm triggered a client reset, the configuration had an initial subscriptions callback, both before and after reset callbacks, and the initial subscription callback began a read transaction without ending it (which is normally going to be the case), opening the frozen Realm for the after reset callback would trigger a BadVersion exception. (Core 13.24.1)
- Automatic client reset recovery on flexible sync Realms would apply recovered changes in multiple write transactions, releasing the write lock in between. (Core 13.24.1)
- Having a class name of length 57 would make client reset crash as a limit of 56 was wrongly enforced. (Core 13.24.1)
- Fixed several causes of "decryption failed" exceptions that could happen when opening multiple encrypted Realm files in the same process while using Apple/linux and storing the Realms on an exFAT file system. (Core 13.24.1)
- Fixed several errors that could cause a crash of the sync client. (Core 13.25.0)
- Bad performance of initial Sync download involving many backlinks. (Core 13.25.1)
- Explicitly bumped the minimum version of System.Net.Security to 4.3.2 as 4.3.0 has been marked as vulnerable (more details can be found in the deprecation notice on the NuGet page).
- Handle EOPNOTSUPP when using posix_fallocate() and fallback to manually consume space. This should enable android users to open a Realm on restrictive filesystems. (Core 13.26.0)
- Application may crash with incoming_changesets.size() != 0 when a download message is mistaken for a bootstrap message. This can happen if the synchronization session is paused and resumed at a specific time. (Core 13.26.0)
- Fixed errors complaining about missing symbols such as
__atomic_is_lock_free
on ARMv7 Linux (Core 13.26.0) - Uploading the changesets recovered during an automatic client reset recovery may lead to 'Bad server version' errors and a new client reset. (Core 13.26.0-14-gdf25f)
- Fixed invalid data in error reason string when registering a subscription change notification after the subscription has already failed. (Core 13.26.0-14-gdf25f)
- Realm Studio: 13.0.0 or later.
- Using Core v13.26.0-14-gdf25f.
- Fixed FLX subscriptions not being sent to the server if the session was interrupted during bootstrapping. (Core 13.23.3)
- Fixed FLX subscriptions not being sent to the server if an upload message was sent immediately after a subscription was committed but before the sync client checks for new subscriptions. (Core 13.23.3)
- Fixed application crash with 'KeyNotFound' exception when subscriptions are marked complete after a client reset. (Core 13.23.3)
- A crash at a very specific time during a DiscardLocal client reset on a FLX Realm could leave subscriptions in an invalid state. (Core 13.23.4)
- Fixed an error "Invalid schema change (UPLOAD): cannot process AddColumn instruction for non-existent table" when using automatic client reset with recovery in dev mode to recover schema changes made locally while offline. (Core 13.23.4)
- Realm Studio: 13.0.0 or later.
- Using Core 13.23.4.
-
Added the
App.EmailPasswordAuth.RetryCustomConfirmationAsync
method to be able to run again the confirmation function on the server for a given email. (Issue #3463) -
Added
User.Changed
event that can be used to notify subscribers that something about the user changed - typically this would be the user state or the access token. (Issue #3429) -
Added support for customizing the ignore attribute applied on certain generated properties of Realm models. The configuration option is called
realm.custom_ignore_attribute
and can be set in a global configuration file (more information about global configuration files can be found in the .NET documentation). The Realm generator will treat this as an opaque string, that will be appended to theIgnoreDataMember
andXmlIgnore
attributes already applied on these members. The attributes must be fully qualified unless the namespace they reside in is added to a global usings file. For example, this is how you would addJsonIgnore
fromSystem.Text.Json
:realm.custom_ignore_attribute = [System.Text.Json.Serialization.JsonIgnore]
(Issue #2579)
-
The Realm source generator will now error out in case a collection in the model classes is assigned to a non-null value either in a property initializer or in a constructor. Realm collections are initialized internally and assigning non-null values to the property is not supported, where the
null!
assignment is only useful to silence nullable reference type warnings, in reality the collection will never be null. (Issue #3455) -
Made WebSocket error logging more verbose when using
AppConfiguration.UseManagedWebSockets = true
. #3459
- Added an error that is raised when interface based Realm classes are used with a language version lower than 8.0. At the same time, removed the use of
not
in the generated code, so that it's compatible with a minumum C# version of 8.0. (Issue #3265) - Logging into a single user using multiple auth providers created a separate SyncUser per auth provider. This mostly worked, but had some quirks:
- Sync sessions would not necessarily be associated with the specific SyncUser used to create them. As a result, querying a user for its sessions could give incorrect results, and logging one user out could close the wrong sessions.
- Existing local synchronized Realm files created using version of Realm from August - November 2020 would sometimes not be opened correctly and would instead be redownloaded.
- Removing one of the SyncUsers would delete all local Realm files for all SyncUsers for that user.
- Deleting the server-side user via one of the SyncUsers left the other SyncUsers in an invalid state.
- A SyncUser which was originally created via anonymous login and then linked to an identity would still be treated as an anonymous users and removed entirely on logout. (Core 13.21.0)
- If a user was logged out while an access token refresh was in progress, the refresh completing would mark the user as logged in again and the user would be in an inconsistent state (Core 13.21.0).
- If querying over a geospatial dataset that had some objects with a type property set to something other than 'Point' (case insensitive) an exception would have been thrown. Instead of disrupting the query, those objects are now just ignored. (Core 13.21.0)
- Receiving a write_not_allowed error from the server would have led to a crash. (Core 13.22.0)
- Updating subscriptions did not trigger Realm autorefreshes, sometimes resulting in async refresh hanging until another write was performed by something else. (Core 13.23.1)
- Fix interprocess locking for concurrent realm file access resulting in a interprocess deadlock on FAT32/exFAT filesystems. (Core 13.23.1)
- Realm Studio: 13.0.0 or later.
- Using Core 13.23.1.
- Streamlined some of the error codes reported in
SessionException
. A few error codes have been combined and some have been deprecated since they are no longer reported by the server. (Issue #3295) - Full text search supports searching for prefix only. Eg. "description TEXT 'alex*'". (Core 13.18.0)
- Unknown protocol errors received from Atlas Device Sync will no longer cause the application to crash if a valid error action is also received. Unknown error actions will be treated as an ApplicationBug error action and will cause sync to fail with an error via the sync error handler. (Core 13.18.0)
- Added support for server log messages that are enabled by sync protocol version 10. Appservices request id will be provided in a server log message in a future server release. (Core 13.19.0)
- Fixed the message of the
MissingMemberException
being thrown when attempting to access a non-existent property with the dynamic API. (PR #3432) - Fixed a
Cannot marshal generic Windows Runtime types with a non Windows Runtime type as a generic type argument
build error when using .NET Native. (Issue #3434, since 11.4.0) - Fix failed assertion for unknown app server errors. (Core 13.17.2)
- Running a query on @keys in a Dictionary would throw an exception. (Core 13.17.2)
- Fixed crash in slab allocator (
Assertion failed: ref + size <= next->first
). (Core 13.20.1) - Sending empty UPLOAD messages may lead to 'Bad server version' errors and client reset. (Core 13.20.1)
- Realm Studio: 13.0.0 or later.
- Using Core 13.20.1.
- Added
IQueryable.SubscribeAsync
API as a shorthand for usingSubscriptionSet.Add
. It is a syntax sugar that roughly translates to:It offers a parameter to control whether to wait every time for synchronization or just the first time a subscription is added, as well as cancellation token support. (PR #3403)realm.Subscriptions.Update(() => { realm.Subscriptions.Add(query); }); await realm.Subscriptions.WaitForSynchronization(); // This can now be expressed as await query.SubscribeAsync();
- Added an optional
cancellationToken
argument toSession.WaitForDownloadAsync/WaitForUploadAsync
. (PR #3403) - Added an optional
cancellationToken
argument toSubscriptionSet.WaitForSynchronization
. (PR #3403) - Fixed a rare corruption of files on streaming format (often following compact, convert or copying to a new file). (Core 13.17.1)
- Trying to search a full-text indexes created as a result of an additive schema change (i.e. applying the differences between the local schema and a synchronized realm's schema) could have resulted in an IllegalOperation error with the error code
Column has no fulltext index
. (Core 13.17.1) - Sync progress for DOWNLOAD messages from server state was updated wrongly. This may have resulted in an extra round-trip to the server. (Core 13.17.1)
- Added option to use managed WebSockets (
System.Net.WebSockets.ClientWebSocket
) instead of Realm's built-in WebSocket client for Sync traffic. Managed WebSockets offer improved support for proxies and firewalls that require authentication. This feature is currently opt-in and can be enabled by settingAppConfiguration.UseManagedWebSockets
to true. Managed WebSockets will become the default in a future version. (PR #3412). - Fixed an issue that would make
realm.SyncSession
garbage collected even when there are subscribers torealm.SyncSession.PropertyChanged
.
- Fixed a race condition between canceling an async write transaction and closing the Realm file, which could result in an
ObjectDisposedException : Safe handle has been closed
being thrown. (PR #3400) - Fixed an issue where in the extremely rare case that an exception is thrown by
Realm.RefreshAsync
, that exception would have been ignored andfalse
would have been returned. (PR #3400) - Fixed the nullability annotation of
SubscriptionSet.Find
to correctly indicate thatnull
is returned if the subscription doesn't exist in the subscription set. (PR #3403) - Fixed an issue where executing
Filter
queries using remapped properties would only work with the native name rather than the managed one. Now both will work - e.g.:(Issue #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 or later.
- Using Core 13.17.1
AppConfiguration.LocalAppName
andAppConfiguration.LocalAppVersion
have been deprecated and will be removed in a future version. They have never had an effect as the values supplied by the SDK was never sent to the server. (PR #3387)
- Added
App.BaseFilePath
,App.BaseUri
, andApp.Id
properties that return the values supplied inAppConfiguration
. (PR #3385) - Added
AppConfiguration.UseAppCache
property that controls whether theApp
instance returned fromApp.Create
should be cached or not. The general recommendation is to not set it (i.e. leave the default value oftrue
), but it can be useful when writing unit tests. (Issue #3382).
- Fixed a Unity Editor crash when the domain is reloaded while a
Realm.GetInstanceAsync
operation is in progress. (Issue #3344) - Fixed the implementation
App.Equals
andApp.GetHashCode
to return correct results, particularly when theApp
instance is cached. (PR #3385) - Fixed an issue where building for Android on Unity would fail with "Could not analyze the user's assembly. Object reference not set to an instance of an object". (Issue #3380)
- A GeoBox is now just a shortcut for the equivilent GeoPolygon. This provides consistent query results and error checking. (Core 13.15.2)
- Fixed several corner cases (eg. around the poles) where invalid points matched a geoWithin query. (Core 13.15.2)
- Fixed an error during async open and client reset if properties have been added to the schema. This fix applies to PBS to FLX migration if async open is used. (Core 13.16.1)
- Realm Studio: 13.0.0 or later.
- Using Core 13.17.0
- Added validation checks to the geospatial type constructors. This means that an exception will now be thrown when constructing an invalid geospatial shape rather than when using it in a query. (PR #3362)
- Relaxed some validations when invoking
IndexOf(null)
on a collection of non-nullable types. Previously, this would throw anArgumentNullException
whereas now it will return-1
. This is particularly useful for data-binding scenarios where the binding engine might invoke it asIndexOf(SelectedItem)
which would throw an exception whenSelectedItem
isnull
. (PR #3369) - Changed
RealmSet.IndexOf
implementation to return the actual result rather than throw aNotSupportedException
. The order of persisted sets is still non-deterministic, but is stable between write transactions. Again, this is mostly useful for data-binding scenarios where the set is passed as a binding context to a collection control. (PR #3369)
- Fixed an issue on Unity on Windows when the weaver would trigger excessive terminal windows to open. (Issue [3364]#3364)
- Fixed an issue on Unity on CI where weaving would fail with the following error:
Could not analyze the user's assembly. Cannot access a closed Stream.
. (Issue [3364]#3364) - Fixed a
NullReferenceException
when weaving classes on Unity in batch mode. (Issue #3363)
- Realm Studio: 13.0.0 or later.
- Using Core 13.15.0
- Fixed a namespacing issue that would cause Maui Android projects to fail to build due to
'Realm' is a namespace but is used like a type
. (Issue #3351)
- Realm Studio: 13.0.0 or later.
- Using Core 13.15.0
- Fixed a namespacing issue that would cause Unity projects to fail to build due to
'Realm' is a namespace but is used like a type
. (Issue #3351) - Improved the warning message when adding Realm attributes on a non-persisted property. (Issue #3352)
- Realm Studio: 13.0.0 or later.
- Using Core 13.15.0.
- Deprecate the
Realm.SourceGenerator
andRealm.Fody
packages. The source generation and weaver assemblies are now contained in the mainRealm
package. This should be a transparent change for users who only referenced theRealm
package, but if you explicitly added a package reference toRealm.SourceGenerator
orRealm.Fody
, you should remove it. (PR #3319) - Automatically handle
RealmObject
->EmbeddedObject
migrations by duplicating objects referenced by multiple parents as well as removing "orphaned" objects. (Issue #2408) - New notifiers can now be registered in write transactions until changes have actually been made in the write transaction. This makes it so that new notifications can be registered inside change notifications triggered by beginning a write transaction (unless a previous callback performed writes). (Core 13.10.1)
- Partition-Based to Flexible Sync Migration for migrating a client app that uses partition based sync to use flexible sync under the hood if the server has been migrated to flexible sync is officially supported with this release. Any clients using an older version of Realm (including the original support released in Core 11.0.0) will receive a "switch to flexible sync" error message when trying to sync with the app. (Core 13.11.0)
- Support sort/distinct based on values from a dictionary e.g.
.Filter("TRUEPREDICATE SORT(meta['age'])")
. (Core 13.14.0) - Added initial support for geospatial queries on points. (Issue #3299)
- In this version, only queries of the form "is this point contained in this shape" (equivalent to $geoWithin in MongoDB) are supported.
- There is no index support right now.
- There is no dedicated type for persisted geospatial points. Instead, points should be stored as GeoJson-shaped embedded object and queries will use duck-typing to check if the shape contains the object. For convenience, here's an example embedded object that you can use in lieu of a Realm-provided dedicated type:
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; } }
- Three new shape types and one helper point type are added to allow you to check for containment:
GeoPoint
: a building block for the other shape types - it cannot be used as a property type on your models and is only intended to construct the other shape types. It can be constructed implicitly from a value tuple of latitude and longitude:var point = new GeoPoint(latitude: 12.345, longitude: 67.890); var point = (12.345, 67.890);
GeoCircle
: a shape representing a circle on a sphere constructed from a center and radius: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
: a shape representing a box on a sphere constructed from its bottom left and top right corners:var box = new GeoBox((12.34, 56.78), (15.34, 59.78));
GeoPolygon
: an arbitrary polygon constructed from an outer ring and optional holes: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
- Querying can be done either via LINQ or RQL:
var matches = realm.All<Company>().Where(c => QueryMethods.GeoWithin(c.Location, circle)); var matches = realm.All<Company>().Filter("Location GEOWITHIN $0", circle);
- Support sort/distinct based on values from a dictionary e.g.
realm.All<MyModel>().Filter("TRUEPREDICATE SORT(meta['age'])")
. (Core 13.14.0) - Fixed a potential crash when opening the realm after failing to download a fresh FLX realm during an automatic client reset. (Core 13.14.0)
- Fixed a fatal error (reported to the sync error handler) during client reset (or automatic PBS to FLX migration) if the reset has been triggered during an async open and the schema being applied has added new classes. (Core 13.11.0)
- Full text search would sometimes find words where the word only matches the beginning of the search token. (Core 13.11.0)
- We could crash when removing backlinks in cases where forward links did not have a corresponding backlink due to corruption. We now silently ignore this inconsistency in release builds, allowing the app to continue. (Core 13.12.0)
IDictionary<string, IRealmObject?>
would expose unresolved links rather than mapping them to null. In addition to allowing invalid objects to be read from Dictionaries, this resulted in queries on Dictionaries sometimes having incorrect results. (Core 13.12.0)- Access token refresh for websockets was not updating the location metadata. (Core 13.13.0)
- Using both synchronous and asynchronous transactions on the same thread or scheduler could hit the assertion failure "!realm.is_in_transaction()" if one of the callbacks for an asynchronous transaction happened to be scheduled during a synchronous transaction. (Core 13.13.0)
- Fixed a potential crash when opening the realm after failing to download a fresh FLX realm during an automatic client reset. (Core 13.14.0)
- Setting a property containing an embedded object to the same embedded object used to throw an exception with the text
Can't link to an embedded object that is already managed
. Now it is a no-op instead. (Issue #3262)
- Realm Studio: 13.0.0 or later.
- Using Core 13.15.0.
- Overhauled and extended the metrics collection of the SDK to better drive future development effort. (PR #3209)
- The
error
argument inNotificationCallbackDelegate
andDictionaryNotificationCallbackDelegate
used in*collection*.SubscribeForNotifications
has been removed. It has been unused for a long time, since internal changes to the database made it impossible for errors to occur during notification callbacks. (Issue #3014) - Removed
RealmObjectBase.GetBacklinks
- insteadRealmObjectBase.DynamicApi.GetBacklinksFromType
should be used. (Issue #2391) - Removed
Realm.DynamicApi.CreateObject(string, object)
and replaced it with more specialized overloads:RealmObjectBase.DynamicApi.CreateObject(string)
can be used to create an object without a primary key.RealmObjectBase.DynamicApi.CreateObject(string, string/long?/ObjectId?/Guid?)
can be used to create an object with a primary key of the corresponding type.
- The API exposed by
Realm.DynamicApi
no longer returndynamic
, instead opting to return concrete types, such asIRealmObject
,IEmbeddedObject
, and so on. You can still cast the returned objects todynamic
and go through the dynamic API, but that's generally less performant than using the string-based API, such asIRealmObjectBase.DynamicApi.Get/Set
, especially on AOT platforms such as iOS or Unity. (Issue #2391) - Removed
Realm.WriteAsync(Action<Realm>)
in favor ofRealm.WriteAsync(Action)
. The newWriteAsync
method introduced in 10.14.0 is more efficient and doesn't require reopening the Realm on a background thread. While not recommended, if you prefer to get the old behavior, you can write an extension method like:(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(); }
- Removed
InMemoryConfiguration.EncryptionKey
. It was never possible to encrypt in-memory Realms and setting that property would have resulted in runtime errors. (PR #3236) - Removed
SyncConfiguration
- usePartitionSyncConfiguration
orFlexibleSyncConfiguration
instead. (PR #3237) - Removed
Realm.GetSession
- useRealm.SyncSession
instead. (PR #3237) - Removed
DiscardLocalResetHandler
- useDiscardUnsyncedChangedHandler
instead. (PR #3237) - Removed
Session.SimulateClientReset
extensions. These didn't work with automatic reset handlers and were more confusing than helpful. (PR #3237) - Removed
AppConfiguration.CustomLogger
andAppConfiguration.LogLevel
- useLogger.Default
andLogger.LogLevel
instead. (PR #3238) - Removed
RealmConfigurationBase.ObjectClasses
- useRealmConfigurationBase.Schema
instead. (PR #3240) - Removed
ObjectSchema.IsEmbedded
- useObjectSchema.BaseType
instead. (PR #3240) - Removed
ObjectSchema.Builder.IsEmbedded
- useObjectSchema.Builder.RealmSchemaType
instead. (PR #3240) - Removed
ObjectSchema.Builder(string name, bool isEmbedded = false)
- useBuilder(string name, ObjectSchemaType schemaType)
instead. (PR #3240) - Removed
RealmSchema.Find
- useRealmSchema.TryFindObjectSchema
instead. (PR #3240) - Removed
User.GetPushClient
as it has been deprecated in Atlas App Services - see https://www.mongodb.com/docs/atlas/app-services/reference/push-notifications/. (PR #3241) - Removed
SyncSession.Error
event - useSyncConfigurationBase.OnSessionError
when opening a Realm instead. (PR #3241) - Removed the parameterless constructor for
ManualRecoveryHandler
- use the one that takes a callback instead. (PR #3241) RealmValue.AsString
will now throw an exception if the value containsnull
. If you want to get a nullable string, useAsNullableString
. (PR #3245)RealmValue.AsData
will now throw an exception if the value containsnull
. If you want to get a nullablebyte[]
, useAsNullableData
. (PR #3245)RealmValue.AsRealmObject
will now throw an exception if the value containsnull
. If you want to get a nullable string, useAsNullableRealmObject
. (PR #3245)Realm.SyncSession
will now throw an error if the Realm is not opened with aPartitionSyncConfiguration
orFlexibleSyncConfiguration
- before it used to returnnull
. (PR #3245)Realm.Subscriptions
will now throw an error if the Realm is not opened with aFlexibleSyncConfiguration
- before it used to returnnull
. (PR #3245)- Removed
PermissionDeniedException
as it was no longer possible to get it. (Issue #3272) - Removed some obsolete error codes from the
ErrorCode
enum. All codes removed were obsolete and no longer emitted by the server. (PR 3273) - Removed
IncompatibleSyncedFileException
as it was no longer possible to get it. (Issue #3167) - The
Realms.Schema.Property
API now useIndexType
rather than a boolean indicating whether a property is indexed. (Issue #3281) - The extension methods in
StringExtensions
(Like
,Contains
) are now deprecated. Use the identical ones inQueryMethods
instead - e.g.realm.All<Foo>().Where(f => f.Name.Like("Mic*l"))
would need to be rewritten likerealm.All<Foo>().Where(f => QueryMethods.Like(f.Name, "Mic*l"))
.
- Added nullability annotations to the Realm assembly. Now methods returning reference types are correctly annotated to indicate whether the returned value may or may not be null. (Issue #3248)
- Replacing a value at an index (i.e.
myList[1] = someObj
) will now correctly raiseCollectionChange
notifications with theReplace
action. (Issue #2854) - It is now possible to change the log level at any point of the application's lifetime. (PR #3277)
- Some log messages have been added to the Core database. Events, such as opening a Realm or committing a transaction will now be logged. (Issue #2910)
- Added support for Full-Text search (simple term) queries. (Issue #3281)
- To enable FTS queries on string properties, add the
[Indexed(IndexType.FullText)]
attribute. - To run LINQ queries, use
QueryMethods.FullTextSearch
:realm.All<Book>().Where(b => QueryMethods.FullTextSearch(b.Description, "fantasy novel"))
. - To run
Filter
queries, use theTEXT
operator:realm.All<Book>().Filter("Description TEXT $0", "fantasy novel")
.
- To enable FTS queries on string properties, add the
- Performance improvement for the following queries (Core 13.8.0):
- Significant (~75%) improvement when counting (
IQueryable.Count()
) the number of exact matches (with no other query conditions) on a string/int/UUID/ObjectID property that has an index. This improvement will be especially noticiable if there are a large number of results returned (duplicate values). - Significant (~99%) improvement when querying for an exact match on a
DateTimeOffset
property that has an index. - Significant (~99%) improvement when querying for a case insensitive match on a
RealmValue
property that has an index. - Moderate (~25%) improvement when querying for an exact match on a Boolean property that has an index.
- Small (~5%) improvement when querying for a case insensitive match on a
RealmValue
property that does not have an index. - Moderate (~30%) improvement of equality queries on a non-indexed
RealmValue
.
- Significant (~75%) improvement when counting (
- Enable multiple processes to operate on an encrypted Realm simultaneously. (Core 13.9.0)
- Improve performance of rolling back write transactions after making changes. If no notifications events are subscribed to, this is now constant time rather than taking time proportional to the number of changes to be rolled back. Rollbacks when there are notifications subscriptions are 10-20% faster. (Core 13.9.4)
- PBS to FLX Migration for migrating a client app that uses partition based sync to use flexible sync under the hood if the server has been migrated to flexible sync. (Core 13.10.0)
- Fixed an issue that could cause a
The specified table name is already in use
exception when creating a new Realm file on multiple threads. (Issue #3302) - Fixed a bug that may have resulted in arrays being in different orders on different devices. Some cases of “Invalid prior_size” may be fixed too. (Core 13.7.1)
- Fixed a crash when querying a
RealmValue
property with a string operator (contains/like/beginswith/endswith) or with case insensitivity. (Core 13.8.0) - Querying for equality of a string on an indexed
RealmValue
property was returning case insensitive matches. For example querying formyIndexedValue == "Foo"
would incorrectly match on values of "foo" or "FOO" etc. (Core 13.8.0) - Adding an index to a
RealmValue
property on a non-empty table would crash with an assertion. (Core 13.8.0) SyncSession.Stop()
could hold a reference to the database open after shutting down the sync session, preventing users from being able to delete the realm. (Core 13.8.0)- Fix a stack overflow crash when using the query parser with long chains of AND/OR conditions. (Core 13.9.0)
ClientResetException.InitiateClientReset()
no longer ignores the result of trying to remove a realm. This could have resulted in a client reset action being reported as successful when it actually failed on windows if theRealm
was still open. (Core 13.9.0)- Fix a data race where if one thread committed a write transaction which increased the number of live versions above the previous highest seen during the current session at the same time as another thread began a read, the reading thread could read from a no-longer-valid memory mapping (Core 13.9.0).
- Performing a query like
{1, 2, 3, ...} IN list
where the array is longer than 8 and all elements are smaller than some values in list, the program would crash (Core 13.9.4) - Performing a large number of queries without ever performing a write resulted in steadily increasing memory usage, some of which was never fully freed due to an unbounded cache (Core 13.9.4)
- Realm Studio: 13.0.0 or later.
- Using Core 13.10.0.
- Fixed a crash that occurs when the server sends a PermissionDenied error. (Issue #3292)
- Realm Studio: 13.0.0 or later.
- Using Core 13.6.0.
- Added
SyncConfiguration.CancelAsyncOperationsOnNonFatalErrors
which controls whether async operations (such asRealm.GetInstanceAsync
,Session.WaitForUploadAsync
and so on) should throw an exception whenever a non-fatal session error occurs. (Issue #3222) - Added
AppConfiguration.SyncTimeoutOptions
which has a handful of properties that control sync timeouts, such as the connection timeout, ping-pong intervals, and others. (Issue #3223) - Updated some of the exceptions being thrown by the SDK to align them better with system exceptions and include more information - for example, we'll now throw
ArgumentException
when invalid arguments are provided rather thanRealmException
. (Issue #2796) - Added a new exception -
CompensatingWriteException
that contains information about the writes that have been reverted by the server due to permissions. It will be passed to the suppliedFlexibleSyncConfiguration.OnSessionError
callback similarly to other session errors. (Issue #3258) - Added support for Linux Arm/Arm64 in .NET applications. (Issue #721)
- Changed the way the Realm SDK registers BsonSerializers. Previously, it would indiscriminately register them via
BsonSerializer.RegisterSerializer
, which would conflict if your app was using theMongoDB.Bson
package and defined its own serializers forDateTimeOffset
,decimal
, orGuid
. Now, registration happens viaBsonSerializer.RegisterSerializationProvider
, which means that the default serializers used by the SDK can be overriden by callingBsonSerializer.RegisterSerializer
at any point before a serializer is instantiated or by callingBsonSerializer.RegisterSerializationProvider
after creating an App/opening a Realm. (Issue #3225) - Creating subscriptions with queries having unicode parameters causes a server error. (Core 13.6.0)
- Fixed an issue with Unity 2022 and later that would result in builds failing with
Specified method is not supported
error. (Issue #3306)
- Realm Studio: 13.0.0 or later.
- Using Core 13.6.0.
- Cancel existing builds when a new commit is pushed to a PR. (PR #3260)
File format version bumped. Old files will be automatically upgraded but cannot be downgraded and opened with older versions of the .NET SDK.
User.GetPushClient
has been deprecated as it will be disabled soon on the server. (Issue #3073)
-
The realm file will be shrunk if the larger file size is no longer needed. (Core 13.0.0)
-
Most of the file growth caused by version pinning is eliminated. (Core 13.0.0)
-
Improve performance of acquiring read locks when a read lock for that version is already held. This speeds up many operations related to change notifications, and particularly refreshing a Realm which has change notifiers registered. (Core 13.2.0)
-
Upgrade OpenSSL from 1.1.1n to 3.0.7. (Core 13.2.0)
-
Converting flexible sync realms to bundled and local realms is now supported (Core 13.2.0)
-
Add support for nested classes for source generated classes. (Issue #3031)
-
Enhanced support for nullable reference types in the model definition for source generated classes. This allows to use realm models as usual when nullable context is active, and removes the need to use of the
Required
attribute to indicate required properties, as this information will be inferred directly from the nullability status. There are some considerations regarding the nullability of properties that link to realm object:- Properties that link to a single realm object are inherently nullable, and thus the type must be defined as nullable.
- List, Sets and Backlinks cannot contain null objects, and thus the type parameter must be non-nullable.
- Dictionaries can contain null values, and thus the type parameter must be nullable.
Defining the properties with a different nullability annotation than what has been outlined here will raise a diagnostic error. For instance:
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 }
We realise that some developers would still prefer to have more freedom in the nullability annotation of such properties, and it is possible to do so by setting
realm.ignore_objects_nullability = true
in a global configuration file (more information about global configuration files can be found in the .NET documentation). If this is enabled, all the previous properties will be considered valid, and the nullability annotations for properties linking to objects will be ignored. -
Improved performance of
PropertyChanged
andCollectionChanged
notifications. (Issue #3112) -
Added support for tvOS in Xamarin/MAUI and Unity applications. (Issue #3161)
-
Improve the performance of
Realm.Freeze()
. (Core 13.3.0)
ISet<RealmValue>
consider string and binary data equivalent. This could cause the client to be inconsistent with the server if a string and some binary data with equivalent content was inserted from Atlas. (Core 13.0.0)- Fixed wrong assertion on query error that could result in a crash. (Core 13.1.0)
- Fixed an issue preventing opening an encrypted file on a device with a page size bigger than the one on which the file was produced. (Core 13.1.1)
- Fixed possible segfault in sync client where async callback was using object after being deallocated (Core 13.2.0)
- Fixed crash when using client reset with recovery and flexible sync with a single subscription (Core 13.2.0)
- Added a more descriptive error message when a model's property is unsupported. It'll now suggest that the target type may need to inherit from
RealmObject
. (Issue #3162) - Disposing a Realm instance while an active transaction is running will now correctly roll back the transaction. (Issue #2924)
- Fixed an issue that would cause
PropertyChanged
notifications to be delivered for collection properties when the content of the collection was modified even if the collection itself was not replaced. (Issue #3112) - Fixed an issue where weaving assemblies on Unity could result in
System.InvalidOperationException
. (Issue #3199) Session.Stop
will now correctly keep the session stopped untilSession.Start
is called. Previously, there were a number of circumstances that could cause the session to be resumed, even if not explicitly requested. (Core 13.3.0)- When client reset with recovery is used and the recovery does not actually result in any new local commits, the sync client may have gotten stuck in a cycle with a A fatal error occured during client reset: 'A previous 'Recovery' mode reset from did not succeed, giving up on 'Recovery' mode to prevent a cycle' error message. (Core 13.3.0)
- Fixed diverging history in flexible sync if writes occur during bootstrap to objects that just came into view. (Core 13.3.0)
- Fix several data races when opening cached frozen Realms. New frozen Realms were added to the cache and the lock released before they were fully initialized, resulting in races if they were immediately read from the cache on another thread. (Core 13.3.0)
- If a client reset w/recovery or discard local is interrupted while the "fresh" realm is being downloaded, the sync client may crash with a MultpleSyncAgents exception. (Core 13.3.0)
- Changesets from the server sent during FLX bootstrapping that are larger than 16MB can cause the sync client to crash with a LogicError. (Core 13.3.0)
- Sharing Realm files between a Catalyst app and Realm Studio did not properly synchronize access to the Realm file. (Core 13.4.0)
- Realm Studio: 13.0.0 or later.
- Using Core 13.4.0.
- Updated
DynamicRealmObjectHelper.TryGetPrimaryKeyValue
not to use reflection. (Issue #3166) - Fixed UWP tests workflow when running a debug build. (Issue #3030)
-
Removed redundant serialization/deserialization of arguments in CallAsync. (Issue #3079)
-
Added a field
Transaction.State
which describes the current state of the transaction. (Issue #2551) -
Improved error message when null is passed as argument to params for EmailPasswordAuth.CallResetPasswordFunctionAsync. (Issue #3011)
-
Removed backing fields of generated classes' properties which should provide minor improvements to memory used by Realm Objects (Issue #2647)
-
Added two extension methods on
IDictionary
to get anIQueryable
collection wrapping the dictionary's values:dictionary.AsRealmQueryable()
allows you to get aIQueryable<T>
fromIDictionary<string, T>
that can be then treated as a regular queryable collection and filtered/ordered with LINQ orFilter(string)
.dictionary.Filter(query, arguments)
will filter the list and return a filtered collection of dictionary's values. It is roughly equivalent todictionary.AsRealmQueryable().Filter(query, arguments)
.
The resulting queryable collection will behave identically to the results obtained by calling
realm.All<T>()
, i.e. it will emit notifications when it changes and automatically update itself. (Issue #2647) -
Improve performance of client reset with automatic recovery and converting top-level tables into embedded tables. (Core upgrade)
-
Flexible sync will now wait for the server to have sent all pending history after a bootstrap before marking a subscription as Complete. (Core upgrade)
-
Slightly improve performance of
Realm.RemoveAll()
which removes all objects from an open Realm database. (Issue #2233) -
Improve error messages when not setting a BaseFilePath for realm or app configuration. (Issue 2863)
-
Added
IList
implementation to all Realm collections to allow for UWP ListView databinding. (Issue #1759)
- Fixed issue where Realm parameters' initialization would get run twice, resulting in unexpected behavior.
- Prevented
IEmbeddedObject
s andIAsymmetricObject
s from being used asRealmValue
s when added to a realm, and displaying more meaningful error messages. - Fix a use-after-free if the last external reference to an encrypted Realm was closed between when a client reset error was received and when the download of the new Realm began. (Core upgrade)
- Fixed an assertion failure during client reset with recovery when recovering a list operation on an embedded object that has a link column in the path prefix to the list from the top level object. (Core upgrade)
- Opening an unencrypted file with an encryption key would sometimes report a misleading error message that indicated that the problem was something other than a decryption failure. (Core upgrade)
- Fix a rare deadlock which could occur when closing a synchronized Realm immediately after committing a write transaction when the sync worker thread has also just finished processing a changeset from the server. (Core upgrade)
- Fix a race condition which could result in "operation cancelled" errors being delivered to async open callbacks rather than the actual sync error which caused things to fail. (Core upgrade)
- Bootstraps will not be applied in a single write transaction - they will be applied 1MB of changesets at a time, or as configured by the SDK. (Core upgrade)
- Fix database corruption and encryption issues on apple platforms. (Core upgrade)
- Added fully qualified names for source generated files, to avoid naming collisions. (Issue #3099
- Fixed an issue that would cause an exception when using unmanaged objects in bindings (Issue #3094)
- Fixed an issue where fetching a user's profile while the user logs out would result in an assertion failure. (Core upgrade)
- Removed the ".tmp_compaction_space" file being left over after compacting a Realm on Windows. (Core upgrade)
- Fixed a crash that would occur if you close a synchronized Realm while waiting for
SubscriptionSet.WaitForSynchronizationAsync
. (Issue #2952) - Avoid calling the setter on UI-bound properties in case the new value of the property is the same as the current one. This avoids some issue with MAUI, that seems to be calling the setter of bound properties unnecessarily when CollectionView/ListView are shown on screen. This is problematic if the object does not belong to the current user's permissions, as it will cause a compensanting write. In some limited cases this could cause an error loop (verified on iOS) when recycling of cells is involved. (Issue #3128)
- Fixes an issue with where the source generator will not add the namespace for types used in properties' initializers. (Issue #3135)
- Fixed an issue that would prevent Realm from working correctly in Unity applications that have Domain Reloading turned off. (Issue #2898)
- Fixed a bug when using
string.Contains
in .NET 2.1 or later where the search string is not a literal. (Issue #3134) - Added
[Obsolete]
notice for a fewErrorCode
enum members that are no longer in use. (Issue #3155
- Realm Studio: 12.0.0 or later.
- Using Core 12.13.0.
- Replaced
Realm.RefreshAsync
with a native implementation. (PR #2995)
-
Introduced
Realm.SourceGenerator
, a Source Generator that can generate Realm model classes. This is part of our ongoing effort to modernize the Realm library, and will allow to introduce certain language level features easier in the future. In order to use the source generation the model classes need to be declared implementing one of the base interfaces (IRealmObject
,IEmbeddedObject
orIAsymmetricObject
) and be declared partial. For example: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; } }
The source generator will then take care of adding the full implementation for the interfaces.
Most of the time converting the "classic" Realm model classes (classes derived from
RealmObject
,EmbeddedObject
orAsymmetricObject
) to use the new source generation means just defining the class as partial and switching out the base class for the corresponding interface implementation. The classic Realm model definition will still be supported, but will be phased out in the future.Please note that the source generator is still in beta, so let us know if you experience any issue while using them. Some additional notes:
OnManaged
andOnPropertyChanged
are now partial methods.- Inheritance is not supported, so the Realm models cannot derive from any other class.
- Nested classes are not supported.
- Fixed a NullReferenceException being thrown when subscribing to
PropertyChanged
notifications on aSession
instance that is then garbage collected prior to unsubscribing. (PR #3061) - Removed bitcode support from the iOS binary as it's no longer accepted for App Store submissions. (Issue #3059)
- Fixed returning the parent when accessing it on an
IEmbeddedObject
. (Issue #2742) - Slightly increased performance and reduced allocations when creating an enumerator for frozen collections (Issue #2815).
- Realm Studio: 11.0.0 or later.
- Using Core 12.9.0.
- Added workflow to automatically assign users to issues and PRs. (PR #3069)
- Added workflow to validate changelog has been updated. (PR #3069)
- Prioritize integration of local changes over remote changes - shorten the time users may have to wait when committing local changes. Stop storing downloaded changesets in history. (Core upgrade)
- Greatly improve the performance of sorting or distincting a Dictionary's keys or values. The most expensive operation is now performed O(log N) rather than O(N log N) times, and large Dictionaries can see upwards of 99% reduction in time to sort. (Core upgrade)
- Seamlessly handle migrating an App Services application deployment model. (Core upgrade)
- Fix a use-after-free when a sync session is closed and the app is destroyed at the same time. (Core upgrade)
- Fixed a
NullReferenceException
occurring inRealmObjectBase
's finalizer whenever an exception is thrown before the object gets initialized. (Issue #3045)
- Realm Studio: 12.0.0 or later.
- Using Core 12.9.0
-
Introduced
AsymmetricObject
intended for write-heavy workloads, where high performance is generally important. This new object:- syncs data unidirectionaly, from the clients to the server
- can't be queried, deleted, or modified once added to the Realm
- is only usable with flexible sync
- can't be the receiveing end of any type of relationship
- can contain
EmbeddedObject
s but cannot link toRealmObject
orAsymmetricObject
.
In the same write transaction, it is legal to add
AsymmetricObject
s andRealmObject
sclass 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
-
Added two client reset handlers,
RecoverUnsyncedChangesHandler
andRecoverOrDiscardUnsyncedChangesHandler
, that try to automatically merge the unsynced local changes with the remote ones in the event of a client reset. Specifically withRecoverOrDiscardUnsyncedChangesHandler
, you can fallback to the discard local strategy in case the automatic merge can't be performed as per your server's rules. These new two stragegies simplify even more the handling of client reset events when compared toDiscardUnsyncedChangesHandler
.RecoverOrDiscardUnsyncedChangesHandler
is going to be the default from now on. An example is as follows -
Added two client reset handlers,
RecoverUnsyncedChangesHandler
andRecoverOrDiscardUnsyncedChangesHandler
, that try to automatically merge the unsynced local changes with the remote ones in the event of a client reset. Specifically withRecoverOrDiscardUnsyncedChangesHandler
, you can fallback to the discard unsynced strategy in case the automatic merge can't be performed as per your server's rules. These new two stragegies simplify even more the handling of client reset events when compared toDiscardUnsyncedChangesHandler
.RecoverOrDiscardUnsyncedChangesHandler
is going to be the default from now on. More info on the aforementioned strategies can be found in our docs page. An example usage of one of the new handler is as follows: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)
-
Introducing string query support for constant list expressions such as
realm.All<Car>().Filter("Color IN {'blue', 'orange'}")
. This also includes general query support for list vs list matching such asrealm.All<Car>().Filter("NONE Features IN {'ABS', 'Seat Heating'}")
. (Core upgrade) -
Improve performance when a new Realm file connects to the server for the first time, especially when significant amounts of data has been written while offline. (Core upgrade)
-
Shift more of the work done on the sync worker thread out of the write transaction used to apply server changes, reducing how long it blocks other threads from writing. (Core upgrade)
-
Improve the performance of the sync changeset parser, which speeds up applying changesets from the server. (Core upgrade)
- Added a more meaningful error message whenever a project doesn't have
[TargetFramework]
defined. (Issue #2843) - Opening a read-only Realm for the first time with a
SyncConfiguration
did not set the schema version, which could lead tom_schema_version != ObjectStore::NotVersioned
assertion failures. (Core upgrade) - Upload completion callbacks (i.e.
Session.WaitForUploadAsync
) may have called before the download message that completed them was fully integrated. (Core upgrade) - Fixed an exception "fcntl() with F_BARRIERFSYNC failed: Inappropriate ioctl for device" when running with MacOS on an exFAT drive. (Core upgrade)
- Syncing of a Decimal128 with big significand could result in a crash. (Core upgrade)
Realm.Refresh()
did not actually advance to the latest version in some cases. If there was a version newer than the current version which did not require blocking it would advance to that instead, contrary to the documented behavior. (Core upgrade)- Several issues around notifications were fixed. (Core upgrade)
- Fix a data race on RealmCoordinator::m_sync_session which could occur if multiple threads performed the initial open of a Realm at once.
- If a SyncSession outlived the parent Realm and then was adopted by a new Realm for the same file, other processes would not get notified for sync writes on that file.
- Fix one cause of QoS inversion warnings when performing writes on the main thread on Apple platforms. Waiting for async notifications to be ready is now done in a QoS-aware ways.
- If you set a subscription on a link in flexible sync, the server would not know how to handle it (#5409, since v11.6.1)
- If a case insensitive query searched for a string including an 4-byte UTF8 character, the program would crash. (Core upgrade)
- Added validation to prevent adding a removed object using Realm.Add. (Issue #3020)
- Realm Studio: 12.0.0 or later.
- Using Core 12.7.0.
- Fixed an issue introduced in 10.15.0 that would prevent non-anonoymous user authentication against Atlas App Services. (Issue #2987)
- Added override to
User.ToString()
that outputs the user id and provider. (PR #2988) - Added == and != operator overloads to
User
that matches the behavior ofUser.Equals
. (PR #2988)
- Realm Studio: 12.0.0 or later.
- Using Core 12.4.0.
- Preview support for .NET 6 with Mac Catalyst and MAUI. (PR #2959)
- Reduce use of memory mappings and virtual address space (Core upgrade)
- Fix a data race when opening a flexible sync Realm (Core upgrade).
- Fixed a missing backlink removal when setting a
RealmValue
from aRealmObject
to null or any other non-RealmObject value. Users may have seen exception of "key not found" or assertion failures such asmixed.hpp:165: [realm-core-12.1.0] Assertion failed: m_type
when removing the destination object. (Core upgrade) - Fixed an issue on Windows that would cause high CPU usage by the sync client when there are no active sync sessions. (Core upgrade)
- Improved performance of sync clients during integration of changesets with many small strings (totalling > 1024 bytes per changeset) on iOS 14, and devices which have restrictive or fragmented memory. (Core upgrade)
- Fix exception when decoding interned strings in realm-apply-to-state tool. (Core upgrade)
- Fix a data race when committing a transaction while multiple threads are waiting for the write lock on platforms using emulated interprocess condition variables (most platforms other than non-Android Linux). (Core upgrade)
- Fix some cases of running out of virtual address space (seen/reported as mmap failures) (Core upgrade)
- Decimal128 values with more than 110 significant bits were not synchronized correctly with the server (Core upgrade)
- Realm Studio: 12.0.0 or later.
- Using Core 12.4.0.
- Added a more efficient replacement for
Realm.WriteAsync
. The previous API would start a background thread, open the Realm there and run a synchronous write transaction on the background thread. The new API will asynchronously acquire the write lock (begin transaction) and asynchronously commit the transaction, but the actual write block will execute on the original thread. This means that objects/queries captured before the block can be used inside the block without relying on threadsafe references. Importantly, you can mix and match async and sync calls. And when calling anyRealm.WriteAsync
on a background thread the call is just run synchronously, so you should useRealm.Write
for readability sake. The new API is made ofRealm.WriteAsync<T>(Func<T> function, CancellationToken cancellationToken)
,Realm.WriteAsync(Action action, CancellationToken cancellationToken)
,Realm.BeginWriteAsync(CancellationToken cancellationToken)
andTransaction.CommitAsync(CancellationToken cancellationToken)
. While theTransaction.Rollback()
doesn't need an async counterpart. The deprecated API calls areRealm.WriteAsync(Action<Realm> action)
,Real.WriteAsync<T>(Func<Realm, IQueryable<T>> function)
,Realm.WriteAsync<T>(Func<Realm, IList<T>> function)
andRealm.WriteAsync<T>(Func<Realm, T> function)
. Here is an example of usage:(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
- Added the method
App.DeleteUserFromServerAsync
to delete a user from the server. It will also invalidate the user locally as well as remove all their local data. It will not remove any data the user has uploaded from the server. (Issue #2675) - Added boolean property
ChangeSet.IsCleared
that is true when the collection gets cleared. Also Realm collections now raiseCollectionChanged
event with actionReset
instead ofRemove
when the collections is cleared. Please note that this will work only with collection properties, such asIList
andISet
. (Issue #2856) - Added
PopulateInitialSubscriptions
toFlexibleSyncConfiguration
- this is a callback that will be invoked the first time a Realm is opened. It allows you to create the initial subscriptions that will be added to the Realm before it is opened. (Issue #2913) - Bump the SharedInfo version to 12. This requires update of any app accessing the file in a multiprocess scenario, including Realm Studio.
- The sync client will gracefully handle compensating write error messages from the server and pass detailed info to the SDK's sync error handler about which objects caused the compensating write to occur. (#5528)
- Adding an object to a Set, deleting the parent object, and then deleting the previously mentioned object causes crash (#5387)
- Flexible sync would not correctly resume syncing if a bootstrap was interrupted (#5466)
- Flexible sync will now ensure that a bootstrap from the server will only be applied if the entire bootstrap is received - ensuring there are no orphaned objects as a result of changing the read snapshot on the server (#5331)
- Partially fix a performance regression in write performance on Apple platforms. Committing an empty write transaction is ~10x faster than 10.13.0, but still slower than pre-10.7.1 due to using more crash-safe file synchronization (since v10.7.1). (Swift issue #7740).
- Realm Studio: 12.0.0 or later.
- Using Core 12.1.0.
- Added the functionality to convert Sync Realms into Local Realms and Local Realms into Sync Realms. (Issue #2746)
- Added support for a new client reset strategy, called Discard Unsynced Changes. This new stragegy greatly simplifies the handling of a client reset event on a synchronized Realm.
This addition makes
Session.Error
deprecated. In order to temporarily continue using the currentSession.Error
the following must be done:In order to take advantage of the new Discard Unsynced Changes feature, the following should be done (all callbacks are optional):var conf = new PartitionSyncConfiguration(partition, user) { ClientResetHandler = new ManualRecoveryHandler(); };
If, instead, you want to continue using the manual solution even after the end of the deprecation period, the following should be donevar 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 });
- Fixed a
System.DllNotFoundException
being thrown by Realm APIs at startup on Xamarin.iOS (Issue #2926, since 10.12.0)
- Realm Studio: 11.0.0 or later.
- Using Core 11.14.0.
- Preview support for .NET 6 with iOS, Android, and MAUI. We've added tentative support for the new .NET 6 Mobile workloads (except MacCatalyst, which will be enabled later). The .NET tooling itself is still in preview so we don't have good test coverage of the new platforms just yet. Please report any issues you find at https://github.com/realm/realm-dotnet/issues/new/choose.
- Realm Studio: 11.0.0 or later.
- Using Core 11.14.0.
- Fixed corruption bugs when encryption is used. (Core Issue #5360)
- Realm Studio: 11.0.0 or later.
- Using Core 11.14.0.
- Fixed an issue that would cause the managed HttpClientHandler to be used in Xamarin applications, even if the project is configured to use the native one. (Issue #2892)
- Realm Studio: 11.0.0 or later.
- Using Core 11.12.0.
- Added property
Session.ConnectionState
to get aSession
'sSessionConnectionState
. Additionally,Session
now implementsINotifyPropertyChanged
so that you can listen for changes onSession.ConnectionState
. (Issue #2801) - Realm now supports running on Windows ARM64 for .NET Framework, .NET Core, and UWP apps. (Issues #2704 and #2817)
- Added a property
AppConfiguration.HttpClientHandler
that allows you to override the default http client handler used by the Realm .NET SDK to make http calls. Note that this only affects the behavior of http calls, such as user login, function calls, and remote mongodb calls. The sync client uses a native websocket implementation and will not use the provided message handler. (Issue #2865)
- [Unity] Fixed an issue that caused the weaver to fail when invoked via the
Tools->Realm->Weave Assemblies
editor menu with the errorUnityEngine.UnityException: get_dataPath can only be called from the main thread
. (Issue #2836) - Fixed an issue that caused
RealmInvalidObjectException
to be caused when enumerating an invalid Realm collection (e.g. a list belonging to a deleted object). (Issue #2840) - Query parser would not accept "in" as a property name (Core Issue #5312)
- Application would sometimes crash with exceptions like 'KeyNotFound' or assertion "has_refs()". Other issues indicating file corruption may also be fixed by this. The one mentioned here is the one that lead to solving the problem. (Core Issue #5283)
- Realm Studio: 11.0.0 or later.
- Using Core 11.12.0.
- Enabled running Benchmarks on iOS devices by turning on the interpreter for some windows assemblies.
This release fixes a major bug in the way Guid values are stored in the database. It provides an automatic migration for local (non-synchronized) databases, but extra caution is needed when upgrading an app that uses Sync.
A Guid is represented by 4 components - int
, short
, short
, and a byte[8]
. Microsoft's Guids diverge from the UUID spec in that they encode the first three components with the endianness of the system (little-endian for all modern CPUs), while UUIDs encode their components as big-endian. The end result is that the same bytes have a different string representations when interpreted as a Guid
by the .NET SDK vs when interpreted as a UUID
by the Realm Database - e.g. f2952191-a847-41c3-8362-497f92cb7d24
vs 912195f2-47a8-c341-8362-497f92cb7d24
(note the swapping of bytes in the first three components). You can see the issue by opening a database created by the .NET SDK in Realm Studio and inspecting the values for Guid properties.
The fix we're providing is to adjust the behavior of the .NET SDK to read/write Guids to the database with big-endian representation. This means that the SDK and the database will consistently display the same values. This has some implications which are described in the Local- and Synchronized Realms sections.
For local Realms, we're executing a one-time migration the first time the Realm is opened with the new SDK. During this migration, we'll update all Guid fields to big-endian format. This means that their string representation will remain the same, but the value in the database will change to match it. This means that the upgrade process should be seamless, but if you decide to downgrade to an older version of the SDK, you'll see the byte order get flipped. The migration will not execute multiple times, even if you downgrade.
There's no client migration provided for synchronized Realms. This is because the distributed nature of the system would mean that there will inevitably be a period of inconsistent state. Instead, the values of the Guid
properties are read as they're already stored in the database, meaning the string representation will be flipped compared to previous versions of the SDK but it will now match the representation in Atlas/Compass/Realm Studio. There are three general groups your app will fall under:
- If you don't care about the string values of Guid properties on the client, then you don't need to do anything. The values will still be unique and valid Guids.
- If you do use the string guid values from the client app - e.g. to correlate user ids with a CMS, but have complete control over your client devices - e.g. because this an internal company app, then it's advised that you execute a one-time migration of the data in Atlas and force all users to upgrade to the latest version of the app.
- If you can't force all users to update at the same time, you can do a live migration by adding an extra property for each Guid property that you have and write a trigger function that will migrate the data between the two. The old version of the app will write to the original property, while the new version will write to the new property and the trigger will convert between the two.
If you are using sync and need to update to the latest version of the SDK but are not ready to migrate your data yet, see the Opting out
section.
If for some reason, you want to opt out of the fixed behavior, you can temporarily opt out of it by setting the Realm.UseLegacyGuidRepresentation
property to true
. This is not recommended but can be used when you need more time to test out the migration while still getting bugfixes and other improvements. Setting it to true
does two things:
- It brings back the pre-10.10.0 behavior of reading/writing Guid values with little-endian representation.
- It disables the migration code for local Realms. Note that it will not revert the migration if you already opened the Realm file when
UseLegacyGuidRepresentation
was set tofalse
.
- Lifted a limitation that would prevent you from changing the primary key of objects during a migration. It is now possible to do it with both the dynamic and the strongly-typed 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] The Realm menu item in the Unity Editor was moved to
Tools/Realm
to reduce clutter and align with other 3rd party editor plugins. (Issue #2807)
- Fixed an issue with xUnit tests that would cause
System.Runtime.InteropServices.SEHException
to be thrown whenever Realm was accessed in a non-async test. (Issue #1865) - Fixed a bug that would lead to unnecessary metadata allocation when freezing a realm. (Issue #2789)
- Fixed an issue that would cause Realm-managed objects (e.g.
RealmObject
, list, results, and so on) allocated during a migration block to keep the Realm open until they are garbage collected. This had subtle implications, such as being unable to delete the Realm shortly after a migration or being unable to open the Realm with a different configuration. (PR #2795) - Fixed an issue that prevented Unity3D's IL2CPP compiler to correctly process one of Realm's dependencies. (Issue #2666)
- Fixed the osx runtime path in the Realm NuGet package to also apply to Apple Silicon (universal) architectures (Issue #2732)
- Realm Studio: 11.0.0 or later.
- Using Core 11.10.0
-
Added support for a new mode of synchronization with MongoDB Realm, called "Flexible Sync". When using Flexible Sync, the client decides which queries it's interested in and asks the server for all objects matching these queries. The matching objects will be stored in a local Realm, just like before and can be queried and accessed while offline. This feature is in beta, so feedback - both positive and negative - is greatly appreciated and, as usual, we don't recommend using it for production workloads yet.
- Added a new configuration type, called
FlexibleSyncConfiguration
. Use this type to get aRealm
instance that uses the new synchronization mode with the server. - Deprecated the
SyncConfiguration
class in favor ofPartitionSyncConfiguration
. The two classes are equivalent and the new type is introduced to better contrast withFlexibleSyncConfiguration
. The two types are equivalent and allow you to open aRealm
instance that is using the old "Partition Sync" mode. - Added a new type, called
SubscriptionSet
. It is a collection, holding the various active query subscriptions that have been created for this Realm. This collection can be accessed via theRealm.Subscriptions
property. It will benull
for local and partition sync Realms and non-null for flexible sync Realms.
A minimal example would look like this:
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();
- Multiple subscriptions can be created for queries on the same class, in which case they'll be combined with a logical
OR
. For example, if you create a subscription for all orders created in 2022 and another for all orders created by the current user, your local Realm will contain the union of the two result sets. - Subscriptions can be named (which makes it easier to unsubscribe) or unnamed. Adding multiple unnamed subscriptions with the same query is a no-op.
- Modifying the set of active subscriptions is an expensive operation server-side, even if the resulting diff is not large. This is why we recommend batching subscription updates as much as possible to avoid overloading the server instance. A good practice is to declare the user subscriptions upfront - usually the first time the Realm is opened, and only update them when absolutely necessary.
- Find more information about the API and current limitations in the docs.
- Added a new configuration type, called
- Realm Studio: 11.0.0 or later.
- Using Core 11.8.0.
- Release tests are executed against realm-qa instead of realm-dev. (PR #2771)
- Added the
RealmConfigurationBase.FallbackPipePath
property. In the majority of cases this property can be left null, but it should be used when a realm is opened on a filesystem where named pipes cannot be created, such as external storage on Android that uses FAT32. In this case the path needs to point to a location on another filesystem where named pipes can be created. (PR #2766) - Added support arithmetric operations (+, -, *, /) in the string-based query syntax (
realm.All<Foo>().Filter("some-query")
). Operands can be properties and/or constants of numeric types (integer, float, double or Decimal128). You can now write a query like"(age + 5) * 2 > child.age"
. (Core upgrade)
- Fixed a race condition that could result in
Sharing violation on path ...
error when opening a Unity project on macOS. (Issue #2720, fix by @tomkrikorian) - Fixed an error being thrown when
Realm.GetInstance
is called multiple times on a readonly Realm. (Issue #2731) - Fixed a bug that would result in the
LIMIT
clause being ignored whenCount()
is invoked on aIQueryable
- e.g. expressions likerealm.All<Foo>().Filter("Bar > 5 LIMIT(1)).Count()
would ignore the limit in the string-based predicate and return the count of all matches. (Issue #2755) - Fixed the logic in
RealmResultsVisitor.TraverseSort
to allow sorting on interface properties. (Issue #1373, contribution by @daawaan)
- Realm Studio: 11.0.0 or later.
- Using Core 11.8.0.
- Updated naming of prerelease packages to use lowercase "pr" - e.g.
10.7.1-pr-2695.1703
instead of10.7.1-PR-2695.1703
. (PR #2765) - Migrated from using the cli to import/export applications to configuring them via the admin API. (PR #2768)
- A sync user's Realm was not deleted when the user was removed if the Realm path was too long such that it triggered the fallback hashed name (this is OS dependant but is 300 characters on linux). (Core upgrade)
- Don't keep trying to refresh the access token if the client's clock is more than 30 minutes ahead. (Core upgrade)
- Don't sleep the sync thread artificially if an auth request fails. This could be observed as a UI hang on applications when sync tries to connect after being offline for more than 30 minutes. (Core upgrade)
- Realm Studio: 11.0.0 or later.
- Using Core 11.6.1.
- Added the
Realm.SyncSession
property which will return the sync session for this Realm if the Realm is a synchronized one ornull
for local Realms. This is replacing theGetSession(this Realm)
extension method which is now deprecated. (PR #2711)
- Fixed a bug that would result in a
RealmException
being thrown when opening a readonly Realm with schema that is a superset of the schema on disk. Now the code will just work and treat any classes not present in the on-disk schema to be treated as empty collections - e.g.realm.All<ThisIsNotInOnDiskSchema>().Count == 0
. (Issue #2619) - Fixed a bug that would create a "Documents" folder in the binary app folder when the ransomware protection in Windows is turned on. (Issue #2685)
- Fixed an issue that would cause incorrect property implementation to be generated if
PropertyChanged.Fody
runs after the Realm weaver. (Issue #1873) - [Unity] Preserved additional constructors necessary to serialize and deserialize Custom User Data. (PR #2519)
- Fixed an issue that would result in
InvalidOperationException
when concurrently creating aRealmConfiguration
with an explicitly setSchema
property. (Issue #2701) - [Unity] Fixed an issue that would result in
NullReferenceException
when building for iOS when the Realm package hasn't been installed via the Unity Package Manager. (Issue #2698) - Fixed a bug that could cause properties of frozen objects to return incorrect value/throw an exception if the provided Realm schema didn't match the schema on disk. (Issue #2670)
- Fixed a rare assertion failure or deadlock when a sync session is racing to close at the same time that external reference to the Realm is being released. (Core upgrade)
- Fixed an assertion failure when opening a sync Realm with a user who had been removed. Instead an exception will be thrown. (Core upgrade)
- Fixed a rare segfault which could trigger if a user was being logged out while the access token refresh response comes in. (Core upgrade)
- Fixed a bug where progress notifiers continue to be called after the download of a synced realm is complete. (Core upgrade)
- Allow for EPERM to be returned from fallocate(). This improves support for running on Linux environments with interesting filesystems, like AWS Lambda. Thanks to @ztane for reporting and suggesting a fix. (Core upgrade)
- Fixed a user being left in the logged in state when the user's refresh token expires. (Core upgrade)
- SyncManager had some inconsistent locking which could result in data races and/or deadlocks, mostly in ways that would never be hit outside of tests doing very strange things. (Core upgrade)
- Realm Studio: 11.0.0 or later.
- Using Core 11.6.0.
- iOS wrappers are now built with the "new build system" introduced by Xcode 10 and used as default by Xcode 12. More info can be found in cmake's docs.
- We now refresh the resulting Realm instance when opening a synchronized Realm with
GetInstanceAsync
. (Issue #2256) - Added Sync tests for all platforms running on cloud-dev. (Issue #2049)
- Added Android tests running on the emulator. (Issue #2680)
- Started publishing prerelease packages to S3 using Sleet (feed url). (Issue #2708)
- Enable LTO for all builds. (PR #2714)
-
Added two extension methods on
ISet
to get anIQueryable
collection wrapping the set:set.AsRealmQueryable()
allows you to get aIQueryable<T>
fromISet<T>
that can be then treated as a regular queryable collection and filtered/ordered with LINQ orFilter(string)
.set.Filter(query, arguments)
will filter the set and return the filtered collection. It is roughly equivalent toset.AsRealmQueryable().Filter(query, arguments)
.
The resulting queryable collection will behave identically to the results obtained by calling
realm.All<T>()
, i.e. it will emit notifications when it changes and automatically update itself. (Issue #2555) -
Added two new methods on
Migration
(Issue #2543):RemoveType(typeName)
allows to completely remove a type and its schema from a realm during a migration.RenameProperty(typeName, oldPropertyName, newPropertyName)
allows to rename a property during a migration.
-
A Realm Schema can now be constructed at runtime as opposed to generated automatically from the model classes. The automatic generation continues to work and should cover the needs of the vast majority of Realm users. Manually constructing the schema may be required when the shape of the objects depends on some information only known at runtime or in very rare cases where it may provide performance benefits by representing a collection of known size as properties on the class. (Issue #824)
RealmConfiguration.ObjectClasses
has now been deprecated in favor ofRealmConfiguration.Schema
.RealmSchema
has an implicit conversion operator fromType[]
so code that previously looked likeObjectClasses = new[] { typeof(Foo), typeof(Bar) }
can be trivially updated toSchema = new[] { typeof(Foo), typeof(Bar) }
.Property
has been converted to a read-only struct by removing the setters from its properties. Those didn't do anything previously, so we don't expect anyone was using them.- Added several factory methods on
Property
to simplify declaration of Realm properties by being explicit about the range of valid options - e.g.Property.FromType<int>("IntProperty")
orProperty.Object("MyPersonProp", "Person")
. The constructor ofProperty
is now public to support advanced scenarios, but we recommend using the factory methods. - Made
ObjectSchema.Builder
public and streamlined its API. It allows you to construct a mutable representation of the schema of a single object and add/remove properties to it. You can either get an empty builder or you can see it with the information from an existing model class (i.e. inheriting fromRealmObject
orEmbeddedObject
). - Made
RealmSchema.Builder
public and streamlined its API. It allows you to construct a mutable representation of the schema of an entire Realm and add/remove object schemas to it. - A simple example for how to use the new API would look like:
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");
-
Fixed an issue that would result in SIGABORT on macOS/Linux when opening a Realm in dynamic mode (i.e. read the schema from disk) and the schema contains an object with no properties. (Issue #1978)
- Realm Studio: 11.0.0 or later.
- Using Core 11.4.1.
- Moved perf tests to run on a self-hosted runner. (PR #2638)
- Fixed a bug that would cause a
NullReferenceException
to be reported during compilation of a class containing a getter-onlyRealmObject
property. (Issue #2576) - Fixed an issue that would result in
Unable to load DLL 'realm-wrappers'
when deploying a WPF .NET Framework application with ClickOnce. This was due to the incorrect BuildAction type being applied to the native libraries that Realm depends on. (Issue #1877) - [Unity] Fixed an issue that would fail Unity builds with
Multiple precompiled assemblies with the same name Mono.Cecil.dll
if importing the Realm package into a project that already referencesMono.Cecil
. (Issue #2630) - Fixed a bug that would sometimes result in assemblies not found at runtime in a very specific edge scenario. More details about such a scenario can be found in its PR's description. (Issue #1568)
- Realm Studio: 11.0.0 or later.
- Using Core 11.4.1.
- ThreadSafeReference no longer pins the source transaction version for anything other than a Results backed by a Query. (Core upgrade)
- A ThreadSafeReference to a Results backed by a collection can now be created inside a write transaction as long as the collection was not created in the current write transaction. (Core upgrade)
- Synchronized Realms are no longer opened twice, cutting the address space and file descriptors used in half. (Core upgrade)
- If an object with a null primary key was deleted by another sync client, the exception
KeyNotFound: No such object
could be triggered. (Core upgrade) - Fixed a race condition that could result in an assertion
m_state == SyncUser::State::LoggedIn
if the app previously crashed during user logout. (Core upgrade)
- Realm Studio: 11.0.0 or later.
- Using Core 11.4.1.
- Added an action to post releases to Slack. (Issue #2501)
- Added MSBuild inline task to extract the changelog of the latest version. (Issue #2558)
- When a release succeeds, merge the original PR, tag the release, then update changelog. (PR #2609)
- Fixed a regression that would prevent the SDK from working on older Linux versions. (Issue #2602)
- Fixed an issue that manifested in circumventing the check for changing a primary key when using the dynamic API - i.e.
myObj.DynamicApi.Set("Id", "some-new-value")
will now correctly throw aNotSupportedException
if"some-new-value"
is different frommyObj
's primary key value. (PR #2601)
- Realm Studio: 11.0.0 or later.
- Using Core 11.3.1.
- Started uploading code coverage to coveralls. (Issue #2586)
- Removed the
[Serializable]
attribute from RealmObjectBase inheritors. (PR #2600)
- Fixed an issue that would cause
Logger.Default
on Unity to always revert toDebug.Log
, even when a custom logger was set. (Issue #2481) - Fixed an issue where
Logger.Console
on Unity would still useConsole.WriteLine
instead ofDebug.Log
. (Issue #2481) - Added serialization annotations to RealmObjectBase to prevent Newtonsoft.Json and similar serializers from attempting to serialize the base properties. (Issue #2579)
- Fixed an issue that would cause an
InvalidOperationException
when removing an element from an UI-bound collection in WPF. (Issue #1903) - User profile now correctly persists between runs. (Core upgrade)
- Fixed a crash when delivering notifications over a nested hierarchy of lists of RealmValue that contain RealmObject inheritors. (Core upgrade)
- Fixed a crash when an object which is linked to by a RealmValue property is invalidated (sync only). (Core upgrade)
- Fixes prior_size history corruption when replacing an embedded object in a list. (Core upgrade)
- Fixed an assertion failure in the sync client when applying an AddColumn instruction for a RealmValue property when that property already exists locally. (Core upgrade)
- Fixed an
Invalid data type
assertion failure in the sync client when applying anAddColumn
instruction for aRealmValue
property when that property already exists locally. (Core upgrade)
-
Added two extension methods on
IList
to get anIQueryable
collection wrapping the list:list.AsRealmQueryable()
allows you to get aIQueryable<T>
fromIList<T>
that can be then treated as a regular queryable collection and filtered/ordered with LINQ orFilter(string)
.list.Filter(query, arguments)
will filter the list and return the filtered collection. It is roughly equivalent tolist.AsRealmQueryable().Filter(query, arguments)
.
The resulting queryable collection will behave identically to the results obtained by calling
realm.All<T>()
, i.e. it will emit notifications when it changes and automatically update itself. (Issue #1499) -
Added a cache for the Realm schema. This will speed up
Realm.GetInstance
invocations whereRealmConfiguration.ObjectClasses
is explicitly set. The speed gains will depend on the number and complexity of your model classes. A reference benchmark that tests a schema containing all valid Realm property types showed a 25% speed increase of Realm.GetInstance. (Issue #2194) -
Improve performance of creating collection notifiers for Realms with a complex schema. In the SDKs this means that the first run of a synchronous query, first call to subscribe for notifications will do significantly less work on the calling thread.
-
Improve performance of calculating changesets for notifications, particularly for deeply nested object graphs and objects which have List or Set properties with small numbers of objects in the collection.
-
Query parser now accepts
BETWEEN
operator. Can be used likerealm.All<Person>().Filter("Age BETWEEN {20, 60}")
which means "'Age' must be in the open interval ]20;60[". (Core upgrade)
- Realm Studio: 11.0.0 or later.
- Using Core 11.3.1.
- Removed the RealmStates dictionary that used to hold a threadlocal dictionary of all the states for the opened Realms. It was only used for detecting open Realms during deletion and that is now handled by the native
delete_realm_files
method. (PR #2251) - Stopped sending analytics to mixpanel.
- Started uploading benchmark results to MongoDB Charts. (Issue #2226)
- Removed the dedicated benchmark workflows from GHA. (Issue #2562)
- Use the Win81 SDK when building the Windows wrappers on Github Actions. (Issue #2530)
- Added CodeQL workflow. (Issue #2155)
- Started tracking package and wrapper sizes over time. (Issue #2225)
- Removed the
[Serializable]
attribute from RealmObjectBase asBinarySerializer
is now obsolete. (PR #2578) - Added code coverage job to Github Actions. (PR #2581)
- Added CI tests running on Windows 8.1 . (PR #2580)
Note: This release uses xcframework and enables bitcode for the iOS native libraries. This significantly increases the package size and may appear to increase the .ipa size when compiling for iOS. However, the bitcode portion, as well as the unnecessary architectures, will be trimmed by the App Store, so the size of the actual download sent to users will be unchanged or smaller than before.
- Fixed an issue that would prevent
realm-wrappers.dll
from being loaded on Windows 8.1. (Issue #2298) - Fixed an assertion failure when listening for changes to a list of primitive Mixed which contains links. (Core upgrade)
- Fixed an assertion failure when listening for changes to a dictionary or set which contains an invalidated link. (Core upgrade)
- Fixed an endless recursive loop that could cause a stack overflow when computing changes on a set of objects which contained cycles. (Core upgrade)
- Add collision handling to Dictionary implementation. (Core upgrade)
- Fixed a crash after clearing a list or set of Mixed containing links to objects. (Core upgrade)
- Fixed a recursive loop which would eventually crash trying to refresh a user app token when it had been revoked by an admin. Now this situation logs the user out and reports an error. (Core upgrade)
- Fixed a race between calling
Realm.DeleteRealm
and concurrent opening of the realm file. (Core upgrade) - [Unity] Added code to preserve the constructors of several base serializers to ensure that most of the basic serialization/deserialization workloads work out of the box. (PR #2489)
- Changed the native iOS library to use xcframework. This means that running in the simulator on M1 macs is now supported. (Issue #2240)
- Added bitcode to the native iOS library. This has no effect on Xamarin.iOS, but allows Unity applications to take advantage of optimizations performed by the App Store servers and eventually support new architectures as they are released. (Issue #2240)
- Realm Studio: 11.0.0 or later.
- This release uses xcframework for the iOS native libraries, which requires Xamarin.iOS 14.14.2.5 or later.
- Using Core 11.0.4.
This release changes the way Unity binaries are packaged and obviates the need to have an extra Unity package that contains the dependencies as standalone modules. If you were using the io.realm.unity-bundled
package, please remove it and add the newly released io.realm.unity
one.
- [Unity] Fixed an issue where failing to weave an assembly due to modeling errors, would only show an error in the logs once and then fail opening a Realm with
No RealmObjects. Has linker stripped them?
. Now, the weaving errors will show up on every code change/weave attempt and the runtime error will explicitly suggest manually re-running the weaver. (Issue #2310) - [Unity] Fixed an issue that would cause the app to hang on exit when using Sync. (PR #2467)
- [Unity] Fixed an issue that would cause the Unity editor on macOS to hang after assembly reload if the app uses Sync. (Issue #2482)
- Fixed an issue where a crash could happen on Android x86 due to converting UInt32 into TableKey and Int64 into ObjKey incorrectly. (Issue #2456)
- None
- Realm Studio: 11.0.0 or later.
- Using Core 11.0.3.
- GetHashCode() on objects now uses the table key in addition to the object key. (Issue #2473)
- Fixed a bug where applying multiple
OrderBy
clauses on a query would result in the clauses being appended to each other as if they were.ThenBy
rather than the last clause replacing the preceding ones. (PR #2255) - When explicitly specifying
SyncConfiguration.ObjectTypes
, added a check to validate the schema and ensure allEmbeddedObject
classes are reachable from a class inheriting fromRealmObject
. More info about this subject can be found here. (PR #2259) - Fixed a bug that would result in an error similar to
Undefined symbols for architecture xxx: "_realm_thread_safe_reference_destroy"
when building a Unity project for iOS. (Issue #2318) - The weaver will now emit an error if you try to define a collection of
RealmInteger
values. This has never been supported, but previously it would fail silently whereas now it'll be a compile time error. (Issue #2308) - Fixed an issue where using collections of managed objects (lists or results) in a Unity project would result in an invalid compiled binary. (PR #2340)
- Fixed a memory leak when a migration callback is defined, but the Realm didn't actually need to run it (PR #2331)
- Added back 32bit support for iOS builds. (Issue #2429)
- Removed redundant warnings when building a Unity project for device that mentioned that the schema for Realm and Realm.UnityUtils is empty. (Issue #2320)
- Fixed an issue that could cause
NullReferenceException
to be thrown if you setSyncConfiguration.OnProgress
tonull
shortly after callingRealm.GetInstanceAsync(syncConfig)
. (Issue #2400) - When replacing an embedded object, emit a sync instruction that sets the link to the embedded object to null so that it is properly cleared.
This resolves an issue that would have manifested itself as
Failed to parse, or apply received changeset: ERROR: ArrayInsert: Invalid prior_size (list size = 4, prior_size = 0)
(#4740 - Made Linux implementation of ExternalCommitHelper work with new versions of Linux that changed epoll behavior, including Android 12 (Issue #4666)
- The file format is changed in the way that we now - again - have search indexes on primary key columns. This is required as we now stop deriving the ObjKeys from the primary key values, but just use an increasing counter value. This has the effect that all new objects will be created in the same cluster and not be spread out as they would have been before. It also means that upgrading from file format version 11 and earlier formats will be much faster. (Core upgrade)
-
Add support for the
Guid
data type. It can be used as primary key and is indexable. (PR #2120) -
Add support for dictionaries. Currently only string keys are supported, while the value type may be any of the supported types (the primitive types,
RealmValue
, or custom types that inherit from RealmObject/EmbeddedObject). Lists, sets, or other dictionaries may not be used as the value type. To add a dictionary to your model, define a getter-only property of typeIDictionary<string, T>
: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);
-
Add support for
RealmValue
data type. This new type can represent any valid Realm data type, including objects. Collections (lists, sets and dictionaries) ofRealmValue
are also supported, butRealmValue
itself cannot contain collections. Please note that a property of typeRealmValue
cannot be nullable, but can contain null, represented by the valueRealmValue.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(); }
-
Add support for sets of objects or primitive values. Sets are unordered collections that ensure uniqueness of their elements. Realm uses its internal equality comparer and it is not possible to customize its behavior by overriding
Equals
orGetHashCode
on your custom classes. Objects will always be compared by db reference - i.e. two distinct objects in the database will always be different, even if their contents are identical, and multiple references to the same database object will always be equal.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
-
Added support for value substitution in string based queries. This enables expressions following this syntax:
realm.All<T>().Filter("field1 = $0 && field2 = $1", 123, "some-string-value")
. (Issue #1822) -
Reduced the size of the native binaries by ~5%. (PR #2239)
-
Added a new class -
Logger
, which allows you to override the default logger implementation (previously writing tostdout
orstderr
) with a custom one by settingLogger.Default
. This replacesAppConfiguration.CustomLogger
andAppConfiguration.LogLevel
which will be removed in a future release. The built-in implementations are:Console
- uses theSystem.Console
for most projects andUnityEngine.Debug
for Unity projects:Logger.Default = Logger.Console;
Null
- ignores all messages:Logger.Default = Logger.Null;
Function
- proxies calls to a supplied function:Logger.Default = Logger.Function(message => myExternalLogger.Log(message));
Custom loggers can derive from the
Logger
class and provide their own implementation for theLog
method or useFunction
and provide anAction<string>
. (PR #2276) -
RealmObjectBase
now correctly overrides and implementsGetHashCode()
. (Issue #1650) -
Added an override of
RealmObject.ToString()
to output more meaningful information about the object content. It will output the type of the object, the primary key (if one is defined), as well as information whether the object is managed or deleted. (Issue #2347) -
Added new API for dynamically accessing object properties. These are designed to support ahead-of-time compiled platforms, such as Xamarin.iOS and Unity with IL2CPP compilation. The intention is to eventually make these the default API, while also supporting the legacy DLR-based API. Example:
// 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");
-
Added a Unity Editor option to enable weaving editor assemblies. This should be "off" unless your project has Editor assemblies that reference Realm - for example, an EditMode test assembly that tests Realm-related functionality. Keeping it "on" may slow down builds a little as more assemblies will need to be evaluated for weaving. (Issue #2346)
-
We now make a backup of the realm file prior to any file format upgrade. The backup is retained for 3 months. Backups from before a file format upgrade allows for better analysis of any upgrade failure. We also restore a backup, if a) an attempt is made to open a realm file whith a "future" file format and b) a backup file exist that fits the current file format. (#4166)
- Realm Studio: 11.0.0-alpha.0 or later.
- Using Core 11.0.3.
- Enabled LTO builds for all platforms except Android. (PR #2239)
- Test projects updated to dotnetcore 3.1. This means that tests are no longer executed against dotnetcore 2.0.
- Removed Lambda compilation in ResultsVisitor when we encounter a conversion operator. This
is needed because IL2CPP cannot comiple lambdas dynamically. Instead, we're now using
Operator.Convert<TTarget>(object)
which is slightly less efficient thanOperator.Convert<TSource, TTarget>
but still quite a bit faster thanConvert.ChangeType
and also doesn't suffer from the deficiencies aroundDecimal128
conversion. The main downside is that we'll no longer support queries with an argument that is a custom user type with an implicit conversion operator defined.
- Fixed a bug that could lead to crashes with a message similar to
Invalid ref translation entry [0, 78187493520]
. (Core upgrade) - Fix assertion failures such as
!m_notifier_skip_version.version
orm_notifier_sg->get_version() + 1 == new_version.version
when performing writes inside change notification callbacks. (Core upgrade) - Fix collection notification reporting for modifications. This could be observed by receiving the wrong indices of modifications on sorted or distinct results, or notification blocks sometimes not being called when only modifications have occured. (Core upgrade)
- Proactively check the expiry time on the access token and refresh it before attempting to initiate a sync session. This prevents some error logs from appearing on the client such as:
ERROR: Connection[1]: Websocket: Expected HTTP response 101 Switching Protocols, but received: HTTP/1.1 401 Unauthorized
. (Core upgrade) - Destruction of the TableRecycler at exit was unordered compared to other threads running. This could lead to crashes, some with the TableRecycler at the top of the stack. (Core upgrade)
- Fixed errors related to
uncaught exception in notifier thread: N5realm11KeyNotFoundE: No such object
. This could happen in a synchronized app when a linked object was deleted by another client. (Core upgrade) - Opening a metadata realm with the wrong encryption key or different encryption configuration will remove that metadata realm and create a new metadata realm using the new key or configuration. (Core upgrade)
- Creting a
ThreadSafeReference
to a readonly Realm would result in a crash. (Core upgrade)
- Realm Studio: 10.0.0 or later.
- Using Core 10.7.2.
- Fixed a compiler bug that would result in an
"Access violation"
error being thrown when using sync on Windows.
- Realm Studio: 10.0.0 or later.
- Using Core 10.5.6.
- On 32bit devices you may get exception with "No such object" when upgrading to v10. (Core upgrade)
- The notification worker thread would rerun queries after every commit rather than only commits which modified tables which could affect the query results if the table had any outgoing links to tables not used in the query. (Core upgrade)
- Fix "Invalid ref translation entry [16045690984833335023, 78187493520]" assertion failure which could occur when using sync or multiple processes writing to a single Realm file. (Core upgrade)
- During integration of a large amount of data from the server, you may get
"Assertion failed: !fields.has_missing_parent_update()"
. (Core upgrade) - Syncing large Decimal128 values will cause
"Assertion failed: cx.w[1] == 0"
. (Core upgrade) - Avoid race condition leading to possible hangs on windows. (Core upgrade)
- None
- None
- Realm Studio: 10.0.0 or later.
- Using Core 10.5.6.
- Fixed an issue that would result in UWP apps being rejected from the Microsoft Store due to an unsupported API (
__C_specific_handler
) being used. (Issue #2235) - The Realm notification listener thread could sometimes hit the assertion failure "!skip_version.version" if a write transaction was committed at a very specific time. (Core upgrade)
- None
- None
- Realm Studio: 10.0.0 or later.
- Using Core 10.5.3.
- Sync client now logs error messages received from server rather than just the size of the error message. (Core upgrade)
- Errors returned from the server when sync WebSockets get closed are now captured and surfaced as a SyncError. (Core upgrade)
- Dramatically improved performance of sequential reads on a query without a filter. (Core upgrade)
- Fix an issue when using a frozen query across threads with different transaction versions which resulted in being able to access objects from a future version in the frozen collection. (Core upgrade)
- Fixed an issue where creating an object after file format upgrade may fail with assertion "Assertion failed: lo() <= std::numeric_limits<uint32_t>::max()" (Core upgrade)
- Fixed an issue where getting an element from a query result without a filter would give incorrect results if a new object was created at index zero in the source Table. (Core upgrade)
- Fixed an issue where during synchronization the app would crash with
Assertion failed: ref + size <= next->first
. (Core upgrade)
- Realm Studio: 10.0.0 or later.
- Using Core 10.5.0.
- Fixes the analytics version being sent.
- We no longer support Realm Cloud (legacy), but instead the new MongoDB Realm Cloud. MongoDB Realm is a serverless platform that enables developers to quickly build applications without having to set up server infrastructure. MongoDB Realm is built on top of MongoDB Atlas, automatically integrating the connection to your database. (#2011)
- Remove support for Query-based sync, including the configuration parameters and the
SyncSubscription
types. (#2011) - Remove everything related to sync permissions, including both the path-based permission system and the object-level privileges for query-based sync. Permissions in MongoDB Realm are defined serverside. (#2011)
- Moved all API for dynamic access on the
Realm
class toRealm.DynamicApi
:Realm.CreateObject(string className, object primaryKey)
is nowRealm.DynamicApi.CreateObject(string className, object primaryKey)
.Realm.All(string className)
is nowRealm.DynamicApi.All(string className)
.Realm.RemoveAll(string className)
is nowRealm.DynamicApi.RemoveAll(string className)
.Realm.Find(string className, long? primaryKey)
is nowRealm.DynamicApi.Find(string className, long? primaryKey)
.Realm.Find(string className, string primaryKey)
is nowRealm.DynamicApi.Find(string className, string primaryKey)
.
- It is now required that all top-level objects in a synchronized Realm have a primary key called
_id
. You can use theMapTo("_id")
attribute to avoid using unidiomatic names for the model properties. - Bumped the minimum target for Xamarin.iOS apps to iOS 9.
- Bumped the minimum API level for Xamarin.Android apps to 16 (Android 4.1).
- Renamed
FullSyncConfiguration
toSyncConfiguration
. - Removed
RealmObject.FreezeInPlace
. To freeze a realm object use theFreeze
extension method. (Issue #2180)
-
Added support for syncing to MongoDB instead of Realm Object Server. Applications must be created at realm.mongodb.com.
-
Added an
App
class which is the entrypoint for synchronizing with a MongoDB Realm App. -
Added
User.CustomData
containing an unstructured document with additional information about the user. Custom data is configured in your MongoDB Realm App. -
Added
User.Functions
. This is the entry point for calling Remote MongoDB Realm functions. Functions allow you to define and execute server-side logic for your application. Functions are written in modern JavaScript (ES6+) and execute in a serverless manner. When you call a function, you can dynamically access components of the current application as well as information about the request to execute the function and the logged in user that sent the request. -
Added
User.GetMongoClient
exposing an API for CRUD operations on a Remote MongoDB Service. -
Added
User.GetPushClient
exposing an API for registering a device for push notifications. -
Change
SyncConfiguration
to accept partition value instead of a server Uri. Partition values can currently be of typesstring
,long
, orObjectId
. Opening a realm by partition value is the equivalent of previously opening a realm by URL. In this case, partitions are meant to be more closely associated with your data. E.g., if you are a large retailer with multiple locations, the partition key can be the store Id and you each Realm will only contain data related to the specified store. -
Add support for the Decimal128 data type. This is a 128-bit IEEE 754 decimal floating point number. Properties of this type can be declared either as
MongoDB.Bson.Decimal128
type or the built-indecimal
type. Note that .NET's built-in decimal is 96-bit, so it cannot represent the full range of numbers, representable byDecimal128
. (PR #2014) -
Add support for the
ObjectId
data type. This is a 12 byte unique identifier that is common as a document id in MongoDB databases. It can be used as primary key. (PR #2035) -
Add support for embedded objects. Embedded objects are objects which are owned by a single parent object, and are deleted when that parent object is deleted or their parent no longer references them. Embedded objects are declared by subclassing
EmbeddedObject
instead ofRealmObject
. Reassigning an embedded object is not allowed and neither is linking to it from multiple parents. Querying for embedded objects directly is also disallowed as they should be viewed as complex structures belonging to their parents as opposed to standalone objects. A trivial example is: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; } }
-
Added new dynamic methods for instantiating embedded objects:
-
Realm.DynamicApi.CreateEmbeddedObjectForProperty
should be used to create an embedded object and assign it to a parent's property. For example:// 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
should be used to create an embedded object and add it to a parent's list property. -
Realm.DynamicApi.InsertEmbeddedObjectInList
should be used to create an embedded object and insert it in a parent's list property at a specified index. -
Realm.DynamicApi.SetEmbeddedObjectInList
should be used to create an embedded object and set it at an index in a parent's list property.// 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";
-
-
The memory mapping scheme for Realm files has changed to better support opening very large files.
-
Replaced the implementation of the string query parser (the one used for
realm.All().Filter("some-string-query")
). This results in ~5% reduction of the size of the native binary while keeping the query execution times on par with the old parser. (PR #2185, Core upgrade) -
Optimized the internal code that handles conversions between types. This should result in a minor performance increase for most data operations that should be most noticeable on Ahead-of-Time compiled platforms, such as iOS/UWP. Due to the nature of the change, it's possible that conversions that previously happened automatically when working with dynamic objects no longer do. If you encounter a
NotSupportedException
with the messageNo conversion exists from *type A* to *type B*
and believe this is a bug, please open a Github Issue. (PR #2149) -
Added an extra compile-time check to detect erroneous List declarations and suggest IList for collection properties in Realm objects. (Issue #2083)
-
Added overloads for
Realm.Write
andRealm.WriteAsync
that can return a value. (Issue #2081)
- Worked around an issue with the .NET Native compiler (used in UWP projects) that would result in the following exception being thrown in Release:
Incompatible MarshalAs detected in parameter named 'value'. Please refer to MCG's warning message for more information.
. (Issue #2169) - Fixed a bug that could cause incorrect property values to be read during a migration for apps running on .NET Core 3.0 or newer.
The issue manifests itself when different classes have persisted properties with the same name and could result in
the wrong property being accessed - e.g.
foo.Name
could returnfoo.Bar
. This could only happen when using the dynamic API during a migration and does not affect apps that use the strongly typed API or run on platforms other than .NET Core 3.x/.NET 5. - Fixed a bug that could cause a deadlock in a multiprocess scenario where multiple processes share the same Realm file and listen for notifications from the file. (Core upgrade)
- Fixed an issue with deleting and recreating objects with embedded objects. (Core upgrade)
- Fix a race condition which would lead to "uncaught exception in notifier thread: N5realm15InvalidTableRefE: transaction_ended" and a crash when the source Realm was closed or invalidated at a very specific time during the first run of a collection notifier (Core upgrade)
- Fix crash in case insensitive query on indexed string columns when nothing matches (Core upgrade)
- Realm Studio: 10.0.0 or later.
- Using Core 10.3.3.
- Migrated to bison parser.
- Submit Analytics to S3/Segment in addition to Mixpanel.
- Analytics now also reports if Sync functionality is in use.
- SDK is now also tested against .NET 5.
- This release uses monorepo releases that bundle Core, Sync, and OS.
- Replaced Expressions-based Operator with T4. (PR #2149)
- If you make a case insensitive query on an indexed string column, it may fail in a way that results in a "No such key" exception. (Core upgrade)
- Fix crash in case insensitive query on indexed string columns when nothing matches. (Core upgrade)
- Files upgraded on 32-bit devices could end up being inconsistent resulting in "Key not found" exception to be thown. (Core upgrade)
- Fixed an issue where creating an object after file format upgrade may fail with assertion
Assertion failed: lo() <= std::numeric_limits<uint32_t>::max()
. (Core upgrade)
- Realm Object Server: 3.23.1 or later.
- Realm Studio: 5.0.0 or later.
- Using Sync 5.0.32 and Core 6.2.3.
- Updated the QuickJournal example to latest Realm and Xamarin.Forms versions. (PR #2057)
- Fixed an issue that would result in
Realm accessed from incorrect thread
exception being thrown when accessing a Realm instance on the main thread in UWP apps. (Issue #2045)
- Realm Object Server: 3.23.1 or later.
- Realm Studio: 5.0.0 or later.
- Using Sync 5.0.28 and Core 6.1.3.
- Updated the QuickJournal example to latest Realm and Xamarin.Forms versions. (PR #2057)
- None
- Querying on an indexed property may give a “Key not found” exception. (Core upgrade)
- Fix queries for null on non-nullable indexed integer columns returning results for zero entries. (Core upgrade)
- Realm Object Server: 3.23.1 or later.
- Realm Studio: 5.0.0 or later.
- Using Sync 5.0.28 and Core 6.1.3.
- Greatly improve performance of NOT IN queries on indexed string or int columns. (Core upgrade)
- Fixed an issue that would cause using Realm on the main thread in WPF applications to throw an exception with a message "Realm accessed from the incorrect thread". (Issue #2026)
- Fixed an issue that could cause an exception with the message "Opening Realm files of format version 0 is not supported by this version of Realm" when opening an encrypted Realm. (Core upgrade)
- Slightly improve performance of most operations which read data from the Realm file. (Core upgrade)
- Rerunning an equals query on an indexed string column which previously had more than one match and now has one match would sometimes throw a "key not found" exception. (Core upgrade)
- When querying a table where links are part of the condition, the application may crash if objects has recently been added to the target table. (Core upgrade)
- Realm Object Server: 3.23.1 or later.
- Realm Studio: 5.0.0 or later.
- Using Sync 5.0.27 and Core 6.1.2.
- Added prerelease nuget feed via GitHub packages. (PR #2028)
NOTE: This version bumps the Realm file format to version 11. It is not possible to downgrade to version 10 or earlier. Files created with older versions of Realm will be automatically upgraded. Only Realm Studio 5.0.0 or later will be able to open the new file format.
- Added the notion of "frozen objects" - these are objects, queries, lists, or Realms that have been "frozen" at a specific version. This allows you to access the data from any thread, but it will never change. All frozen objects can be accessed and queried as normal, but attempting to mutate them or add change listeners will throw an exception. (Issue #1945)
- Added
Realm.Freeze()
,RealmObject.Freeze()
,RealmObject.FreezeInPlace()
,IQueryable<RealmObject>.Freeze()
,IList<T>.Freeze()
, andIRealmCollection<T>.Freeze()
. These methods will produce the frozen version of the instance on which they are called. - Added
Realm.IsFrozen
,RealmObject.IsFrozen
, andIRealmCollection<T>.IsFrozen
, which returns whether or not the data is frozen. - Added
RealmConfigurationBase.MaxNumberOfActiveVersions
. Setting this will cause Realm to throw an exception if too many versions of the Realm data are live at the same time. Having too many versions can dramatically increase the filesize of the Realm.
- Added
- Add support for
SynchronizationContext
-confined Realms. Rather than being bound to a specific thread, queue-confined Realms are bound to aSynchronizationContext
, regardless of whether it dispatches work on the same or a different thread. Opening a Realm whenSynchronizationContext.Current
is null - most notablyTask.Run(...)
- will still confine the Realm to the thread on which it was opened. - Storing large binary blobs in Realm files no longer forces the file to be at least 8x the size of the largest blob.
- Reduce the size of transaction logs stored inside the Realm file, reducing file size growth from large transactions.
- String primary keys no longer require a separate index, improving insertion and deletion performance without hurting lookup performance.
- Fixed
Access to invalidated List object
being thrown when adding objects to a list while at the same time deleting the object containing the list. (Issue #1971) - Fixed incorrect results being returned when using
.ElementAt()
on a query where a string filter with a sort clause was applied. (PR #2002)
- Realm Object Server: 3.23.1 or later.
- Realm Studio: 5.0.0 or later.
- Using Sync 5.0.22 and Core 6.0.25.
- Exposed an API to configure the
userId
andisAdmin
of a user when creating credentials viaCredentials.CustomRefreshToken
. Previously these values would be inferred from the JWT itself but as there's no way to enforce the server configuration over which fields in the JWT payload represent theuserId
and theisAdmin
field, it is now up to the consumer to determine the values for these. - Improved logging and error handling for SSL issues on Apple platforms.
- Realm objects can now be correctly serialized with
System.Runtime.Serialization.Formatters
andSystem.Xml.Serialization
serializers. (Issue #1913) The private state fields of the class have been decorated with[NonSerialized]
and[XmlIgnore]
attributes so that eager opt-out serializers do not attempt to serialize fields such asRealm
andObjectSchema
which contain handles to unmanaged data. - Fixed an issue that would result in a compile error when
[Required]
is applied onIList<string>
property. (Contributed by braudabaugh) - Fixed an issue that prevented projects that include the Realm NuGet package from being debugged. (PR #1927)
- The sync client would fail to reconnect after failing to integrate a changeset. The bug would lead to further corruption of the client’s Realm file. (since 3.0.0).
- The string-based query parser (
results.Filter(...)
) used to need theclass_
prefix for class names when querying over backlink properties. This has been fixed so that only the publicObjectSchema
name is necessary. For example,@links.class_Person.Siblings
becomes@links.Person.Siblings
. - Fixed an issue where
ClientResyncMode.DiscardLocalRealm
wouldn't reset the schema.
- Realm Object Server: 3.23.1 or later.
- Upgraded Sync from 4.7.5 to 4.9.5 and Core from 5.23.3 to 5.23.8.
- Added
int IndexOf(object)
andbool Contains(object)
to theIRealmCollection
interface. (PR #1893) - Exposed an API -
SyncConfigurationBase.EnableSessionMultiplexing()
that allows toggling session multiplexing on the sync client. (PR 1896) - Added support for faster initial downloads when using
Realm.GetInstanceAsync
. (Issue 1847) - Added an optional
cancellationToken
argument toRealm.GetInstanceAsync
enabling clean cancelation of the in-progress download. (PR 1859) - Added support for Client Resync which automatically will recover the local Realm in case the server is rolled back. This largely replaces the Client Reset mechanism for fully synchronized Realms. Can be configured using
FullSyncConfiguration.ClientResyncMode
. (PR #1901) - Made the
createUser
argument inCredentials.UsernamePassword
optional. If not specified, the user will be created or logged in if they already exist. (PR #1901) - Uses Fody 6.0.0, which resolves some of the compatibility issues with newer versions of other Fody-based projects. (Issue #1899)
- Fixed an infinite recursion when calling
RealmCollectionBase<T>.IndexOf
. (Issue #1892)
- Realm Object Server: 3.23.1 or later.
- Upgraded Sync from 4.7.0 to 4.7.1.
- Implemented direct access to sync workers on Cloud, bypassing the Sync Proxy: the binding will override the sync session's url prefix if the token refresh response for a realm contains a sync worker path field.
- Removed the
isAdmin
parameter fromCredentials.Nickname
. It doesn't have any effect on new ROS versions anyway as logging in an admin nickname user is not supported - this change just makes it explicit. (Issue #1879) - Marked the
Credentials.Nickname
method as deprecated - support for the Nickname auth provider is deprecated in ROS and will be removed in a future version. (Issue #1879) - Removed the
deleteRealm
parameter fromPermissionDeniedException.DeleteRealmInfo
as passingfalse
has no effect. Calling the method is now equivalent to calling it withdeleteRealm: true
. (PR #1890)
- Added support for unicode characters in realm path and filenames for Windows. (Core upgrade)
- Added new credentials type:
Credentials.CustomRefreshToken
that can be used to create a user with a custom refresh token. This will then be validated by ROS against the configuredrefreshTokenValidators
to obtain access tokens when opening a Realm. If creating a user like that, it's the developer's responsibility to ensure that the token is valid and refreshed as necessary to ensure that access tokens can be obtained. To that end, you can now set the refresh token of a user object by callingUser.RefreshToken = "my-new-token"
. This should only be used in combination with users obtained by callingCredentials.CustomRefreshToken
. (PR #1889)
- Constructing an IncludeDescriptor made unnecessary table comparisons. This resulted in poor performance when creating a query-based subscription (
Subscription.Subscribe
) withincludedBacklinks
. (Core upgrade) - Queries involving an indexed int column which were constrained by a LinkList with an order different from the table's order would give incorrect results. (Core upgrade)
- Queries involving an indexed int column had a memory leak if run multiple times. (Core upgrade)
- Realm Object Server: 3.23.1 or later.
- Upgraded Sync from 4.5.1 to 4.7.0 and Core 5.20.0 to 5.23.1.
-
Fixed an issue that would prevent iOS apps from being published to the app store with the following error:
This bundle Payload/.../Frameworks/realm-wrappers.framework is invalid. The Info.plist file is missing the required key: CFBundleVersion.
(Issue 1870, since 4.0.0)
-
Fixed an issue that would cause iOS apps to crash on device upon launching. (Issue 1871, since 4.0.0)
- The following deprecated methods and classes have been removed:
- The
SyncConfiguration
class has been split intoFullSyncConfiguration
andQueryBasedSyncConfiguration
. Use one of these classes to connect to the Realm Object Server. - The
TestingExtensions.SimulateProgress
method has been removed as it hasn't worked for some time. - The
Property.IsNullable
property has been removed. To check if a property is nullable, checkProperty.Type
for thePropertyType.Nullable
flag. - The
Credentials.Provider
class has been removed. Previously, it contained a few constants that were intended for internal use mostly. - The
User.ConfigurePersistance
method has been superseded bySyncConfigurationBase.Initialize
. User.LogOut
has been removed in favor ofUser.LogOutAsync
.User.GetManagementRealm
has been removed in favor of theUser.ApplyPermissionsAsync
set of wrapper API.User.GetPermissionRealm
has been removed in favor of theUser.GetGrantedPermissions
wrapper API.
- The
- Deprecated the
IQueryable<T>.Subscribe(string name)
extension method in favor ofIQueryable<T>.Subscribe(SubscriptionOptions options)
. - Reworked the internal implementation of the permission API. For the most part, the method signatures haven't changed or where they have changed, the API have remained close to the original (e.g.
IQueryable<T>
has changed toIEnumerable<T>
). (Issue #1863)- Changed the return type of
User.GetGrantedPermissionsAsync
fromIQueryable<PathPermission>
toIEnumerable<PathPermission>
. This means that the collection is no longer observable like regular Realm-backed collections. If you need to be notified for changes of this collection, you need to implement a polling-based mechanism yourself. PathPermission.MayRead/MayWrite/MayManage
have been deprecated in favor of a more-consistentAccessLevel
API.- In
User.ApplyPermissionsAsync
, renamed therealmUrl
parameter torealmPath
. - In
User.OfferPermissionsAsync
, renamed therealmUrl
parameter torealmPath
. - Removed the
PermissionOfferResponse
andPermissionChange
classes. - Removed the
IPermissionObject
interface. - Removed the
ManagementObjectStatus
enum. - Removed the
User.GetPermissionChanges
andUser.GetPermissionOfferResponses
methods. - The
millisecondTimeout
argument inUser.GetGrantedPermissionsAsync
has been removed. - The
PermissionException
class has been replaced byHttpException
.
- Changed the return type of
- The
AuthenticationException
class has been merged into theHttpException
class.
-
Added
Session.Start()
andSession.Stop()
methods that allow you to pause/resume synchronization with the Realm Object Server. (Issue #138) -
Added an
IQueryable<T>.Subscribe(SubscriptionOptions, params Expression<Func<T, IQueryable>>[] includedBacklinks)
extension method that allows you to configure additional options for the subscription, such as the name, time to live, and whether it should update an existing subscription. TheincludedBacklinks
argument allows you to specify which backlink properties should be included in the transitive closure when doing query-based sync. For example: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;
-
Added a
Realm.GetAllSubscriptions()
extension method that allows you to obtain a collection of all registered query-based sync subscriptions. (Issue #1838) -
Added
AccessLevel
property toPathPermission
to replace the now deprecatedMayRead/MayWrite/MayManage
. (Issue #1863) -
Added
RealmOwnerId
property toPathPermission
that indicates who the owner of the Realm is. (Issue #1863) -
Added support for building with
dotnet build
(previously only themsbuild
command line was supported). (PR #1849) -
Improved query performance for unindexed string columns when the query has a long chain of OR conditions. (Core upgrade)
-
Improved performance of encryption and decryption significantly by utilizing hardware optimized encryption functions. (Core upgrade)
-
Compacting a realm into an encrypted file could take a really long time. The process is now optimized by adjusting the write buffer size relative to the used space in the realm. (Core upgrade)
-
The string-based query parser (
results.Filter("...")
) now supports readable timestamps with a 'T' separator in addition to the originally supported "@" separator. For example:startDate > 1981-11-01T23:59:59:1
(Core upgrade)
- Fixes an issue where using the
StringExtensions.Contains(string, string, StringComparison)
extension method inside a LINQ query would result in an exception being thrown on .NET Core 2.1+ or Xamarin.iOS/Android projects.(Issue #1848) - Creating an object after creating an object with the int primary key of "null" would hit an assertion failure. (Core upgrade)
- Realm Object Server: 3.23.1 or later.
- Upgraded Sync from 3.14.11 to 4.5.1 and Core 5.12.7 to 5.20.0.
NOTE!!! You will need to upgrade your Realm Object Server to at least version 3.11.0 or use Realm Cloud. If you try to connect to a ROS v3.10.x or previous, you will see an error like Wrong protocol version in Sync HTTP request, client protocol version = 25, server protocol version = 24
.
- Download progress is now reported to the server, even when there are no local changes. This allows the server to do history compaction much more aggressively, especially when there are many clients that rarely or never make local changes. (#1772)
- Reduce memory usage when integrating synchronized changes sent by ROS.
- Added ability to supply a custom log function for handling logs emitted by Sync by specifying
SyncConfigurationBase.CustomLogger
. It must be set before opening a synchronized Realm. (#1824) - Clients using protocol 25 now report download progress to the server, even when they make no local changes. This allows the server to do history compaction much more aggressively, especially when there are many clients that rarely or never make local changes. (#1772)
- Add a User-Agent header to HTTP requests made to the Realm Object Server. By default, this contains information about the Realm library version and .NET platform. Additional details may be provided (such as the application name/version) by setting
SyncConfigurationBase.UserAgent
prior to opening a synchronized Realm. If developing a Xamarin app, you can use the Xamarin.Essentials plugin to automate that:SyncConfiguration.UserAgent = $"{AppInfo.Name} ({AppInfo.PackageName} {AppInfo.VersionString})"
.
- Fixed a bug that could lead to crashes with a message such as
Assertion failed: ndx < size() with (ndx, size()) = [742, 742]
. - Fixed a bug that resulted in an incorrect
LogLevel
being sent to Sync when settingSyncConfigurationBase.LogLevel
. (#1824, since 2.2.0) - Fixed a bug that prevented
Realm.GetInstanceAsync
from working when used withQueryBasedSyncConfiguration
. (#1827, since 3.1.0)
- The deprecated method
realm.SubscribeToObjectsAsync
has been removed in this version. (#1772) User.ConfigurePersistence
has been deprecated in favor ofSyncConfigurationBase.Initialize
.
- Realm Object Server: 3.11.0 or later. The sync protocol version has been bumped to version 25. The server is backwards-compatible with clients using protocol version 24 or below, but clients at version 25 are not backwards-compatible with a server at protocol version 24. The server must be upgraded before any clients are upgraded.
- Upgraded Sync from 3.9.2 to 3.14.11 and Core from 5.8.0 to 5.12.7.
- Exposed an
OnProgress
property onSyncConfigurationBase
. It allows you to specify a progress callback that will be invoked when usingRealm.GetInstanceAsync
to report the download progress. (#1807)
- Trying to call
Subscription.WaitForSynchronizationAsync
on a background thread (without aSynchronizationContext
) would previously hang indefinitely. Now a meaningful exception will be thrown to indicate that this is not supported and this method should be called on a thread with a synchronization context. (dotnet-private#130, since v3.0.0)
- Realm Object Server: 3.0.0 or later.
- APIs are backwards compatible with all previous releases in the 3.x.y series.
- File format: Generates Realms with format v9 (Reads and upgrades all previous formats)
- Fixed a bug that would typically result in exceptions with a message like
An unknown error has occurred. State: *some-number-larger than 127*
when subscribing to queries. (dotnet-private#128, since3.0.0
)
RealmObject
inheritors will now raisePropertyChanged
after they have been removed from Realm. The property name in the event arguments will beIsValid
.- Bundle some common certificate authorities on Linux so connecting to ROS instances over SSL should work out of the box for most certificates. Notably, it will now work out of the box for Realm Cloud instances.
- When constructing queries that compare an invalid/unmanaged RealmObject (e.g.
realm.All<Foo>().Where(f => f.Bar == someBar)
), a meaningful exception will now be thrown rather than an obscure ArgumentNullException. - Added
ShouldCompactOnLaunch
to the PCL version of the library. (dotnet-private#125)
- Exposed a
ChangeSet.NewModifiedIndices
collection that contains information about the indices of the objects that changed in the new version of the collection (i.e. after accounting for the insertions and deletions). - Update Fody to 3.0.
WriteAsync
will no longer perform a synchronousRefresh
on the main thread. (#1729)- Trying to add a managed Realm Object to a different instance of the same on-disk Realm will no longer throw an exception.
- Removed the
IList
compliance for Realm collections. This fixes an issue which would cause the app to hang on Android when deselecting an item from a ListView bound to a Realm collection.
SyncConfiguration
is now deprecated and will be removed in a future version. Two new configuration classes have been exposed - QueryBasedSyncConfiguration and FullSyncConfiguration. If you were using aSyncConfiguration
withIsPartial = true
, then change your code to useQueryBasedSyncConfiguration
. Similarly, ifIsPartial
was not set or was set tofalse
, useFullSyncConfiguration
.- Removed the
IList
compliance for Realm collections. This will prevent automatic updates of ListViews databound to Realm collections in UWP projects.
- Allow
[MapTo]
to be applied on classes to change the name of the table corresponding to that class. (#1712) - Added an improved API for adding subscriptions in partially-synchronized Realms.
IQueryable<T>.Subscribe
can be used to subscribe to any query, and the returnedSubscription<T>
object can be used to observe the state of the subscription and ultimately remove the subscription. See the documentation for more information. (#1679) - Added a fine-grained permissions system for use with partially-synchronized Realms. This allows permissions to be defined at the level of individual objects or classes. See the documentation for more information. (#1714)
- Exposed a string-based
IQueryable<T>.Filter(predicate)
method to enable more advanced querying scenarios such as:- Following links:
realm.All<Dog>().Filter("Owner.FirstName BEGINSWITH 'J'")
. - Queries on collections:
realm.All<Child>().Filter("Parents.FirstName BEGINSWITH 'J'")
- find all children who have a parent whose name begins with J orrealm.All<Child>().Filter("Parents.@avg.Age > 50")
- find all children whose parents' average age is more than 50. - Subqueries:
realm.All<Person>().Filter("SUBQUERY(Dogs, $dog, $dog.Vaccinated == false).@count > 3")
- find all people who have more than 3 unvaccinated dogs. - Sorting:
realm.All<Dog>().Filter("TRUEPREDICATE SORT(Owner.FirstName ASC, Age DESC)")
- find all dogs and sort them by their owner's first name in ascending order, then by the dog's age in descending. - Distinct:
realm.All<Dog>().Filter("TRUEPREDICATE DISTINCT(Age) SORT(Name)")
- find all dogs, sort them by their name and pick one dog for each age value. - For more examples, check out the query language reference docs or the NSPredicate Cheatsheet.
- Following links:
- The
SyncConfiguration
constructor now accepts relative Uris. (#1720) - Added the following methods for resetting the user's password and confirming their email:
RequestPasswordResetAsync
,CompletePasswordResetAsync
,RequestEmailConfirmationAsync
, andConfirmEmailAsync
. These all apply only to users created viaCredentials.UsernamePassword
who have provided their email as the username. (#1721)
- Fixed a bug that could cause deadlocks on Android devices when resolving thread safe references. (#1708)
- Uses the Sync 3.0 client which is incompatible with ROS 2.x.
Permission
has been renamed toPathPermission
to more closely reflect its purpose. Furthermore, existing methods to modify permissions only work on full Realms. New methods and classes are introduced to configure access to a partially synchronized Realm.- The type of
RealmConfiguration.DefaultConfiguration
has changed toRealmConfigurationBase
to allow any subclass to be set as default. (#1720) - The
SyncConfiguration
constructor arguments are now optional. Theuser
value will default to the currently logged in user and theserverUri
value will default torealm://MY-SERVER-URL/default
whereMY-SERVER-URL
is the host the user authenticated against. (#1720) - The
serverUrl
argument inUser.LoginAsync(credentials, serverUrl)
andUser.GetLoggedInUser(identity, serverUrl)
has been renamed toserverUri
for consistency. (#1721)
- Added an
IsDynamic
property toRealmConfigurationBase
, allowing you to open a Realm file and read its schema from disk. (#1637) - Added a new
InMemoryConfiguration
class that allows you to create an in-memory Realm instance. (#1638) - Allow setting elements of a list directly - e.g.
foo.Bars[2] = new Bar()
orfoo.Integers[3] = 5
. (#1641) - Added Json Web Token (JWT) credentials provider. (#1655)
- Added Anonymous and Nickname credentials providers. (#1671)
- Fixed an issue where initial collection change notification is not delivered to all subscribers. (#1696)
- Fixed a corner case where
RealmObject.Equals
would returntrue
for objects that are no longer managed by Realm. (#1698)
SyncConfiguration.SetFeatureToken
is deprecated and no longer necessary in order to use Sync on Linux or server-side features. (#1703)
- Added an
[Explicit]
attribute that can be applied to classes or assemblies. If a class is decorated with it, then it will not be included in the default schema for the Realm (i.e. you have to explicitly setRealmConfiguration.ObjectClasses
to an array that contains that class). Similarly, if it is applied to an assembly, all classes in that assembly will be considered explicit. This is useful when developing a 3rd party library that depends on Realm to avoid your internal classes leaking into the user's schema. (#1602)
- Fixed a bug that would prevent writing queries that check if a related object is null, e.g.
realm.All<Dog>().Where(d => d.Owner == null)
. (#1601) - Addressed an issue that would cause the debugger to report an unobserved exception being thrown when "Just My Code" is disabled. (#1603)
- Calling
Realm.DeleteRealm
on a synchronized Realm will now properly delete therealm.management
folder. (#1621) - Fixed a crash when accessing primitive list properties on objects in realms opened with a dynamic schema (e.g. in migrations). (#1629)
- Added support for collections of primitive values. You can now define properties as
IList<T>
whereT
can be any type supported by Realm, except for anotherIList
. As a result, a lot of methods that previously had constraints onRealmObject
now accept any type and may throw a runtime exception if used with an unsupported type argument. (#1517) - Added
HelpLink
pointing to the relevant section of the documentation to most Realm exceptions. (#1521) - Added
RealmObject.GetBacklinks
API to dynamically obtain all objects referencing the current one. (#1533) - Added a new exception type,
PermissionDeniedException
, to denote permission denied errors when working with synchronized Realms that exposes a method -DeleteRealmUserInfo
- to inform the binding that the offending Realm's files should be kept or deleted immediately. This allows recovering from permission denied errors in a more robust manner. (#1543) - The keychain service name used by Realm to manage the encryption keys for sync-related metadata on Apple platforms is now set to the bundle identifier. Keys that were previously stored within the Realm-specific keychain service will be transparently migrated to the per-application keychain service. (#1522)
- Added a new exception type -
IncompatibleSyncedFileException
- that allows you to handle and perform data migration from a legacy (1.x) Realm file to the new 2.x format. It can be thrown when usingRealm.GetInstance
orRealm.GetInstanceAsync
and exposes aGetBackupRealmConfig
method that allows you to open the old Realm file in a dynamic mode and migrate any required data. (#1552) - Enable encryption on Windows. (#1570)
- Enable Realm compaction on Windows. (#1571)
UserInfo
has been significantly enhanced. It now contains metadata about a user stored on the Realm Object Server, as well as a list of all user account data associated with that user. (#1573)- Introduced a new method -
User.LogOutAsync
to replace the now-deprecated synchronous call. (#1574) - Exposed
BacklinksCount
property onRealmObject
that returns the number of objects that refer to the current object via a to-one or a to-many relationship. (#1578) - String primary keys now support
null
as a value. (#1579) - Add preview support for partial synchronization. Partial synchronization allows a synchronized Realm to be opened in such a way
that only objects requested by the user are synchronized to the device. You can use it by setting the
IsPartial
property on aSyncConfiguration
, opening the Realm, and then callingRealm.SubscribeToObjectsAsync
with the type of object you're interested in, a string containing a query determining which objects you want to subscribe to, and a callback which will report the results. You may add as many subscriptions to a synced Realm as necessary. (#1580) - Ensure that Realm collections (
IList<T>
,IQueryable<T>
) will not change when iterating in aforeach
loop. (#1589)
Realm.GetInstance
will now advance the Realm to the latest version, so you no longer have to callRefresh
manually after that. (#1523)- Fixed an issue that would prevent iOS Share Extension projects from working. (#1535)
Realm.CreateObject(string className)
now has additional parameterobject primaryKey
. You must pass that when creating a new object using the dynamic API. If the object you're creating doesn't have primary key declared, passnull
. (#1381)AcceptPermissionOfferAsync
now returns the relative rather than the absolute url of the Realm the user has been granted permissions to. (#1595)
- Exposed
Realm.WriteCopy
API to copy a Realm file and optionally encrypt it with a different key. (#1464) - The runtime representations of all Realm collections (
IQueryable<T>
andIList<T>
) now implement theIList
interface that is needed for data-binding toListView
in UWP applications. (#1469) - Exposed
User.RetrieveInfoForUserAsync
API to allow admin users to lookup other users' identities in the Realm Object Server. This can be used, for example, to find a user by knowing their Facebook id. (#1486) - Added a check to verify there are no duplicate object names when creating the schema. (#1502)
- Added more comprehensive error messages when passing an invalid url scheme to
SyncConfiguration
orUser.LoginAsync
. (#1501) - Added more meaningful error information to exceptions thrown by
Realm.GetInstanceAsync
. (#1503) - Added a new type -
RealmInteger<T>
to expose Realm-specific API over base integral types. It can be used to implement counter functionality in synced realms. (#1466) - Added
PermissionCondition.Default
to apply default permissions for existing and new users. (#1511)
- Fix an exception being thrown when comparing non-constant character value in a query. (#1471)
- Fix an exception being thrown when comparing non-constant byte or short value in a query. (#1472)
- Fix a bug where calling the non-generic version of
IQueryProvider.CreateQuery
on Realm's IQueryable results, an exception would be thrown. (#1487) - Trying to use an
IList
orIQueryable
property in a LINQ query will now throwNotSupportedException
rather than crash the app. (#1505)
- Exposed new API on the
User
class for working with permissions: (#1361)ApplyPermissionsAsync
,OfferPermissionsAsync
, andAcceptPermissionOfferAsync
allow you to grant, revoke, offer, and accept permissions.GetPermissionOffers
,GetPermissionOfferResponses
, andGetPermissionChanges
allow you to review objects, added via the above mentioned methods.GetGrantedPermissionsAsync
allows you to inspect permissions granted to or by the current user.
- When used with
RealmConfiguration
(i.e. local Realm),Realm.GetInstanceAsync
will perform potentially costly operation, such as executing migrations or compaction on a background thread. (#1406) - Expose
User.ChangePasswordAsync(userId, password)
API to allow admin users to change other users' passwords. (#1412) - Expose
SyncConfiguration.TrustedCAPath
API to allow providing a custom CA that will be used to validate SSL traffic to the Realm Object Server. (#1423) - Expose
Realm.IsInTransaction
API to check if there's an active transaction for that Realm. (#1452)
- Fix a crash when querying over properties that have
[MapTo]
applied. (#1405) - Fix an issue where synchronized Realms did not connect to the remote server in certain situations, such as when an application was offline when the Realms were opened but later regained network connectivity. (#1407)
- Fix an issue where incorrect property name will be passed to
RealmObject.PropertyChanged
subscribers when the actual changed property is below aBacklink
property. (#1433) - Fix an exception being thrown when referencing Realm in a PCL test assembly without actually using it. (#1434)
- Fix a bug when
SyncConfiguration.EnableSSLValidation
would be ignored when passed toRealm.GetInstanceAsync
. (#1423)
- The constructors of
PermissionChange
,PermissionOffer
, andPermissionOfferResponse
are now private. Use the newUser.ApplyPermissionsAsync
,User.OfferPermissionsAsync
, andUser.AcceptPermissionOfferAsync
API. (#1361) User.GetManagementRealm
andUser.GetPermissionRealm
are now deprecated. Use the new permission related API onUser
to achieve the same results. (#1361)User.ChangePassword(password)
has been renamed toUser.ChangePasswordAsync(password)
. (#1412)- Removed the following obsolete 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 throws an exception if called while an instance of that Realm is still open.
- Expose
RealmObject.OnManaged
virtual method that can be used for init purposes, since the constructor is run before the object has knowledge of its Realm. (#1383) - Expose
Realm.GetInstanceAsync
API to asynchronously open a synchronized Realm. It will download all remote content available at the time the operation began on a background thread and then return a usable Realm. It is also the only supported way of opening Realms for which the user has only read permissions.
Introducing Realm Mobile Database for Universal Windows Platform (UWP). With UWP support, you can now build mobile apps using Realm’s object database for the millions of mobile, PC, and Xbox devices powered by Windows 10. The addition of UWP support allows .NET developers to build apps for virtually any modern Windows Platform with Windows Desktop (Win32) or UWP as well as for iOS and Android via Xamarin. Note that sync support is not yet available for UWP, though we are working on it and you can expect it soon.
- Case insensitive queries against a string property now use a new index based search. (#1380)
- Add
User.ChangePassword
API to change the current user's password if using Realm's 'password' authentication provider. Requires any edition of the Realm Object Server 1.4.0 or later. (#1386) SyncConfiguration
now has anEnableSSLValidation
property (default istrue
) to allow SSL validation to be specified on a per-server basis. (#1387)- Add
RealmConfiguration.ShouldCompactOnLaunch
callback property when configuring a Realm to determine if it should be compacted before being returned. (#1389) - Silence some benign linker warnings on iOS. (#1263)
- Use reachability API to minimize the reconnection delay if the network connection was lost. (#1380)
- Fixed a bug where
Session.Reconnect
would not reconnect all sessions. (#1380) - Fixed a crash when subscribing for
PropertyChanged
multiple times. (#1380) - Fixed a crash when reconnecting to Object Server (#1380)
- Fixed a crash on some Android 7.x devices when opening a realm (#1380)
- Fixed an issue where
EntryPointNotFoundException
would be thrown on some Android devices. (#1336)
- Expose
IRealmCollection.IsValid
to indicate whether the realm collection is valid to use. (#1344) - Update the Fody reference which adds support for building with Mono 5. (#1364)
Realm is now being distributed as a .NET Standard 1.4 library as this is a requirement for supporting UWP. While internally that is a rather big move, applications using it should not be affected. After the upgrade, you'll see a number of new NuGet dependencies being added - those are reference assemblies, already part of mscorlib, so will not affect your application's size or performance. Additionally, we're releasing a new platform specific DataBinding package that contains helper methods that enable two-way databinding scenarios by automatically creating transactions when setting a property.
If you encounter any issues after the upgrade, we recommend clearing the bin
and obj
folders and restarting Xamarin Studio. If this doesn't help, please file an issue explaining your solution setup and the type of problems you encounter.
Files written with this version cannot be read by earlier versions of Realm. This version is not compatible with versions of the Realm Object Server lower than 1.3.0.
- Fixes the
RemoveAll(string)
overload to work correctly. (#1288) - Resolved an issue that would lead to crashes when refreshing the token for an invalid session. (#1289)
- The
IObservable
returned fromsession.GetProgressObservable
will correctly callOnComplete
when created withmode: ProgressMode.ForCurrentlyOutstandingWork
. (#1292) - Fixed a memory leak when accessing string properties. (#1318)
- Fixes an issue when using
EncryptionKey
with synchronized realms. (#1322)
- Introduce APIs for safely passing objects between threads. Create a thread-safe reference to a thread-confined object by passing it to the
ThreadSafeReference.Create
factory method, which you can then safely pass to another thread to resolve in the new realm withRealm.ResolveReference
. (#1300) - Introduce API for attempting to reconnect all sessions. This could be used in conjunction with the connectivity plugin to monitor for connectivity changes and proactively request reconnecting, rather than rely on the built-in retry mechanism. (#1310)
- Enable sorting over to-one relationships, e.g.
realm.All<Parent>().OrderBy(p => p.Child.Age)
. (#1313) - Introduce a
string.Like
extension method that can be used in LINQ queries against the underlying database engine. (#1311) - Add an
User.IsAdmin
property that indicates whether a user is a Realm Object Server administrator. (#1320)
DateTimeOffset
properties that are not set will now correctly default to0001-1-1
instead of1970-1-1
after the object is passed torealm.Add
. (#1293)- Attempting to get an item at index that is out of range should now correctly throw
ArgumentOutOfRangeException
for allIRealmCollection
implementations. (#1295) - The layout of the .lock file has changed, which may affect scenarios where different processes attempt to write to the same Realm file at the same time. (#1296)
PropertyChanged
notifications use a new, more reliable, mechanism, that behaves slightly differently from the old one. Notifications will be sent only after a transaction is committed (making it consistent with the way collection notifications are handled). To make sure that your UI is promptly updated, you should avoid keeping long lived transactions around. (#1316)
- Resolved an issue that prevented compiling for iOS on Visual Studio. (#1277)
- Added Azure Active Directory (AzureAD) credentials provider. (#1254)
This is a preparation release for adding UWP support. We have removed all platform-specific logic from the Realm assemblies, and instead weave them in compile time. While this has been tested in all common scenarios, it may create issues with very complex project graphs. If you encounter any of these issues with iOS projects:
- Compilation fails when running Task
WeaveRealmAssemblies
- App crashes when first accessing a Realm
please file an issue and explain your solution setup.
- The
Realm
NuGet package no longer clobbers the path to Win32 native binaries inRealm.Database
. (#1239) - Fixed a bug where garbage collecting an object with
PropertyChanged
subscribers would cause crashes. (#1237)
After about a year and a half of hard work, we are proud to call this a 1.0 release. There is still work to do, but Realm Xamarin is now being used by thousands of developers and has proven reliable.
Realm Xamarin now works with the Realm Mobile Platform. This means that you can write Xamarin apps that synchronize seamlessly with a Realm Object Server, allowing you to write complex apps with Xamarin that are offline-first and automatically synchronised by adding just a few lines of code. You can read about this in the documentation.
Realm Xamarin is no longer iOS and Android only. You can now use it to write .NET programs for Windows Desktop. Add the NuGet package to your regular .NET project and start using Realm. Some features are not supported on Windows yet. Most notably, sync does not yet work for Windows, but also encryption and notifications across processes are missing. We are working on it and you can expect support soon.
IRealmCollection<T>.ObjectSchema
is deprecated and replaced withISchemaSource.ObjectSchema
. (#1216)
[MapTo]
attribute is now respected in queries. (#1219)- Letting a Realm instance be garbage collected instead of disposing it will no longer lead to crashes. (#1212)
- Unsubscribing from
RealmObject.PropertyChanged
in aPropertyChanged
callback should no longer lead to crashes. (#1207) WriteAsync
now advances the read transaction so the changes made asynchronously are available immediately in the original thread. (#1192)- Queries on backlink properties should no longer produce unexpected results. (#1177)
- Addressed an issue where obtaining a Realm instance, reading an object, then obtaining another instance on the same thread would cause the object to become invalid and crash the application upon accessing any of its members.
- Moved all exceptions under the
Realms.Exceptions
namespace. (#1075) - Moved
RealmSchema
toRealms.Schema
namespace. (#1075) - Made the
ErrorEventArgs
constructor internal. (#1075) - Made
ObjectSchema.Builder
andRealmSchema.Builder
internal. (#1075) - Passing an object that has
IList
properties toAdd(obj, update: true)
will no longer merge the lists. Instead, theIList
property will contain only the items in the object. (#1040)
- Added virtual
OnPropertyChanged
method inRealmObject
that you can override to be notified of changes to the current object. (#1047) - Added compile time checks that
[Required]
is applied on correct property types. (#1072) Realm.Add(RealmObject obj)
will now return the passed in object, similarly toRealm.Add<T>(T obj)
. (#1162)- Added an extension method for
string.Contains
that acceptsStringComparison
argument and can be used in queries. When querying, onlyStringComparison.Ordinal
andStringComparison.OrdinalIgnoreCase
can be used. When not used in queries, all values forStringComparison
are valid. (#1141)
- Adding a standalone object, that has an
IList<T>
property that has never been accessed, to the Realm will no longer throw aNullReferenceException
. (#1040) IList<T>
properties will now correctly returnIsReadOnly = true
when managed by a readonly Realm. (#1070)- The weaver should now correctly resolve references in PCL and netstandard assemblies. (#1117)
- Add some missing methods to the PCL reference assembly. (#1093)
- Disposed realms will not throw
ObjectDisposedException
when trying to access their members. Additionally, disposing a realm will not invalidate other instances on the same thread. (#1063)
- The
IQueryable<T>.ToNotifyCollectionChanged
extension methods that accept parameters are now deprecated. There is a new parameterless one that you should use instead. If you want to handle errors, you can do so by subscribing to theRealm.OnError
event. (#938) RealmResults<T>
is now markedinternal
andRealm.All<T>()
will instead returnIQueryable<T>
. We've added a new extension methodIQueryable<T>.SubscribeForNotifications(NotificationCallbackDelegate<T>)
that allows subscribing for notifications. (#942)Realm.CreateObject<T>
has been deprecated and will be removed in the next major release. (It could cause a dangerous data loss when using the synchronised realms coming soon, if a class has a PrimaryKey). (#998)RealmConfiguration.ReadOnly
has been renamed toRealmConfiguration.IsReadOnly
and is now a property instead of a field. (#858)Realm.All
has been renamed toRealm.GetAll
and the former has been obsoleted. (#858)Realm.ObjectForPrimaryKey
has been renamed toRealm.Find
and the former has been obsoleted. (#858)Realm.Manage
has been renamed toRealm.Add
and the former has been obsoleted. (#858)RealmConfiguration.PathToRealm
has been renamed toRealm.GetPathToRealm
and the former has been obsoleted. (#858)RealmResults.NotificationCallback
has been extracted as a non-nested class and has been renamed toNotificationCallbackDelegate
. (#858)Realm.Close
has been removed in favor ofRealm.Dispose
. (#858)RealmList<T>
is now markedinternal
. You should useIList<T>
to define collection relationships. (#858)
- In data-binding scenarios, if a setter is invoked by the binding outside of write transaction, we'll create an implicit one and commit it. This enables two-way data bindings without keeping around long-lived transactions. (#901)
- The Realm schema can now express non-nullable reference type properties with the new
[Required]
attribute. (#349) - Exposed a new
Realm.Error
event that you can subscribe for to get notified for exceptions that occur outside user code. (#938) - The runtime types of the collection, returned from
Realm.All
and the collection created forIList<T>
properties onRealmObject
now implementINotifyCollectionChanged
so you can pass them for data-binding without any additional casting. (#938, #909) - All RealmObjects implement
INotifyPropertyChanged
. This allows you to pass them directly for data-binding. - Added
Realm.Compact
method that allows you to reclaim the space used by the Realm. (#968) Realm.Add
returns the added object. (#931)- Support for backlinks aka
LinkingObjects
. (#219) - Added an
IList<T>.Move
extension method that allows you to reorder elements within the collection. For managed Lists, it calls a native method, so it is slightly more efficient than removing and inserting an item, but more importantly, it will raise theCollectionChanged
withNotifyCollectionChangedAction.Move
which will result in a nice move animation, rather than a reload of a ListView. (#995)
- Subscribing to
PropertyChanged
on a RealmObject and modifying an instance of the same object on a different thread will now properly raise the event. (#909) - Using
Insert
to insert items at the end of anIList
property will no longer throw an exception. (#978)
- This version updates the file format. Older versions will not be able to open files created with this version. (#846)
RealmList<T>
is now marked as internal. If you were using it anywhere, you should migrate toIList<T>
. (#880)
-
iOS Linking all should work - we now add a [Preserve] attribue to all woven members of your
RealmObject
subclasses so you do not need to manually add[Preserve(allMembers=true)]
(#822) -
Realm.Manage
calls are now much faster. You should prefer that toRealm.CreateObject
unless you are setting only a few properties, while leaving the rest with default values. (#857) -
Added
bool update
argument toRealm.Manage
. Whenupdate: true
is passed, Realm will try to find and update a persisted object with the same PrimaryKey. If an object with the same PrimaryKey is not found, the umnamaged object is added. If the passed in object does not have a PrimaryKey, it will be added. Any related objects will be added or updated depending on whether they have PrimaryKeys. (#871)NOTE: cyclic relationships, where object references are not identical, will not be reconciled. E.g. this will work as expected:
var person = new Person { Name = "Peter", Id = 1 }; person.Dog = new Dog(); person.Dog.Owner = person;
However this will not - it will set the Person's properties to the ones from the last instance it sees:
var person = new Person { Name = "Peter", Id = 1 }; person.Dog = new Dog(); person.Dog.Owner = new Person { Id = 1 };
This is important when deserializing data from json, where you may have multiple instances of object with the same Id, but with different properties.
-
Realm.Manage
will no longer throw an exception if a managed object is passed. Instead, it will immediately return. (#871) -
Added non-generic version of
Realm.Manage
. (#871) -
Added support for nullable integer PrimaryKeys. Now you can have
long?
PrimaryKey property wherenull
is a valid unique value. (#877) -
Added a weaver warning when applying Realm attributes (e.g.
[Indexed]
or[PrimaryKey]
) on non-persisted properties. (#882) -
Added support for
==
and!=
comparisons to realm objects in LINQ (#896), e.g.:var peter = realm.All<Person>().FirstOrDefault(d => d.Name == "Peter"); var petersDogs = realm.All<Dog>().Where(d => d.Owner == peter);
-
Added support for
StartsWith(string, StringComparison)
,EndsWith(string, StringComparison)
, andEquals(string, StringComparison)
filtering in LINQ. (#893)NOTE: Currently only
Ordinal
andOrdinalIgnoreCase
comparisons are supported. Trying to pass in a different one will result in runtime error. If no argument is supplied,Ordinal
will be used.
Realm.ObjectForPrimaryKey()
now returns null if it failed to find an object (#833).- Querying anything but persisted properties now throws instead of causing a crash (#251 and #723)
Uses core 1.5.1
- The term
ObjectId
has been replaced withPrimaryKey
in order to align with the other SDKs. This affects the[ObjectId]
attribute used to decorate a property.
- You can retrieve single objects quickly using
Realm.ObjectForPrimaryKey()
if they have a[PrimaryKey]
property specified. (#402) - Manual migrations are now supported. You can specify exactly how your data should be migrated when updating your data model. (#545)
- LINQ searches no longer throw a
NotSupportedException
if your integer type on the other side of an expression fails to exactly match your property's integer type. - Additional LINQ methods now supported: (#802)
- Last
- LastOrDefault
- FirstOrDefault
- SingleOrDefault
- ElementAt
- ElementAtOrDefault
- Searching char field types now works. (#708)
- Now throws a RealmMigrationSchemaNeededException if you have changed a
RealmObject
subclass declaration and not incremented theSchemaVersion
(#518) - Fixed a bug where disposing a
Transaction
would throw anObjectDisposedException
if itsRealm
was garbage-collected (#779) - Corrected the exception being thrown
IndexOutOfRangeException
to beArgumentOutOfRangeException
Uses core 1.5.1
- Setting your Build Verbosity to
Detailed
orNormal
will now display a message for every property woven, which can be useful if you suspect errors with Fody weaving. - Better exception messages will helo diagnose EmptySchema problems (#739)
- Partial evaluation of LINQ expressions means more expressions types are supported as operands in binary expressions (#755)
- Support for LINQ queries that check for
null
againststring
,byte[]
andNullable<T>
properties. - Support for
string.IsNullOrEmpty
on persisted properties in LINQ queries. - Schema construction has been streamlined to reduce overhead when opening a Realm
- Schema version numbers now start at 0 rather than UInt64.MaxValue
RealmResults<T>
should implementIQueryable.Provider
implicitly (#752)- Realms that close implicitly will no longer invalidate other instances (#746)
Uses core 1.4.2
- Fixed a bug weaving pure PCL projects, released in v0.77.0 (#715)
- Exception messages caused by using incompatible arguments in LINQ now include the offending argument (#719)
- PCL projects using ToNotifyCollectionChanged may have crashed due to mismatch between PCL signatures and platform builds.
Uses core 1.4.0
Broken Version - will not build PCL projects
- Sort order change in previous version was reverted.
- It is now possible to introspect the schema of a Realm. (#645)
- The Realm class received overloads for
Realm.CreateObject
andRealm.All
that accept string arguments instead of generic parameters, enabling use of thedynamic
keyword with objects whose exact type is not known at compile time. (#646) - To Many relationships can now be declared with an
IList<DestClass>
rather than requiringRealmList<DestClass>
. This is significantly faster than usingRealmList
due to caching the list. (Issue #287) - Creating standalone objects with lists of related objects is now possible. Passing such an object into
Realm.Manage
will cause the entire object graph from that object down to become managed.
- Fixed a crash on iOS when creating many short-lived realms very rapidly in parallel (Issue #653)
RealmObject.IsValid
can be called to check if a managed object has been deleted- Accessing properties on invalid objects will throw an exception rather than crash with a segfault (#662)
- Exceptions thrown when creating a Realm no longer leave a leaking handle (Issue #503)
Uses core 1.4.0
- The
Realm
static constructor will no longer throw aTypeLoadException
when there is an activeSystem.Reflection.Emit.AssemblyBuilder
in the currentAppDomain
. - Fixed
Attempting to JIT compile
exception when using the Notifications API on iOS devices. (Issue #620)
No API change but sort order changes slightly with accented characters grouped together and some special characters sorting differently. "One third" now sorts ahead of "one-third".
It uses the table at ftp://ftp.unicode.org/Public/UCA/latest/allkeys.txt
It groups all characters that look visually identical, that is, it puts a, à, å together and before ø, o, ö even. This is a flaw because, for example, å should come last in Denmark. But it's the best we can do now, until we get more locale aware.
Uses core 1.1.2
RealmObject
classes will now implicitly implementINotifyPropertyChanged
if you specify the interface on your class. Thanks to Joe Brock for this contribution!
long
is supported in queries (Issue #607)- Linker error looking for
System.String System.String::Format(System.IFormatProvider,System.String,System.Object)
fixed (Issue #591) - Second-level descendants of
RealmObject
and static properties inRealmObject
classes now cause the weaver to properly report errors as we don't (yet) support those. (Issue #603) - Calling
.Equals()
on standalone objects no longer throws. (Issue #587)
- File format of Realm files is changed. Files will be automatically upgraded but opening a Realm file with older versions of Realm is not possible. NOTE: If you were using the Realm Browser specified for the old format you need to upgrade. Pick up the newest version here.
RealmResults<T>
no longer implicitly implementsINotifyCollectionChanged
. Use the newToNotifyCollectionChanged
method instead.
RealmResults<T>
can be observed for granular changes via the newSubscribeForNotifications
method.Realm
gained theWriteAsync
method which allows a write transaction to be executed on a background thread.- Realm models can now use
byte[]
properties to store binary data. RealmResults<T>
received a newToNotifyCollectionChanged
extension method which produces anObservableCollection<T>
-like wrapper suitable for MVVM data binding.
- Nullable
DateTimeOffset
properties are supported now. - Setting
null
to a string property will now correctly returnnull
- Failure to install Fody will now cause an exception like "Realms.RealmException: Fody not properly installed. RDB2_with_full_Realm.Dog is a RealmObject but has not been woven." instead of a
NullReferenceException
- The PCL
RealmConfiguration
was missing some members. - The Fody weaver is now discoverable at non-default nuget repository paths.
- Realms now refresh properly on Android when modified in other threads/processes.
- Fixes crashes under heavy combinations of threaded reads and writes.
- The two
Realm
andRealmWeaver
NuGet packages have been combined into a singleRealm
package. - The
String.Contains(String)
,String.StartsWith(String)
, andString.EndsWith(String)
methods now support variable expressions. Previously they only worked with literal strings. RealmResults<T>
now implementsINotifyCollectionChanged
by raising theCollectionChanged
event withNotifyCollectionChangedAction.Reset
when its underlying table or query result is changed by a write transaction.
- The Realm assembly weaver now submits anonymous usage data during each build, so we can track statistics for unique builders, as done with the Java, Swift and Objective-C products (issue #182)
Realm.RemoveRange<>()
andRealm.RemoveAll<>()
methods added to allow you to delete objects from a realm.Realm.Write()
method added for executing code within an implicitly committed transaction- You can now restrict the classes allowed in a given Realm using
RealmConfiguration.ObjectClasses
. - LINQ improvements:
- Simple bool searches work without having to use
== true
(issue #362) - ! operator works to negate either simple bool properties or complex expressions (issue #77)
- Count, Single and First can now be used after a Where expression, (#369) eg
realm.All<Owner>().Where(p => p.Name == "Dani").First();
as well as with a lambda expression
realm.All<Owner>().Single( p => p.Name == "Tim");
- Sorting is now provided using the
OrderBy
,OrderByDescending
,ThenBy
andThenByDescending
clauses. Sorts can be applied to results of a query from aWhere
clause or sorting the entire class by applying afterAll<>
. - The
String.Contains(String)
,String.StartsWith(String)
, andString.EndsWith(String)
methods can now be used in Where clauses. - DateTimeOffset properties can be compared in queries.
- Simple bool searches work without having to use
- Support for
armeabi
builds on old ARM V5 and V6 devices has been removed.
- Finish
RealmList.CopyTo
so you can applyToList
to related lists (issue #299) - NuGet now inserts
libwrappers.so
for Android targets using$(SolutionDir)packages
so it copes with the different relative paths in cross-platform (Xamarin Forms) app templates vs pure Android templates. Realm.RealmChanged
event notifies you of changes made to the realmRealm.Refresh()
makes sure the realm is updated with changes from other threads.
RealmConfiguration.EncryptionKey
added so files can be encrypted and existing encrypted files from other Realm sources opened (assuming you have the key)
- For PCL users, if you use
RealmConfiguration.DefaultConfiguration
without having linked a platform-specific dll, you will now get the warning message with aPlatformNotSupportedException
. Previously threw aTypeInitExepction
. - Update to Core v0.96.2 and matching ObjectStore (issue #393)
No functional changes. Just added library builds for Android 64bit targets x86_64
and arm64-v8a
.
Uses Realm core 0.96.0
- Added support for PCL so you can now use the NuGet in your PCL GUI or viewmodel libraries.
Building IOS apps targeting the simulator sometimes got an error like:
Error MT5209: Native linking error...building for iOS simulator,
but linking in object file built for OSX, for architecture i386 (MT5209)
This was fixed by removing a redundant simulator library included in NuGet
Uses Realm core 0.95.6.
Now supporting:
- Xamarin Studio on Mac - IOS and Android
- Xamarin Studio on Windows - Android
- Visual Studio on Windows - IOS and Android
- Added Android support as listed above.
- Added
RealmConfiguration
to provide reusable way to specify path and other settings. - Added
Realm.Equals
,Realm.GetHashCode
andRealm.IsSameInstance
to provide equality checking so you can confirm realms opened in the same thread are equal (shared internal instance). - Added
Realm.DeleteFiles(RealmConfiguration)
to aid in cleaning up related files. - Added nullable basic types such as
int?
. - Optimised
Realm.All<userclass>().Count()
to get rapid count of all objects of given class. - Related lists are now supported in standalone objects.
Count()
onWhere()
implemented.Any()
onWhere()
implemented.First( lambda )
andSingle( lambda )
implemented.- Significant optimisation of
Where()
to be properly lazy, was instantiating all objects internally.
[PrimaryKey]
attribute renamed[ObjectId]
.Realm.Attach(object)
renamedManage(object)
.- Lists of related objects are now declared with
IList<otherClass>
instead ofRealmList
.
- Bug that caused a linker error for iPhone simulator fixed (#375)
Requires installation from private copy of NuGet download.
- Supported IOS with Xamarin Studio only.
- Basic model and read/write operations with simple LINQ
Where
searches. - NuGet hosted as downloads from private realm/realm-dotnet repo.