2015-08-24 3 views
1

У меня есть приложение, которое позволяет пользователям загружать изображения с веб-сайта. (Контрольный список сборщика игрушек 2 - https://itunes.apple.com/us/app/toy-collector-checklist-2/id919363870?mt=8)Удаление двоичных данных из Core Data iOS 8

Пользователь может теоретически загружать тысячи изображений, создавая довольно большой рабочий свиньи. Я пытаюсь добавить «Удалить все изображения», чтобы пользователь мог очистить изображения без удаления приложения.

Код, похоже, работает. Изображения больше не видны при нажатии кнопки, и значение основных данных возвращает «nil», когда я его проверю, но когда я перехожу к моим настройкам использования, пространство, похоже, не освобождается. Я использую то, что я хотел бы рассмотреть довольно стандартный закачает и обновления кода:

CoreDataHelper *cdh = 
[(AppDelegate *)[[UIApplication sharedApplication] delegate] cdh]; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription 
           entityForName:@"Item" 
           inManagedObjectContext:cdh.context]; 
[fetchRequest setEntity:entity]; 
// [fetchRequest setPredicate:nil]; 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"photo != nil OR photoAlt != nil OR photoCam != nil"]]; 
[fetchRequest setFetchBatchSize:500]; 
NSManagedObject *removePhotoFromObject; 
NSError *error = nil; 
NSArray *results = [cdh.context executeFetchRequest:fetchRequest error:&error]; 
for (removePhotoFromObject in results) { 
    [removePhotoFromObject setValue:nil forKey:@"photoCam"]; 
    [removePhotoFromObject setValue:nil forKey:@"photo"]; 
    [removePhotoFromObject setValue:nil forKey:@"photoAlt"]; 
    [removePhotoFromObject setValue:nil forKey:@"thumbnail"]; 



} 
[cdh backgroundSaveContext]; 

Это устанавливает значение возможных местоположений фото к нулю. Если я снова запустил тот же код, он не добавит их в массив (потому что их значения теперь равны нулю), поэтому я знаю, что эта часть работает. И изображения и миниатюры удаляются. Но при проверке на вкладке «Настройки» использование данных не меняется.

Что-то, что может быть пачкая выработок:

товара является юридическим лицом. фото, photoAlt и photoCam ТАКЖЕ, каждая сущность, с отношением «В один» с пунктом

Все они относятся к категории «Двоичные данные» в модели.

Любые мысли и предложения были бы весьма благодарны. Я смотрел на этих форумах, а также на большие сети, но до сих пор не смог найти решение.

Zack

ответ

1

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

NSArray *results = [cdh.context executeFetchRequest:fetchRequest error:&error]; 
for (removePhotoFromObject in results) { 
    if (removePhotoFromObject.photoCam) [cdh.context deleteObject:removePhotoFromObject.photoCam]; 
    if (removePhotoFromObject.photo) [cdh.context deleteObject:removePhotoFromObject.photo]; 
    if (removePhotoFromObject.photoAlt) [cdh.context deleteObject:removePhotoFromObject.photoAlt]; 
    if (removePhotoFromObject.thumbnail) [cdh.context deleteObject:removePhotoFromObject.thumbnail]; 
} 

Это должно удалить объекты из базы данных (при сохранении контекста), хотя отмечают, что это не может привести к немедленному сокращению хранения используется. От CoreData Programming Guide:

Простое удаление записи из хранилища SQLite не обязательно приводит к уменьшению размера файла. Если для удаления страницы в файл базы данных удалено достаточно элементов, автоматическая очистка базы данных SQLite уменьшит размер файла, поскольку он переупорядочивает данные для удаления этой страницы. Аналогично, размер файла может быть уменьшен, если вы удалите элемент, который сам занимает несколько страниц (например, уменьшенное изображение).

+0

Думаю, что было! Мне пришлось сделать еще одну модификацию - вместо NSManagedObject * removePhotoFromObject я использовал Item * removePhotoFromObject, поскольку Item - это мой пользовательский NSManagedObject, и это единственный способ получить «.». нотация для правильной работы. Спасибо за совет! –

Смежные вопросы