你好,我知道这个问题在这里有很多答案,但是我找不到任何与我有同样问题的答案......
它看起来非常复杂但实际上它(问题)非常简单。所以,让我先从一些照片和代码开始,然后解释我的问题(对于那些对Core-Data有好处的人,我非常肯定这是一个非常简单的问题)。
- (无效)过滤:(NSString的)文本* {
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];
Account Base VC:
那里的一些代码是:
- (void)addFavoriteObject:(Favorites *)value;
- (void)removeFavoriteObject:(Favorites *)value;
- (void)addFavorite:(NSSet *)values;
- (void)removeFavorites:(NSSet *)values;
那么我们在这里得到了什么?
第一个表视图,在我的应用程序中查找存储在实体名称帐户中的用户使用核心数据然后尝试将此用户添加到新实体名称收藏夹与第一个名为Account的实体有多对多关系, - 问题?
似乎无法理解如何以正确的方式使用关系,并使用获取控制器委托方法以正确的方式知道哪些用户添加了另一个用户。
换句话说,我只想将用户添加到我的应用程序功能,就像所有全球知名应用程序一样。 只需搜索并添加我在这里尝试使用" NSset"但是我似乎无法理解我的应用程序一直在反复尝试崩溃。
你如何基本上将你的用户提取到名为“收藏夹”的新实体,然后将所有用户放在那里收藏的朋友们,因为你知道它的唯一收藏夹是他的,而不是一个不同的用户
崩溃日志原因:
-[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 exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010dc73bb7 objc_exception_throw + 45 2 CoreFoundation 0x000000010e0c1d1d - [NSObject(NSObject)doesNotRecognizeSelector:] + 205 3 CoreFoundation 0x000000010e0199dc ___ forwarding _ + 988 4 CoreFoundation 0x000000010e019578 _CF_forwarding_prep_0 + 120 5 FavoritesTest 0x000000010a9541bf - [FilterDemoTableViewController addfavorite] + 1695 6 UIKit 0x000000010c286a22 - [UIApplication sendAction:to:from:forEvent:] + 75 7 FavoritesTest 0x000000010a9d09f2 - [SCLAlertView buttonTapped:] + 546 8 UIKit 0x000000010c286a22 - [UIApplication sendAction:to:from:forEvent:] + 75 9 UIKit 0x000000010c38de50 - [UIControl _sendActionsForEvents:withEvent:] + 467 10 UIKit 0x000000010c38d21f - [UIControl touchesEnded:withEvent:] + 522 11 UIKit 0x000000010c634e80 _UIGestureRecognizerUpdate + 9487 12 UIKit 0x000000010c2cc856 - [UIWindow _sendGesturesForEvent:] + 1041 13 UIKit 0x000000010c2cd483 - [UIWindow sendEvent:] + 667 14 UIKit 0x000000010c299fb1 - [UIApplication sendEvent:] + 246 15 UIKit 0x000000010c2a7227 _UIApplicationHandleEventFromQueueEvent + 17700 16 UIKit 0x000000010c28223c _UIApplicationHandleEventQueue + 2066 17 CoreFoundation 0x000000010dfefc91 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION + 17 18 CoreFoundation 0x000000010dfe5b5d __CFRunLoopDoSources0 + 269 19 CoreFoundation 0x000000010dfe5194 __CFRunLoopRun + 868 20 CoreFoundation 0x000000010dfe4bc6 CFRunLoopRunSpecific + 470 21 GraphicsServices 0x000000010f9f3a58 GSEventRunModal + 161 22 UIKit 0x000000010c285580 UIApplicationMain + 1282 23 FavoritesTest 0x000000010a95bb73 main + 115 24 libdyld.dylib 0x000000010f615145 start + 1 25 ??? 0x0000000000000003 0x0 + 3 ) libc ++ abi.dylib:以NSException类型的未捕获异常终止
答案 0 :(得分:0)
在第[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];
}
因为您似乎将帐户添加到收藏夹对象(这似乎是错误的方式,直观地 - 虽然只要关系有反转我猜它并不重要)。
还有一件事 - 如果你发布一个较短的问题并将其格式化得更干净,你会得到更快的答案 - 你不需要过滤方法的图像或代码清单。人们很懒,不喜欢读长篇。
“帐户”的班级名称是AccountBase
似乎很奇怪,不知道那里发生了什么 - 我猜你以后会在这个方法中保存你的上下文。