/// <summary> /// This realm will start managing a RealmObject which has been created as a standalone object. /// </summary> /// <typeparam name="T">The Type T must not only be a RealmObject but also have been processed by the Fody weaver, so it has persistent properties.</typeparam> /// <param name="obj">Must be a standalone object, null not allowed.</param> /// <exception cref="RealmOutsideTransactionException">If you invoke this when there is no write Transaction active on the realm.</exception> /// <exception cref="RealmObjectAlreadyManagedByRealmException">You can't manage the same object twice. This exception is thrown, rather than silently detecting the mistake, to help you debug your code</exception> /// <exception cref="RealmObjectManagedByAnotherRealmException">You can't manage an object with more than one realm</exception> public void Manage <T>(T obj) where T : RealmObject { if (obj == null) { throw new ArgumentNullException(nameof(obj)); } if (obj.IsManaged) { if (obj.Realm.SharedRealmHandle == this.SharedRealmHandle) { throw new RealmObjectAlreadyManagedByRealmException("The object is already managed by this realm"); } throw new RealmObjectManagedByAnotherRealmException("Cannot start to manage an object with a realm when it's already managed by another realm"); } if (!IsInTransaction) { throw new RealmOutsideTransactionException("Cannot start managing a Realm object outside write transactions"); } var metadata = Metadata[typeof(T).Name]; var tableHandle = metadata.Table; var rowPtr = NativeTable.AddEmptyRow(tableHandle); var rowHandle = CreateRowHandle(rowPtr, SharedRealmHandle); obj._Manage(this, rowHandle, metadata); obj._CopyDataFromBackingFieldsToRow(); }
private RealmObject CreateObject(string className, out RealmObject.Metadata metadata) { if (!IsInTransaction) { throw new RealmOutsideTransactionException("Cannot create Realm object outside write transactions"); } if (!Metadata.TryGetValue(className, out metadata)) { throw new ArgumentException($"The class {className} is not in the limited set of classes for this realm"); } var result = metadata.Helper.CreateInstance(); var rowPtr = NativeTable.AddEmptyRow(metadata.Table); var rowHandle = CreateRowHandle(rowPtr, SharedRealmHandle); result._Manage(this, rowHandle, metadata); return(result); }