你好,我知道这个问题肯定有很多答案,但找不到和我一样的问题,所以…
它看起来很复杂,但实际上问题很简单。所以,让我从一些照片和代码开始,然后解释我的问题(我敢肯定,对于那些擅长核心数据的人来说,这是一个非常简单的问题)。
- 添加好友VC外观如下:
Image_2
图像_3
- 好友VC代码(通过电子邮件过滤好友)只需查找存储在"账户实体"中的其他用户:
-(无效)过滤器:(NSString)text*{
NSManagedObjectContext *context = [self managedObjectContext];
filteredTableData = [[NSMutableArray alloc] init];
// Create our fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Define the entity we are looking for
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Account" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
// Define how we want our entities to be sorted
NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc]
initWithKey:@"email" ascending:YES];
// Define how we want our entities to be filtered
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(email = %@)", text];
[fetchRequest setPredicate:predicate];
if ([sortDescriptor isEqual:user_email]) {
NSLog(@"ERORRRRRR SAME USER LOOKING FOR THE SAME USER");
}
else{
NSArray* sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
}
// If we are searching for anything...
if(text.length > 0)
{
}
NSError *error;
NSArray* loadedEntities = [context executeFetchRequest:fetchRequest error:&error];
filteredTableData = [[NSMutableArray alloc] initWithArray:loadedEntities];
loadedEntities = filteredTableData;
NSLog(@"%@",loadedEntities);
[self.tableView reloadData];
}
这里没有问题,正如你在Image_2中看到的那样,它正在工作并在应用程序上查找其他用户,但现在当试图将这些用户提取到一个名为收藏夹不起作用。
继续第二个代码,仍然在添加好友VC:
-(void)addFavorite{
///FIND OUR CORRUNET USER OF THE APP EMAIL AND FETCH IT TO THE VIEW CONTROLLER FIND FAVORITE FREINDS REQUEST... [self getemail]; NSLog(@"%@",user_email); NSManagedObjectContext *context = [self managedObjectContext]; // Create our fetch request NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; // Define the entity we are looking for NSEntityDescription *entity = [NSEntityDescription entityForName:@"Account" inManagedObjectContext:context]; [fetchRequest setEntity:entity]; // Define how we want our entities to be sorted NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"email" ascending:YES]; NSArray* sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; // Define how we want our entities to be filtered NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(email = %@)", user_email]; [fetchRequest setPredicate:predicate]; NSArray *theaccount = [context executeFetchRequest:fetchRequest error:nil]; NSLog(@"%@",theaccount); NSManagedObject *favorites = [NSEntityDescription insertNewObjectForEntityForName:@"Favorites" inManagedObjectContext:context]; filteredTableData = [[NSMutableArray alloc]init]; [favorites setValue:self.filteredFavorites forKeyPath:@"favorites"]; NSLog(@"%@",favorites); for (Favorites *favo in theaccount) { AccountBase *base = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:context]; [favo addAccountBaseObject:base]; } [self.tableView reloadData];
客户基础VC:
那里的一些代码是:
- (void)addFavoriteObject:(Favorites *)value;
- (void)removeFavoriteObject:(Favorites *)value;
- (void)addFavorite:(NSSet *)values;
- (void)removeFavorites:(NSSet *)values;
那么我们得到了什么?
第一个表视图,并使用核心数据在我的应用程序中查找存储在实体名称Account中的用户,然后尝试将该用户添加到新的实体名称收藏夹中,-问题出在哪里
似乎不明白如何以正确的方式使用关系,也不明白如何使用fetch控制器委托方法来了解哪些用户添加了另一个用户。
换句话说,我只想像所有全球知名的应用程序一样,将用户添加到我的应用程序功能中。简单地搜索并添加我试过在这里使用"NSset",但我似乎无法理解我的应用程序不断崩溃,试了又试。
你如何基本上把你的用户带到名为Favorites的新实体,然后在你知道他唯一的Favorited freinds而不是不同用户的后,把所有用户的Favorite freinds都放在那里
故障日志原因:
-[Account addAccountBaseObject:]: unrecognized selector sent to instance
0x7fab1062f6d0
2015-04-02 09:33:39.979 FavoritesTest[30386:719441]*由于未捕获异常"NSInvalidArgumentException"而终止应用程序,原因:"-[Account addAccountBaseObject:]:无法识别的选择器发送到实例0x7fab1062f6d0'"*第一次抛出调用堆栈:(0 CoreFoundation 0x000000010e0baa75异常预处理+1651 libobjc。A.dylib 0x000000010dc73bb7对象异常抛出+452 CoreFoundation 0x000000010e0c1d1d-[NSObject(NSObject)doesNotRecognizeSelector:]+2053核心基础0x000000010e019dc ___forwarding_+9884核心基础0x000000010e019578_CF_forwarding_prep_0+1205收藏夹测试0x000000010a9541bf-[FilterDemoTableViewController addfavorites]+16956 UIKit 0x000000010c286a22-[UIApplication sendAction:to:from:forEvent:]+757个收藏夹测试0x000000010a9d09f2-[SCLAlertView按钮点击:]+5468 UIKit 0x000000010c286a22-[UIApplication sendAction:to:from:forEvent:]+759 UIKit 0x000000010c38de50-[UIControl_sendActionsForEvents:withEvent:]+46710 UIKit 0x000000010c38d21f-[UIControl触摸结束:带事件:]+52211 UIKit 0x000000010c634e80 _UIGestureRecognizerUpdate+948712 UIKit 0x000000010c2cc856-[UIWindow_sendGesturesForEvent:]+104113 UIKit 0x000000010c2cd483-[UIWindow sendEvent:]+66714 UIKit 0x000000010c299fb1-[UIApplication sendEvent:]+24615 UIKit 0x000000010c2a7227 _UIApplicationHandleEventFromQueueEvent+1770016 UIKit 0x000000010c28223c_UIApplicationHandleEventQueue+206617 CoreFoundation 0x000000010dfefc91CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION+1718 CoreFoundation 0x000000010dfe5b5d __CFRunLoopDoSources0+26919 CoreFoundation 0x000000010dfe5194 __CFRunLoopRun+86820 CoreFoundation 0x000000010dfe4bc6 CFRunLoopRunSpecific+47021 GraphicsServices 0x000000010f9f3a58 GSEventRunModal+16122 UIKit 0x000000010c285580 UIApplicationMain+128223个收藏夹测试0x000000010a95bb73 main+11524 libdyld.dylib 0x000000010f615145启动+125???0x0000000000000003 0x0+3)libc++abi.dylib:以NSException 类型的未捕获异常终止
在行[favo addAccountBaseObject:base];
中,对象favo
的类型为AccountBase
,而不是Favorite
。Objective-C(与Swift不同)不提供编译时类型检查。因此,您可以非常容易地将对象分配给不正确类型的变量,而不会收到任何类型的警告或错误。
然后,在这种情况下,当您试图将对象视为您想要的类型(Favorite
)的实例时,程序会崩溃,因为它不是真正的收藏夹,也没有实现您调用的方法(addAccountBaseObject:
)。
您的提取请求是用一个帐户实体初始化的:
[NSEntityDescription entityForName:@"Account" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
然后你执行它:
NSArray *theaccount = [context executeFetchRequest:fetchRequest error:nil];
现在theAccount
填充了与谓词匹配的AccountBase
对象。顺便说一句,theAccounts
在这里是一个不那么令人困惑的名称。
然后初始化一个Favorite
对象并将其插入上下文中,并记录其值,但不执行任何其他操作。
然后是带有崩溃的for
循环:
for (Favorites *favo in theaccount)
{
AccountBase *base = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:context];
[favo addAccountBaseObject:base];
}
favo
是Account
,因此发生了崩溃。由于我不知道你的数据模型的细节,很难说你应该在这里做什么。也许类似于:
for (AccountBase *acc in theAccounts)
{
[favorites addAccountBaseObject:acc];
}
就像你似乎在把账户添加到收藏夹对象中一样(直觉上,这似乎是错误的——尽管只要关系是相反的,我想这并不重要)。
还有一件事——如果你发布一个更短的问题并将其格式化得更干净,你会更快地得到答案——你不需要filter方法的图像或代码列表。人们很懒,不喜欢读长问答。
另外,"Account"的类名是AccountBase
似乎很奇怪,不确定那里发生了什么——我想你稍后会在这个方法中保存上下文。