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

__all__ настраивает звездочку в from import *

__all__ настраивает звездочку в from import *


Модуль - это файл .py, предназначенный для импорта.

Пакет - это каталог с файлом __init__.py. Пакет обычно содержит модули.

""" cheese.py """

__all__ = ['swiss', 'cheddar']

swiss = 4.99
cheddar = 3.99
gouda = 10.99

__all__ позволяет людям знать «общедоступные» функции модуля. [ @AaronHall ] Также pydoc распознает их. [ @Longpoke ]

из модуля import *

Посмотрите, как swiss и cheddar приведены в локальное пространство имен, но не gouda:

>>> from cheese import *
>>> swiss, cheddar
(4.99, 3.99)
>>> gouda
Traceback (most recent call last):
  File "", line 1, in 
NameError: name 'gouda' is not defined

Без __all__ был бы доступен любой символ (который не начинается с подчеркивания).


Импорт без * не зависит от __all__


import module

>>> import cheese
>>> cheese.swiss, cheese.cheddar, cheese.gouda
(4.99, 3.99, 10.99)

из module import names

>>> from cheese import swiss, cheddar, gouda
>>> swiss, cheddar, gouda
(4.99, 3.99, 10.99)

import module as localname

>>> import cheese as ch
>>> ch.swiss, ch.cheddar, ch.gouda
(4.99, 3.99, 10.99)

В файле __init__.py пакета __all__ представлен список строк с именами общедоступных модулей или других объектов. Эти функции доступны для импорта подстановочных знаков. Как и в модулях, __all__ настраивает * при импорте подстановочных знаков из пакета. [ @MartinStettner ]

Вот выдержка из Python MySQL Connector __init__.py:

__all__ = [
    'MySQLConnection', 'Connect', 'custom_error_exception',

    # Some useful constants
    'FieldType', 'FieldFlag', 'ClientFlag', 'CharacterSet', 'RefreshOption',
    'HAVE_CEXT',

    # Error handling
    'Error', 'Warning',

    ...etc...

    ]

Импортировать подстановочные знаки ... следует избегать, поскольку они [путают] считыватели и многие автоматизированные инструменты.

blockquote>

[ PEP 8 , @ToolmakerSteve]

29
задан djromero 19 April 2015 в 18:11
поделиться

5 ответов

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

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

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

-(NSArray*)getReceiveList{
    return [NSKeyedUnarchiver unarchiveObjectWithData:self.receive];
}
37
ответ дан LuisEspinoza 19 April 2015 в 18:11
поделиться

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

26
ответ дан Philip Regan 19 April 2015 в 18:11
поделиться

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

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

1
ответ дан Caleb 19 April 2015 в 18:11
поделиться

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

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

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

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

8
ответ дан djromero 19 April 2015 в 18:11
поделиться

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

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

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

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

Создать преобразуемый атрибут очень просто:

• В редакторе модели данных ядра Xcode выберите атрибут модели, который вы хотите изменить. В инспекторе справа установите тип атрибута как «Трансформируемый». Вы можете оставить поле «Имя» пустым, чтобы использовать преобразователь по умолчанию. Если бы вы использовали собственный преобразователь, вы бы ввели здесь имя класса и зарегистрировали класс, используя +[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 байтов будут сохранены в постоянном хранилище.

29
ответ дан quellish 19 April 2015 в 18:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: