A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://www.mongodb.com/docs/atlas/device-sdks/sdk/swift/model-data/object-models/ below:

Define a Realm Object Model - Swift SDK - Atlas Device SDKs

You can define a Realm object by deriving from the RLMObject or RLMEmbeddedObject class. The name of the class becomes the table name in the realm, and properties of the class persist in the database. This makes it as easy to work with persisted objects as it is to work with regular Objective-C objects.

@interface Dog : RLMObject@property RLMObjectId *_id;@property NSString *name;@property NSString *breed;@property NSDate *dateOfBirth;@end@implementation Dog+ (NSString *)primaryKey {    return @"_id";}+ (NSArray<NSString *> *)requiredProperties {    return @[        @"_id", @"name", @"dateOfBirth"    ];}@end

You can define a Realm object by deriving from the Object or EmbeddedObject class. The name of the class becomes the table name in the realm, and properties of the class persist in the database. This makes it as easy to work with persisted objects as it is to work with regular Swift objects.

class Dog: Object {    @Persisted(primaryKey: true) var _id: ObjectId    @Persisted var name = ""    @Persisted var breed: String?    @Persisted var dateOfBirth = Date()}
Note

Class names are limited to a maximum of 57 UTF-8 characters.

When you declare the property attributes of a class, you can specify whether or not those properties should be managed by the realm. Managed properties are stored or updated in the database. Ignored properties are not stored to the database. You can mix managed and ignored properties within a class.

The syntax to mark properties as managed or ignored varies depending on which version of the SDK you use.

New in version 10.10.0: The @Persisted declaration style replaces the @objc dynamic, RealmOptional, and RealmProperty declaration notations from older versions of the SDK. For an older version of the SDK, see: Objective-C Dynamic Property Attributes.

Declare model properties that you want to store to the database as @Persisted. This enables them to access the underlying database data.

When you declare any properties as @Persisted within a class, the other properties within that class are automatically ignored.

If you mix @Persisted and @objc dynamic property declarations within a class definition, any property attributes marked as @objc dynamic will be ignored.

Changed in version 10.10.0: This property declaration information is for versions of the SDK before 10.10.0.

Declare dynamic Realm model properties in the Objective-C runtime. This enables them to access the underlying database data.

You can either:

Use let to declare LinkingObjects, List, RealmOptional and RealmProperty. The Objective-C runtime cannot represent these generic properties.

Changed in version 10.8.0: RealmProperty replaces RealmOptional

When declaring non-generic properties, use the @Persisted annotation. The @Persisted attribute turns Realm model properties into accessors for the underlying database data.

Declare properties on your object type as you would on a normal Objective-C interface.

In order to use your interface in a Realm array, pass your interface name to the RLM_COLLECTION_TYPE() macro. You can put this at the bottom of your interface's header file. The RLM_COLLECTION_TYPE() macro creates a protocol that allows you to tag RLMArray with your type:

@interface Task : RLMObject@property NSString *description;@endRLM_COLLECTION_TYPE(Task)@interface User : RLMObject@property NSString *name;@property RLMArray<Task *><Task> *tasks;@end

When declaring non-generic properties, use the @objc dynamic var annotation. The @objc dynamic var attribute turns Realm model properties into accessors for the underlying database data. If the class is declared as @objcMembers (Swift 4 or later), you can declare properties as dynamic var without @objc.

To declare properties of generic types LinkingObjects, List, and RealmProperty, use let. Generic properties cannot be represented in the Objective‑C runtime, which Realm uses for dynamic dispatch of dynamic properties.

Note

Property names are limited to a maximum of 63 UTF-8 characters.

You can declare properties as optional or required (non-optional) using standard Swift syntax.

class Person: Object {        @Persisted var name = ""        @Persisted var address: String?        @Persisted var ageYears = 0        @Persisted var heightCm: Float?}

To declare a given property as required, implement the requiredProperties method and return an array of required property names.

@interface Person : RLMObject@property NSString *name;@property NSString *address;@property int ageYears;@property NSNumber<RLMFloat> *heightCm;@end@implementation Person+ (NSArray<NSString *> *)requiredProperties {    return @[@"name"];}@end

Changed in version 10.8.0: RealmProperty replaces RealmOptional

