Подтвердить что ты не робот

Хранить NSArray в образце кода основных данных?

Я искал некоторый пример кода о том, как хранить NSArray в Core Data в течение некоторого времени, но не имел никакой удачи. Может ли кто-нибудь уметь указывать мне какой-то учебник или пример, или еще лучше написать простой пример в качестве ответа на этот вопрос? Я прочитал этот, но в нем не показан пример того, как реализовать трансформируемый атрибут NSArray. Спасибо заранее!

4b9b3361

Ответ 1

Если вам действительно нужно это сделать, тогда кодируйте как данные. Я просто создал новую запись под названием receive как NSData (двоичные данные).

Затем в реализации NSManagedObject:

-(void)setReceiveList:(NSArray*)list{
     self.receive = [NSKeyedArchiver archivedDataWithRootObject:list];
}

-(NSArray*)getReceiveList{
    return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive];
}

Ответ 2

Трансформируемые атрибуты - это правильный способ сохранить в противном случае значения неподдерживаемых объектов в Core Data (например, NSArray). Из Руководство по программированию основных данных: нестандартные постоянные атрибуты:

Идея трансформационных атрибутов заключается в том, что вы обращаетесь к атрибуту как к нестандартному типу, но за кулисами Core Data использует экземпляр NSValueTransformer для преобразования атрибута в экземпляр NSData и из него. Затем Core Data хранит экземпляр данных в постоянном хранилище.

Трансформируемый атрибут использует NSValueTransformer для хранения в противном случае неподдерживаемого объекта в постоянном хранилище. Это позволяет Core Data хранить практически все, что может быть представлено как NSData, что может быть очень полезным. К сожалению, трансформируемые атрибуты не могут быть сопоставлены в предикате или использоваться для сортировки результатов с помощью NSSQLiteStoreType. Это означает, что преобразуемые атрибуты полезны только для хранения, а не для обнаружения объектов.

Трансформатор по умолчанию позволяет сохранить любой объект, поддерживающий NSCoding (или NSSecureCoding) в качестве преобразуемого атрибута. Это включает в себя NSArray, UIColor, UIImage, NSURL, CLLocation и многие другие. Это не рекомендуется использовать для данных, которые могут быть сколь угодно большими, поскольку это может оказать значительное влияние на производительность при запросе хранилища. Изображения, например, плохо подходят для трансформируемых атрибутов - это большие мешки с байтами, которые фрагментируют хранилище. В этом случае лучше использовать возможности хранения внешних записей Core Data или хранить данные отдельно в виде файла и сохранять URL-адрес файла в Core Data. Если вы должны сохранить UIImage в базовых данных, убедитесь, что знаете, какие комманды используются.

Создание трансформируемого атрибута легко:

• В редакторе модели данных основного кода Xcode выберите атрибут модели, который вы хотите изменить. В инспекторе правой стороны установите тип атрибута как "Transformable". Вы можете оставить поле "Имя" пустым, чтобы использовать трансформатор по умолчанию. Если вы использовали собственный трансформатор, вы должны ввести здесь имя класса и зарегистрировать класс, используя +[NSValueTransformer setValueTransformer:forName:] где-то в вашем коде.

Core Data Model Editor Transformable Attribute

• В заголовке подкласса NSManagedObject объявите свойство, которое описывает преобразованный атрибут с правильным типом. В этом случае мы используем NSArray:

@property (nonatomic, retain) NSArray *transformedArray;

• В файле реализации подкласса NSManagedObject свойство должно быть динамическим:

@dynamic transformedArray;

И все готово. Когда объект значения NSArray передается в setTransformedArray:, этот массив сохраняется объектом. Когда контекст будет сохранен, Core Data преобразует NSArray в NSData с помощью NSValueTransformer, описанного в модели. Байты NSData будут сохранены в постоянном хранилище.

Ответ 3

Вы не храните NSArray из исходных данных. Вам нужно преобразовать значения, хранящиеся в массиве, в то, что может использоваться Core Data, а затем сохранить данные в хранилище, чтобы вы могли нажать и потянуть его на NSArray по мере необходимости.

Ответ 4

Ответ Филиппа прав. Вы не храните массивы в Core Data. Это полностью против того, для чего сделаны основные данные. Большую часть времени вам не нужна информация о массиве, а одна, а другая - динамическая загрузка Core Data. В случае с коллекциями не имеет значения, если вы перебираете массив любых ваших свойств или массива извлеченных результатов на NSSet (который в основном представляет собой массив).

Вот объяснение, сказанное Филиппом. Вы не можете хранить массив напрямую, но вы можете создать список свойств из него. Существует метод во всех NS-массивах, который дает вам приятные и чистые строки и строки данных. Холодная вещь о списках свойств, хранящихся в виде строк, - они могут стать тем, кем они были. Для метода NSString существует метод. Tataaa...

Конечно, есть цена. Массивы как списки свойств могут стать гигантскими, и это не очень хорошо работает с устройствами iOS, где оперативная память ограничена. Попытка сохранить массив в основные данные указывает на плохой дизайн объекта, особенно для больших данных. Небольшой массив в порядке по причинам скорости.

Другим, менее затратным пространством является использование бинарных списков свойств. Они приближаются к размерам zip при хранении в Core Data или непосредственно в файловой системе. Недостатком является то, что вы не можете просто открывать и читать их, как файл XML или JSON. Для разработки я предпочитаю читать что-то человеческое и выпускать двоичную версию. Постоянная привязка к значению DEBUG в препроцессоре позаботится об этом, поэтому мне не нужно менять код.

Ответ 5

Core Data хранит экземпляры NSManagedObject или их подклассов. Сам NSManagedObject очень похож на словарь. Множественные отношения между объектами представлены как множества. У Core Data нет упорядоченного списка, который бы соответствовал массиву. Вместо этого, когда вы извлекаете объекты из хранилища Core Data, вы используете запрос на выборку. Этот запрос выборки может указывать один или несколько дескрипторов сортировки, которые используются для сортировки объектов, а объекты, возвращаемые запросом выборки, сохраняются в массиве.

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