All Versions
83
Latest Version
Avg Release Cycle
22 days
Latest Release
538 days ago

Changelog History
Page 4

  • v10.1.0 Changes

    February 09, 2021

    ✨ Enhancements

    • ⬆️ 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)

    🛠 Fixed

    • 🛠 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::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)

    Compatibility

    • Realm Studio: 10.0.0 or later.

    Internal

    • Using Core 10.5.0.
    • 🛠 Fixes the analytics version being sent.
  • v10.0.1 Changes

    February 02, 2021

    💥 Breaking Changes

    • 🏗 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 to Realm.DynamicApi:
      • Realm.CreateObject(string className, object primaryKey) is now Realm.DynamicApi.CreateObject(string className, object primaryKey).
      • Realm.All(string className) is now Realm.DynamicApi.All(string className).
      • Realm.RemoveAll(string className) is now Realm.DynamicApi.RemoveAll(string className).
      • Realm.Find(string className, long? primaryKey) is now Realm.DynamicApi.Find(string className, long? primaryKey).
      • Realm.Find(string className, string primaryKey) is now Realm.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 the MapTo("_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 to SyncConfiguration.
    • ✂ Removed RealmObject.FreezeInPlace. To freeze a realm object use the Freeze extension method. (Issue #2180)

    ✨ Enhancements

    • ➕ 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 types string, long, or ObjectId. 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-in decimal type. Note that .NET's built-in decimal is 96-bit, so it cannot represent the full range of numbers, representable by Decimal128. (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 of RealmObject. 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 message No 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 and Realm.WriteAsync that can return a value. (Issue #2081)

    🛠 Fixed

    • 🚀 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 return foo.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)

    Compatibility

    • Realm Studio: 10.0.0 or later.

    Internal

    • 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)
  • v10.0.0-beta.2 Changes

    November 04, 2020

    🛠 Fixed

    • 🛠 Fix crash in case insensitive query on indexed string columns when nothing matches (Core upgrade)

    ✨ Enhancements

    • ➕ 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 and Realm.WriteAsync that can return a value. (Issue #2081)

    Compatibility

    • Realm Studio: 10.0.0 or later.

    Internal

    • 🔀 Using Sync 10.1.0 and Core 10.1.0.
  • v10.0.0-beta.1 Changes

    October 19, 2020

    💥 Breaking Changes

    • 🏗 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 to Realm.DynamicApi:
      • Realm.CreateObject(string className, object primaryKey) is now Realm.DynamicApi.CreateObject(string className, object primaryKey).
      • Realm.All(string className) is now Realm.DynamicApi.All(string className).
      • Realm.RemoveAll(string className) is now Realm.DynamicApi.RemoveAll(string className).
      • Realm.Find(string className, long? primaryKey) is now Realm.DynamicApi.Find(string className, long? primaryKey).
      • Realm.Find(string className, string primaryKey) is now Realm.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 the MapTo("_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 to SyncConfiguration.

    ✨ Enhancements

    • ➕ 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 types string, long, or ObjectId. 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-in decimal type. Note that .NET's built-in decimal is 96-bit, so it cannot represent the full range of numbers, representable by Decimal128. (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 a 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 of RealmObject. 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.

    Compatibility

    • Realm Studio: 10.0.0 or later.

    Internal

    • 🔀 Using Sync 10.0.0 and Core 10.0.0.
  • v5.1.3 Changes

    February 10, 2021

    🛠 Fixed

    • ⬆️ 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)

    Compatibility

    • Realm Object Server: 3.23.1 or later.
    • Realm Studio: 5.0.0 or later.

    Internal

    • 🔀 Using Sync 5.0.32 and Core 6.2.3.
    • ⚡️ Updated the QuickJournal example to latest Realm and Xamarin.Forms versions. (PR #2057)
  • v5.1.2 Changes

    October 20, 2020

    🛠 Fixed

    • 🛠 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)

    Compatibility

    • Realm Object Server: 3.23.1 or later.
    • Realm Studio: 5.0.0 or later.

    Internal

    • 🔀 Using Sync 5.0.28 and Core 6.1.3.
    • ⚡️ Updated the QuickJournal example to latest Realm and Xamarin.Forms versions. (PR #2057)
  • v5.1.1 Changes

    October 02, 2020

    ✨ Enhancements

    • None

    🛠 Fixed

    • ⬆️ 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)

    Compatibility

    • Realm Object Server: 3.23.1 or later.
    • Realm Studio: 5.0.0 or later.

    Internal

    • 🔀 Using Sync 5.0.28 and Core 6.1.3.
  • v5.1.0 Changes

    September 30, 2020

    ✨ Enhancements

    • 🐎 Greatly improve performance of NOT IN queries on indexed string or int columns. (Core upgrade)

    🛠 Fixed

    • 🛠 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)

    Compatibility

    • Realm Object Server: 3.23.1 or later.
    • Realm Studio: 5.0.0 or later.

    Internal

    • 🔀 Using Sync 5.0.27 and Core 6.1.2.
    • ➕ Added prerelease nuget feed via GitHub packages. (PR #2028)
  • v5.0.1 Changes

    September 10, 2020

    🚀 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.

    ✨ Enhancements

    • ➕ 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(), and IRealmCollection<T>.Freeze(). These methods will produce the frozen version of the instance on which they are called.
      • Added Realm.IsFrozen, RealmObject.IsFrozen, and IRealmCollection<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.
    • ➕ Add support for SynchronizationContext-confined Realms. Rather than being bound to a specific thread, queue-confined Realms are bound to a SynchronizationContext, regardless of whether it dispatches work on the same or a different thread. Opening a Realm when SynchronizationContext.Current is null - most notably Task.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

    • 🛠 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)

    Compatibility

    • Realm Object Server: 3.23.1 or later.
    • Realm Studio: 5.0.0 or later.

    Internal

    • 🔀 Using Sync 5.0.21 and Core 6.0.24.
  • v4.3.0 Changes

    February 05, 2020

    ✨ Enhancements

    • 🔦 Exposed an API to configure the userId and isAdmin of a user when creating credentials via Credentials.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 the userId and the isAdmin 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.

    🛠 Fixed

    • Realm objects can now be correctly serialized with System.Runtime.Serialization.Formatters and System.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 as Realm and ObjectSchema which contain handles to unmanaged data.
    • 🛠 Fixed an issue that would result in a compile error when [Required] is applied on IList<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 the class_ prefix for class names when querying over backlink properties. This has been fixed so that only the public ObjectSchema name is necessary. For example, @links.class_Person.Siblings becomes @links.Person.Siblings.
    • 🛠 Fixed an issue where ClientResyncMode.DiscardLocalRealm wouldn't reset the schema.

    Compatibility

    • Realm Object Server: 3.23.1 or later.

    Internal

    • ⬆️ Upgraded Sync from 4.7.5 to 4.9.5 and Core from 5.23.3 to 5.23.8.