You can declare String, Date, Data, and ObjectId properties as optional or required (non-optional) using standard Swift syntax. Declare optional numeric types using the RealmProperty type.

class Person: Object {        @objc dynamic var name = ""        @objc dynamic var address: String?        @objc dynamic var ageYears = 0        let heightCm = RealmProperty<Float?>()}

RealmProperty supports Int, Float, Double, Bool, and all of the sized versions of Int (Int8, Int16, Int32, Int64).

You can designate a property as the primary key of your class.

Primary keys allow you to efficiently find, update, and upsert objects.

Primary keys are subject to the following limitations:

Declare the property with primaryKey: true on the @Persisted notation to set the model's primary key.

class Project: Object {    @Persisted(primaryKey: true) var id = 0    @Persisted var name = ""}

Override +[RLMObject primaryKey] to set the model's primary key.

@interface Project : RLMObject@property NSInteger id; @property NSString *name;@end@implementation Project+ (NSString *)primaryKey {    return @"id";}@end

Override Object.primaryKey() to set the model's primary key.

class Project: Object {    @objc dynamic var id = 0    @objc dynamic var name = ""        override static func primaryKey() -> String? {        return "id"    }}

You can create an index on a given property of your model. Indexes speed up queries using equality and IN operators. They make insert and update operation speed slightly slower. Indexes use memory and take up more space in the realm file. Each index entry is a minimum of 12 bytes. It's best to only add indexes when optimizing the read performance for specific situations.

Realm supports indexing for string, integer, boolean, Date, UUID, ObjectId, and AnyRealmValue properties.

New in version 10.8.0: UUID and AnyRealmValue types

To index a property, declare the property with indexed:true on the @Persisted notation.

class Book: Object {    @Persisted var priceCents = 0    @Persisted(indexed: true) var title = ""}

To index a property, override +[RLMObject indexedProperties] and return a list of indexed property names.

@interface Book : RLMObject@property int priceCents;@property NSString *title;@end@implementation Book+ (NSArray *)indexedProperties {    return @[@"title"];}@end

To index a property, override Object.indexedProperties() and return a list of indexed property names.

class Book: Object {    @objc dynamic var priceCents = 0    @objc dynamic var title = ""        override static func indexedProperties() -> [String] {        return ["title"]    }}

Ignored properties behave exactly like normal properties. They can't be used in queries and won't trigger Realm notifications. You can still observe them using KVO.

Tip

Realm automatically ignores read-only properties.

Deprecated since version 10.10.0: ignoredProperties()

If you don't want to save a field in your model to its realm, leave the @Persisted notation off the property attribute.

Additionally, if you mix @Persisted and @objc dynamic property declarations within a class, the @objc dynamic properties will be ignored.

class Person: Object {                var tmpId = 0        @Persisted var firstName = ""    @Persisted var lastName = ""        var name: String {        return "\(firstName) \(lastName)"    }                    @objc dynamic var email = ""}

If you don't want to save a field in your model to its realm, override +[RLMObject ignoredProperties] and return a list of ignored property names.

@interface Person : RLMObject@property NSInteger tmpId;@property (readonly) NSString *name; @property NSString *firstName;@property NSString *lastName;@end@implementation Person+ (NSArray *)ignoredProperties {    return @[@"tmpId"];}- (NSString *)name {    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];}@end

If you don't want to save a field in your model to its realm, override Object.ignoredProperties() and return a list of ignored property names.

class Person: Object {    @objc dynamic var tmpId = 0    @objc dynamic var firstName = ""    @objc dynamic var lastName = ""        var name: String {        return "\(firstName) \(lastName)"    }        override static func ignoredProperties() -> [String] {        return ["tmpId"]    }}

Changed in version 10.10.0: Protocol is now PersistableEnum rather than RealmEnum.

You can use enums with @Persisted by marking them as complying with the PersistableEnum protocol. A PersistableEnum can be any RawRepresentable enum whose raw type is a type that Realm supports.

enum TaskStatusEnum: String, PersistableEnum {    case notStarted    case inProgress    case complete}class Task: Object {    @Persisted var name: String = ""    @Persisted var owner: String?        @Persisted var status = TaskStatusEnum.notStarted         @Persisted var optionalTaskStatusEnumProperty: TaskStatusEnum? }

