我正在这里处理这个核心数据应用。它是一个故事应用。用户可以创建故事。现在每个故事都可以有多张图片。现在核心数据模型是这样的:
故事实体:与故事页面,故事页面实体有一对多的关系:与PictureBank有一对一的关系,PictureBank实体:包含用于存储图片的NSData *
现在,当我在故事中添加不同的图片并保存时,它运行正常。但是当我多次添加一张图片时,只会保存最后添加的图片。
例如,如果我在图片库中有pic1,pic2,pic3。我按照这个序列创建了一个故事:pic1,pic2,pic1,pic1或pic1,pic1,pic1并保存我的故事,然后只有最后存储的pic1在保存的故事中可用,其余的都没有了。长度属性返回0。
以下是我使用的代码:
- (BOOL)createAndSaveStory:(NSMutableArray *)storyPages andTitle:(NSString *)title withBGColor:(NSString *)bgColor andTheme:(NSString *)themeName isEdited:(BOOL)edited withEditedStoryObject:(Story *)storyObj
{
Story *newStory = nil;
if (edited == NO && storyObj == nil)
newStory = [NSEntityDescription insertNewObjectForEntityForName:@"Story" inManagedObjectContext:_context];
else
newStory = storyObj;
newStory.title = title;
newStory.bgcolor = bgColor;
newStory.themeName = themeName;
newStory.noofpages = [NSNumber numberWithLong:storyPages.count];
NSMutableArray *pages = [[NSMutableArray alloc] initWithCapacity:5];
for (int i = 0; i < storyPages.count; i++)
{
SSStoryPage *storyPage = [storyPages objectAtIndex:i];
if (storyPage)
{
StoryPage *page = [NSEntityDescription insertNewObjectForEntityForName:@"StoryPage" inManagedObjectContext:_context];
NSLog(@"Picture Size: %lu", (unsigned long)storyPage.storyPagePictureBank.picture.length);
page.storyPicture = storyPage.storyPagePictureBank;
NSLog(@"Picture Size: %lu", (unsigned long)page.storyPicture.picture.length);
page.storyRecording = storyPage.storyPageRecording;
page.storyText = storyPage.storyPageText;
[pages addObject:page];
page = [pages objectAtIndex:i];
NSLog(@"Picture Size: %lu", (unsigned long)page.storyPicture.picture.length);
}
}
for (StoryPage *sp in pages)
{
NSLog(@"Picture Size: %lu", (unsigned long)sp.storyPicture.picture.length);
}
newStory.pages = [[NSOrderedSet alloc] initWithArray:pages];
NSError *err = nil;
[_context save:&err];
if (!err)
return YES;
else
return NO;
}
我收到了数组storyPages中的页面。然后在for循环中逐个遍历它们,并为每个页面创建一个&#34; StoryPage&#34;实体。现在,我创建页面的第一个for循环中的所有NSLog都打印出正确的图片大小。像这样:
2015-05-25 16:02:35.617 MySocialStory[4110:795855] Picture Size: 3336172
2015-05-25 16:02:36.687 MySocialStory[4110:795855] Picture Size: 3336172
2015-05-25 16:02:38.070 MySocialStory[4110:795855] Picture Size: 3336172
2015-05-25 16:02:39.650 MySocialStory[4110:795855] Picture Size: 3336172
2015-05-25 16:02:39.949 MySocialStory[4110:795855] Picture Size: 3336172
2015-05-25 16:02:40.973 MySocialStory[4110:795855] Picture Size: 3336172
2015-05-25 16:02:42.524 MySocialStory[4110:795855] Picture Size: 3336172
2015-05-25 16:02:42.920 MySocialStory[4110:795855] Picture Size: 3336172
2015-05-25 16:02:44.203 MySocialStory[4110:795855] Picture Size: 3336172
但是在那之后我再次登录时我得到了:
2015-05-25 16:02:46.943 MySocialStory[4110:795855] Picture Size: 0
2015-05-25 16:02:47.842 MySocialStory[4110:795855] Picture Size: 0
2015-05-25 16:02:48.670 MySocialStory[4110:795855] Picture Size: 3336172
前两项是零,不见了。后来当我查看已保存的故事时,ImageView为空,最后一张图片显示了该图片。我不明白发生了什么。我在调试时注意到的另一件事是,当我检索PictureBank对象时,所有三个对象都指向相同的内存引用。请帮忙...... ???
答案 0 :(得分:0)
我得到了它的工作。问题在于图片库和故事页面之间的关系。最初我把它设置为一对一,因为我认为故事页面显然会有一张图片。但是因为在核心数据中我们也使用反向关系,反之亦然不是一对一,即图片可以在多个故事页面中。因此,我将关系更改为一对多,因为一对多关系在Xcode中放弃警告,说“设置一对多关系是一个提前设置”我切换到多对多,但是我使用它像一对多关系,忽略我的PictureBank NSManagedObject类中的NSOrderedSet属性。现在它的工作正常:)