Хранение UUID в базовых данных - PullRequest
5 голосов
/ 22 марта 2011

Каков наилучший метод для хранения UUID (для глобальной идентификации мультисистемных объектов) в Базовых данных? С учетом размера хранилища и возможностей индексации.

В идеале это будет храниться в виде двоичных данных (в 128-битном формате), но есть ли какие-либо непосредственные проблемы с этим? Было бы более эффективно хранить его таким образом, а не в виде строки NSString, но я просто хочу убедиться, что нет проблем с производительностью при хранении этого в виде двоичных данных. Будет ли он по-прежнему правильно индексироваться как двоичные данные? Есть ли какие-либо недостатки в хранении двоичных данных с фиксированной шириной в поле переменной ширины?

Я не слишком знаком с SQLite и его механизмами хранения / индексирования, поэтому хотел бы обратиться за советом!

Ответы [ 3 ]

10 голосов
/ 15 августа 2017

Начиная с iOS 11, вы можете установить атрибут UUID непосредственно в редакторе Core Data.UUID будет сохранен как двоичный файл автоматически.

enter image description here

Затем вы можете получить объекты базовых данных, используя UUID (в Obj-C, NSUUID).

static func fetch(with identifier: UUID) -> AudioRecord? {
    var record: AudioRecord?
    moc.performAndWait {
        let fetchRequest = AudioRecord.request
        fetchRequest.predicate = NSPredicate(format: "identifier == %@", identifier as CVarArg)
        fetchRequest.fetchLimit = 1
        record = (try? fetchRequest.execute())?.first
    }
    return record
}
3 голосов
/ 22 марта 2011

Сколько из них вы планируете хранить?Хранение их в виде двоичных данных экономит около 50% - примерно 20 байтов в виде двоичных данных против примерно 40 байтов в виде строки.Итак, вы говорите о сохранении целых 20 КБ на тысячу UUID, что не так уж и много, чтобы я в любом случае беспокоился об этом.Однако, если вы действительно хотите сохранить их как двоичные данные, вы можете сделать это, сохранив их как объекты NSData.

0 голосов
/ 16 ноября 2016

Я храню свой UUID как «Transformable», и он работает хорошо.

  1. Добавьте это к вашему NSManagedObject подклассу: @NSManaged var uuid: NSUUID!

  2. в вашей базовой модели данных (файл .xcdatamodel) создайте атрибут с именем uuid с типом Transformable

Запросы тоже хорошо работают, я пишу свои предикаты для поиска по ним так:

request.predicate = NSPredicate(format: "uuid == %@", withUuid)

...