Есть ли способ получить доступ к свойствам объекта x-coredata: //, возвращенного из NSFetchRequest? - PullRequest
0 голосов
/ 11 января 2019

TL; DR: есть ли способ программно читать / вызывать (НЕ записывать!) Экземпляр сущности Core Data, используя «серийный номер» с p-номером, который привязан к x-coredata экземпляра: // идентификатор? Это хорошая / плохая идея?

Я использую метод, подобный следующему, для извлечения экземпляров сущности, вызванной из хранилища основных данных:

var managedContext: NSManagedObjectContext!

let fetchRequest : NSFetchRequest<TrackInfo> = TrackInfo.fetchRequest()
        fetchResults = try! managedContext.fetch(fetchRequest)
        for (i, _) in Global.Vars.numberOfTrackButtons! {


        let workingTrackInfo = fetchResults.randomElement()!
        print("current track is: \(workingTrackInfo)")

Список треков возвращается в fetchResults в виде массива, и я могу выбрать один из них случайным образом (fetchResults.randomElement()). Оттуда я могу изучить детали этого одного элемента, приведя его к строке и отобразив его в консоли (оператор print). Я не перечисляю код ниже, но, используя workingTrackInfo, я могу видеть этот экземпляр, читать его свойства в других переменных и т. Д.

В консоли iOS / Xcode перечисляет выбранный элемент следующим образом:

current track is: <MyProjectName.TrackInfo: 0x60000374c2d0> (entity:
TrackInfo; id: 0xa7dc809ab862d89d 
<x-coredata://2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7/TrackInfo/p22>; 
data: <fault>)

Строка, начинающаяся с x-coredata:, привлекла мое внимание. Он отформатирован как URL-адрес, состоящий из того, что, как я полагаю, является UUID для конкретного хранилища базовых данных, связанного с текущей сборкой приложения (т. Е. Не является стабильным адресом, который вы могли бы жестко закодировать; вам нужно программно искать базовые данные хранить, аналогично функциям, которые мы используем для программного поиска папки документов, пакета приложений и т. д.) Третий элемент - это имя объекта в моей модели базовых данных - достаточно просто.

Но этот последний номер - то, что мне интересно. Из проверки базы данных SQLite, связанной с этим хранилищем данных, она выглядит как «серийный номер экземпляра», связанный с полем Z_PK в модели данных.

Я Я НЕ заинтересован в попытке обойти обычные механизмы Core Data для изменения содержимого управляемого объекта. Яблоко очень ясно о том, что это плохая идея.

Что Я ЕСМЬ интересует, так это то, можно ли адресовать конкретный экземпляр Базовых данных, используя этот "серийный номер". **

В моем приложении, где я случайным образом выбираю один трек из сотен или даже тысяч треков, мне было бы интересно, среди прочего, возможность выбрать один трек на основе этого p-number serial, где я просто запрашиваю отдельный экземпляр, генерируя случайный p-number, прикрепляя его к выражению x-coredata: //, отформатированному так, как указано выше, и загружая результат (только для чтения) основе!) в переменную для дальнейшего использования в другом месте приложения.

В целях тестирования я попытался просто жестко кодировать x-coredata://2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7/TrackInfo/p22 в качестве URL-адреса, но XCode, похоже, не нравится. Есть ли какой-либо другой тип данных (например, NSManagedObject?), Который позволяет вам установить x-coredata: // "URL" в качестве его содержимого?

ВОПРОСЫ: Кто-нибудь делал что-нибудь подобное; есть ли какие-то соображения по поводу памяти / потоков, почему захват имен экземпляров таким способом является плохой идеей (я нуб из iOS / Core Data, так что я не знаю, чего не знаю; пожалуйста, позабавьте меня!); какой будет синтаксис / метод для этих типов операторов?

Спасибо!

1 Ответ

0 голосов
/ 11 января 2019

Вы совсем близко.

x-coredata: // 2B5DDCDB-0F2C-4CDF-A7B9-D4C43785FDE7 / TrackInfo / p22

- это uriRepresentation() NSManagedObjectID записи.

Вы получаете этот URL от NSManagedObject с

let workingTrackInfo = fetchResults.randomElement()!
let objectIDURL = workingTrackInfo.objectID.uriRepresentation()

С помощью этого URL вы можете получить идентификатор управляемого объекта из NSPersistentStoreCoordinator и координатора из контекста управляемого объекта.
Затем вызовите object(with: в контексте, чтобы получить объект.

let persistentStoreCoordinator = managedContext.persistentStoreCoordinator!
if let objectID = persistentStoreCoordinator.managedObjectID(forURIRepresentation: objectIDURL) {
    let object = managedContext.object(with: objectID) as! TrackInfo
    print(object)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...