【问题标题】:fetchresultscontroller issue or managed object context?fetchresultscontroller 问题或托管对象上下文?
【发布时间】:2011-04-10 23:33:40
【问题描述】:

参考 POST:

Core Data - Basic Questions

我能够从这段代码中获取托管对象上下文。它让我想到另一个问题。我有 2 个视图控制器和 1 个 NSObject

  1. 用户查找 (VC)
  2. 用户查找设置(VC)
  3. FetchProcessor (NSObject)

按顺序,Userlookup vc 首先加载,并有一个按钮来加载 Userlookupsettings VC + 一个文本框和 UiButton。当应用程序加载并我点击 SETTINGS uibutton 时,一切正常......但是,当我进行搜索(FetchProcessor)然后加载设置时,它给了我错误(请在下面检查)


 if (![[managedObject managedObjectContext] save:&error]) {
        NSLog(@"Unresolved error %@, %@, %@", error, [error userInfo],[error localizedDescription]);
        exit(-1);  // Fail  
    }

错误:


2010-09-11 03:10:47.148 SAPBasis[975:207] *** -[NSCFString objectID]: unrecognized selector sent to instance 0x3d5d830
2010-09-11 03:10:47.170 SAPBasis[975:207] Serious application error.  Exception was caught during Core Data change processing: *** -[NSCFString objectID]: unrecognized selector sent to instance 0x3d5d830 with userInfo (null)
2010-09-11 03:10:47.170 SAPBasis[975:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSCFString objectID]: unrecognized selector sent to instance 0x3d5d830'

编辑并添加了相关代码..

用户查找:

-(void) searchUser{
        getUserDetailsService=[[GetUserDetailsSOAPService alloc]init]; // where AbstractServiceProvider *getUserDetailsService; and @interface GetUserDetailsSOAPService : AbstractServiceProvider
        [getUserDetailsService setSettingPreference:settings];
        [settings release];
        [getUserDetailsService setDelegate:self];
        RequestDO * request = [[RequestDO alloc]init];
        request.userID=userIdInputField.text;
        [getUserDetailsService setRequestDO:request];
        [request release];
        NSManagedObjectContext *context = self.referringObject;
        [getUserDetailsService setReferringObject:context];
        [getUserDetailsService execute]; // This is the user search function.
        [getUserDetailsService release];
}

-(void) editUserLookupSettings{
    UserLookupSettings *viewVC = [[UserLookupSettings alloc] initWithNibName:@"UserLookupSettings" bundle:nil];
    viewVC.title =  @"Settings for User Lookup";
    NSManagedObjectContext *context = self.referringObject;
    viewVC.referringObject = context;
    [self.navigationController pushViewController:viewVC animated:YES];
    // Manage memory
    [viewVC release];
}

现在@implementation GetUserDetailsS​​OAPService

-(void)execute{
    TCodeSettings *fetch = [[TCodeSettings alloc] init]; // Where @interface TCodeSettings : NSObject <NSFetchedResultsControllerDelegate>
    fetch.referringObject = self.referringObject;
    resultsOfSettings = [fetch initCode]; // Code details given below. I think so is causing the error when this is called.
    [fetch release];
    self.userData = [[NSMutableDictionary alloc] init];
    self.previewData = [[NSMutableArray alloc] init];

    // Creates new Request object and sets its url
    NSString *URLReq = [self.settingPreference getSOAPPrefix];
    URLReq=[URLReq stringByAppendingString:@"Z_USERLOOKUPWS"];
    URLReq=[URLReq stringByAppendingString:[self.settingPreference getSOAPSuffix]];

    theRequest=[NSMutableURLRequest 
                requestWithURL:[NSURL URLWithString:URLReq]
                cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                timeoutInterval:30.0];

    // Setting specific SOAP headers
    // For SOAP content type is text/xml
    .
    .
    .
    [self makeReqest]; // AbstractServiceProvider we have makeRequest function and it works fine..
}

现在@interface TCodeSettings : NSObject

- (NSFetchedResultsController *)initCode{
    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Handle the error
    }else {
        return fetchedResultsController;
    }
}

现在@interface UserLookupSettings : UITableViewController

- (void)viewDidLoad {   
    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Handle the error
    }
    [super viewDidLoad];
}

【问题讨论】:

  • 您提供的代码太少,我们无法为您提供帮助。例如,您如何执行搜索?
  • 你好 Brad,这是附加信息。pastebin.com/AGiRinKX 出于某种原因,由于字符限制,我无法将其放在评论框中...
  • 您可以编辑您的问题以添加相关代码。
  • 这很简单@St3fan :) @brad,我已经相应地更新了问题..

标签: iphone core-data nsfetchedresultscontroller nsmanagedobjectcontext nsfetchrequest


【解决方案1】:

[获取用户详细信息服务 setDelegate:self];

这可能是你的问题,但在我至少看到所有相关类的标题之前,这还不确定。

此外,将 Logs 放入您的所有 Dealloc 函数中,以查看某些内容是否过早消失。

干杯

【讨论】:

    【解决方案2】:

    您的问题是,在某些时候,您将 NSManagedObject 换成了 NSString。当上下文保存时,它会将objectID 消息发送到它认为是托管对象的对象,但由于它是一个字符串对象,因此字符串对象不理解该消息。

    很可能,错误实际上是在您分配关系的自定义 NSManagedObject 子类中。您设置了一个字符串而不是托管对象。

    【讨论】:

    • 我正在阅读苹果开发网站的文档,这个问题突然出现在我的脑海中。它说当我进行提取时,会在托管对象上下文(便笺簿)上由该托管对象(模型)构建一个图形......如果我在同一上下文中使用 nsfetchresultscontroller 对同一个表进行 2 次提取然后保存第一个……这会造成问题吗?
    • 不,提取本身根本不会改变图形。在单个上下文中对对象的任何操作都会立即反映在上下文中。你的问题是你有一个字符串分配给一个应该是托管对象的变量。
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多