Пример #1
0
        /// <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();
        }
Пример #2
0
        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);
        }