核心数据查找其他用户(获取结果控制器)并添加他们



你好,我知道这个问题肯定有很多答案,但找不到和我一样的问题,所以…

它看起来很复杂,但实际上问题很简单。所以,让我从一些照片和代码开始,然后解释我的问题(我敢肯定,对于那些擅长核心数据的人来说,这是一个非常简单的问题)。

  1. 添加好友VC外观如下:

Image_2

图像_3

  1. 好友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中看到的那样,它正在工作并在应用程序上查找其他用户,但现在当试图将这些用户提取到一个名为收藏夹不起作用。

  1. 继续第二个代码,仍然在添加好友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];
    
  2. 客户基础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都放在那里

  1. 故障日志原因:

    -[Account addAccountBaseObject:]: unrecognized selector sent to instance0x7fab1062f6d0

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];
}

favoAccount,因此发生了崩溃。由于我不知道你的数据模型的细节,很难说你应该在这里做什么。也许类似于:

for (AccountBase *acc in theAccounts) 
{
[favorites addAccountBaseObject:acc];
}

就像你似乎在把账户添加到收藏夹对象中一样(直觉上,这似乎是错误的——尽管只要关系是相反的,我想这并不重要)。

还有一件事——如果你发布一个更短的问题并将其格式化得更干净,你会更快地得到答案——你不需要filter方法的图像或代码列表。人们很懒,不喜欢读长问答。

另外,"Account"的类名是AccountBase似乎很奇怪,不确定那里发生了什么——我想你稍后会在这个方法中保存上下文。

最新更新