Ответ 1
(Отказ от ответственности: я работаю в Realm.)
Оп! Установка первичного ключа в Realm не является обязательной или необходимой, поэтому она полностью зависит от разработчика и требований приложения, чтобы определить, нужно ли это или нет в их реализации.
В ответ на ваши вопросы:
1) Нет значений по умолчанию; вы указываете одно из ваших собственных свойств в качестве первичного ключа. primaryKey
возвращает значение nil по умолчанию, поскольку вам нужно переопределить это самостоятельно, чтобы указать Realm, какое свойство вы хотите выполнять как первичный ключ. Некоторые пользователи задают целые числа в качестве первичных ключей, но чаще всего, использование строки UUID является наиболее распространенным.
2) Нет неявного первичного ключа. Вы должны использовать метод [RLMObject primaryKey]
, чтобы явно указать, какое свойство является первичным ключом, и THEN оно будет проиндексировано.:)
3) В моем собственном (свободном времени) опыте разработки я обычно обнаруживаю, что первичный ключ значительно облегчает идентификацию и обработку определенных объектов. Например, если вы передаете объект по потокам, вы можете просто передать значение первичного ключа и использовать [RLMObject objectForPrimaryKey:]
для восстановления объекта. Очевидно, это зависит от ваших собственных требований к реализации. Вероятно, вам не следует добавлять первичный ключ, если вы не узнаете, что вам действительно нужен он.
В качестве примера, вот что вы добавили бы в ваш подкласс RLMObject, если бы вы хотели установить строку UUID в качестве первичного ключа:
@interface MyObject : RLMObject
@property NSString *uuid;
@end
@implementation MyObject
+ (NSString *)primaryKey
{
return @"uuid";
}
+ (NSDictionary *)defaultPropertyValues
{
@{@"uuid": [[NSUUID UUID] UUIDString]};
}
@end
Я надеюсь, что это помогло!
Добавление > . Чтобы подробнее остановиться на некоторых комментариях, приведенных ниже, первичные ключи явно необходимы для любых Realm API, которые изменяют их функциональность в зависимости от того, существует ли объект с тем же ключом уже в базе данных. Например, +[RLMObject createOrUpdateInRealm:]
добавит новый объект Realm в базу данных, если объект с этим основным ключом еще не существует и будет просто обновлять существующий объект в противном случае.
Таким образом, в этих случаях, когда первичный ключ является критическим компонентом последующей логики, они необходимы. Однако, поскольку эти API-интерфейсы являются подмножеством различных способов добавления/обновления данных в Realm, если вы решили не использовать их, вы все равно не должны иметь первичный ключ.