Realm supports only Int-backed @objc enums.

@objc enum TaskStatusEnum: Int, RealmEnum {    case notStarted = 1    case inProgress = 2    case complete = 3}class Task: Object {    @objc dynamic var name: String = ""    @objc dynamic var owner: String?        @objc dynamic var status = TaskStatusEnum.notStarted         let optionalTaskStatusEnumProperty = RealmProperty<TaskStatusEnum?>() }

New in version 10.33.0.

You can map the public name of a property in your object model to a different private name to store in the realm. You might want to do this if your Device Sync schema property names use snake case, for example, while your project uses Swift-idiomatic camel case.

Declare the name you want to use in your project as the @Persisted property on the object model. Then, pass a dictionary containing the public and private values for the property names via the propertiesMapping() function.

In this example, firstName is the public property name we use in the code throughout the project to perform CRUD operations. Using the propertiesMapping() function, we map that to store values using the private property name first_name in the realm. If we write to a synced realm, the Sync schema sees the values stored using the private property name first_name.

class Person: Object {    @Persisted var firstName = ""    @Persisted var lastName = ""        override class public func propertiesMapping() -> [String: String] {        ["firstName": "first_name",         "lastName": "last_name"]    }}

The examples in this section use a simple data set. The two Realm object types are Person and an embedded object Address. A Person has a first and last name, an optional Address, and a list of friends consisting of other Person objects. An Address has a city and country.

See the schema for these two classes, Person and Address, below:

class Person: Object {    @Persisted var firstName = ""    @Persisted var lastName = ""    @Persisted var address: Address?    @Persisted var friends = List<Person>()}class Address: EmbeddedObject {    @Persisted var city: String = ""    @Persisted var country = ""}

New in version 10.21.0.

Define a class projection by creating a class of type Projection. Specify the Object or EmbeddedObject base whose properties you want to use in the class projection. Use the @Projected property wrapper to declare a property that you want to project from a @Persisted property on the base object.

class PersonProjection: Projection<Person> {    @Projected(\Person.firstName) var firstName     @Projected(\Person.address?.city) var homeCity     @Projected(\Person.friends.projectTo.firstName) var firstFriendsName: ProjectedCollection<String> }

When you define a class projection, you can transform the original @Persisted property in several ways:

New in version 10.29.0.

If your app uses Flexible Sync, you can use Data Ingest to sync an object unidirectionally from your device to the database linked to your Atlas App Services App. Define an asymmetric object by inheriting from AsymmetricObject.

class WeatherSensor: AsymmetricObject {    @Persisted(primaryKey: true) var _id: ObjectId    @Persisted var deviceId: String    @Persisted var temperatureInFahrenheit: Float    @Persisted var barometricPressureInHg: Float    @Persisted var windSpeedInMph: Int}

Changed in version 10.42.4: Asymmetric objects can link to non-embedded objects.

AsymmetricObject broadly supports the same property types as Object, with a few exceptions:

You cannot link to an AsymmetricObject from within an Object. Doing so throws an error.

Asymmetric objects do not function in the same way as other Realm Objects. You cannot:

You can only create an Asymmetric object, which then syncs unidirectionally to the Atlas database linked to your App with Device Sync.

For more information, see: Create an Asymmetric Object.

New in version 10.51.0.

Starting in SDK version 10.51.0, you can store collections of mixed data within a AnyRealmValue property. You can use this feature to model complex data structures, such as JSON or MongoDB documents, without having to define a strict data model.

Unstructured data is data that doesn't easily conform to an expected schema, making it difficult or impractical to model to individual data classes. For example, your app might have highly variable data or dynamic data whose structure is unknown at runtime.

Storing collections in a mixed property offers flexibility without sacrificing functionality, including performant synchronization when using Device Sync. And you can work with them the same way you would a non-mixed collection:

However, storing data in mixed collections is less performant than using a structured schema or serializing JSON blobs into a single string property.

To model unstructured data in your app, define the appropriate properties in your schema as AnyRealmValue types. You can then set these AnyRealmValue properties as a list or a dictionary collection of AnyRealmValue elements. Note that AnyRealmValue cannot represent a MutableSet or an embedded object.

Tip

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4