2009-10-22 1 views
4

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

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

Я столкнулся с созданием объекта «ImageBlob» для хранения данных изображения и использования отношений для этого, но я новичок с базовыми данными, и мне не сразу кажется, что это правильный способ идти. В частности, как я могу справиться со следующими ситуациями?

  • Я хочу, чтобы все мои изображения атрибуты нескольких объектов, чтобы использовать один и тот же «хранилище данных изображения», так что только один экземпляр каждого сгустка изображения хранится
  • мне нужно убедиться, что если объекты не используя изображение в хранилище данных, которое оно удалено

Что было бы лучшим способом справиться с этим?

ответ

2

Мой первый вопрос: как вы планируете идентифицировать, когда два объекта используют одно и то же изображение? Есть ли свойство на изображении, которое вы можете сохранить и запросить, чтобы определить, существует ли уже установленное изображение? И насколько это дорого, вычислительно? Если это занимает много времени, вы можете в конечном итоге оптимизировать для хранения и воздействия производительности.

Однако, если у вас есть способ сделать это эффективно, вы можете создать объект ImageBlob, чтобы делать то, что вы описываете. Предприятие, которое использует ImageBlob s, должно иметь отношение imageBlob или imageBlobs с ImageBlob. ImageBlob должен иметь обратную связь с таким именем, как, например, users.

В вашем коде, если вы хотите повторно использовать ImageBlob, это так же просто, как сделать что-то вроде этого:

NSManagedObject *blob = // get the image blob 
NSManagedObject *user = // get the user 
[user setValue:blob forKey:@"imageBlob"]; // do this if it uses a single image 
[[user mutableSetValueForKey:@"imageBlobs"] addObject:blob]; // do this if it uses multiple images 

Еще одно соображение вы хотите, чтобы думать о том, что делать с сгустки, которые не более необходимо. Предположительно, вы хотите удалить любые изображения, которые не используются. Для этого вы можете зарегистрировать делегата приложения или NSPersistentDocument подкласс (в зависимости от того, является ли ваше приложение основанным на документе или нет) для уведомления NSManagedObjectContextObjectsDidChangeNotification. Всякий раз, когда меняется контекст управляемого объекта, вы можете удалить все ненужные изображения, как это:

- (void)managedObjectContextObjectsDidSave:(NSNotification *)notification { 
    NSManagedObjectContext *managedObjectContext = [notification object]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntity entityWithName:@"ImageBlob" inManagedObjectContext:managedObjectContext]]; 
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 0"]; 
    NSArray *unusedBlobs = [managedObjectContext executeFetchRequest:fetchRequest error:nil]; // Don't be stupid like me; catch and handle the error 
    [fetchRequest release]; 

    for (NSManagedObject *blob in unusedBlobs) { 
     [managedObjectContext deleteObject:blob]; 
    } 
} 
+0

Спасибо, это полезное предложение. Это не полное решение, но я принимаю ответ. –

1

Вы можете добавить уникальное свойство md5 к Image Entity, чтобы убедиться, что вы только хранить одни и те же изображения, один раз.

Что касается данных Core Data, я думаю, что что-то вроде этого может работать: Затем создайте абстрактный родительский объект (Parent). Добавьте связь от Parent до Image под названием image и установите «Каскад» для метода удаления, чтобы при удалении Parent, Image также удаляется.Добавьте связь от Image к Parent под названием parent или что угодно, и установите «Nullify» для метода удаления, чтобы при удалении Image для Parent установлено значение nil. Затем добавьте ваши другие объекты и установите их родительский номер Parent.