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

时间:2015-04-01 23:09:42

标签: ios objective-c iphone core-data many-to-many

你好,我知道这个问题在这里有很多答案,但是我找不到任何与我有同样问题的答案......

它看起来非常复杂但实际上它(问题)非常简单。所以,让我先从一些照片和代码开始,然后解释我的问题(对于那些对Core-Data有好处的人,我非常肯定这是一个非常简单的问题)。

  1. 添加好友VC看起来像这样:
  2. Image_2

    Image_3

    1. 朋友VC代码(通过电子邮件过滤朋友)只需查找存储在"帐户实体"中的其他用户:
    2. - (无效)过滤:(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中看到它正在工作并在应用程序上查找其他用户但现在在尝试将这些用户提取到名为的新实体时 收藏它不工作。

      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. Account Base VC:

      3. 那里的一些代码是:

        - (void)addFavoriteObject:(Favorites *)value;
        - (void)removeFavoriteObject:(Favorites *)value;
        - (void)addFavorite:(NSSet *)values;
        - (void)removeFavorites:(NSSet *)values;
        

        那么我们在这里得到了什么?

        第一个表视图,在我的应用程序中查找存储在实体名称帐户中的用户使用核心数据然后尝试将此用户添加到新实体名称收藏夹与第一个名为Account的实体有多对多关系, - 问题?

        似乎无法理解如何以正确的方式使用关系,并使用获取控制器委托方法以正确的方式知道哪些用户添加了另一个用户。

        换句话说,我只想将用户添加到我的应用程序功能,就像所有全球知名应用程序一样。 只需搜索并添加我在这里尝试使用" NSset"但是我似乎无法理解我的应用程序一直在反复尝试崩溃。

        你如何基本上将你的用户提取到名为“收藏夹”的新实体,然后将所有用户放在那里收藏的朋友们,因为你知道它的唯一收藏夹是他的,而不是一个不同的用户

        1. 崩溃日志原因:

          -[Account addAccountBaseObject:]: unrecognized selector sent to instance 0x7fab1062f6d0

        2. 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类型的未捕获异常终止

1 个答案:

答案 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];

}

favoAccount,因此崩溃了。由于我不知道您的数据模型的详细信息,因此很难准确地说出您应该在这里做什么。也许是这样的事情:

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

因为您似乎将帐户添加到收藏夹对象(这似乎是错误的方式,直观地 - 虽然只要关系有反转我猜它并不重要)。

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

“帐户”的班级名称是AccountBase似乎很奇怪,不知道那里发生了什么 - 我猜你以后会在这个方法中保存你的上下文。