2016-11-26 45 views
0

終止應用程序由於未捕獲的異常 「NSInvalidArgumentException」的,原因屬性=‘XXXXX’;期望的類型= NSNumber;給定類型= NSTaggedPointerString;值= 0。我不能插入與NSNumber的數據類型值到我coredata

嘗試:[此處輸入圖像的描述] [1]

[message setValue:localID forKey:@"local_id"]; 

LOCALID是類型的NSNumber

的DataModel圖像:[1]:https://i.stack.imgur.com/7WTlU.png

[self insertInLocatDB:print_data entityName:@"Message_data" withPredicate:@"receiver_id" filterWith:@"unique_id"]; 

使用這種插入CoreData:

-(void)insertInLocatDB :(NSMutableArray *)arr_msg entityName:(NSString*)name withPredicate:(NSString*)predicateText filterWith:(NSString*)filterText 
{ 
    NSEntityDescription *entitydesc=[NSEntityDescription entityForName:name inManagedObjectContext:app.context]; 
    NSFetchRequest *request=[[NSFetchRequest alloc]init]; 
    [request setEntity:entitydesc]; 
    NSInteger local_id =[self getMaxLocalId:name]; 


    for(int i=0; i<[arr_msg count]; i++) 
    { 
     [fetched_data removeAllObjects]; 
     NSPredicate *predicate =[NSPredicate predicateWithFormat:@"%@ like %@ ",predicateText,[[arr_msg objectAtIndex:i]objectForKey:predicateText]]; 
     [request setPredicate:predicate]; 
     NSError *error; 
     NSArray *matchingData=[app.context executeFetchRequest:request error:&error]; 

     local_id=local_id+1; 

     for (NSManagedObject *obj in matchingData) 
     { 
      [fetched_data addObject:[obj valueForKey:filterText]]; 
     } 
     NSString *filter=[[arr_msg objectAtIndex:i] objectForKey:filterText]; 
     if(![fetched_data containsObject:filter]) 
     { 
      NSManagedObject *message=[[NSManagedObject alloc] initWithEntity:entitydesc insertIntoManagedObjectContext:app.context]; 
      [arr_keys setArray:[[arr_msg objectAtIndex:i] allKeys]]; 
      [arr_values setArray:[[arr_msg objectAtIndex:i] allValues]]; 
      [message setValue:[NSNumber numberWithInteger:local_id] forKey:@"local_id"]; 
      for (int i=0;i<[arr_keys count];i++) 
      { 
       if([[message.entity propertiesByName] objectForKey:[arr_keys objectAtIndex:i]] != nil 
        && ([[[message.entity propertiesByName] objectForKey:[arr_keys objectAtIndex:i]] isKindOfClass:[NSAttributeDescription class]])) 
       { 
        [message setValue:[arr_values objectAtIndex:i] forKey:[arr_keys objectAtIndex:i]]; 
       } 
      } 
      [arr_keys removeAllObjects]; 
      [arr_values removeAllObjects]; 
     } 
    } 
} 
+0

你能否認罪e提供更多細節? – DeyaEldeen

+0

屬性local_id在覈心數據中具有數據類型NSNumber。我試圖生成一個local_id並將其插入CoreData – Sandhya

+0

NSInteger local_id = local_id + 1; NSNumber * localID = @(local_id); – Sandhya

回答

2

如果您有我的屏幕截圖中顯示的核心數據屬性。

enter image description here

接着,下面的代碼片段會爲你工作。

BOOL result; 
    NSManagedObjectContext *context = [self managedObjectContext]; 

    // Create a new managed object 
    NSManagedObject *newMessage = [NSEntityDescription insertNewObjectForEntityForName:@"message" 
                   inManagedObjectContext:context]; 
    [newMessage setValue:[NSNumber numberWithInt:local_id] forKey:@"local_id"]; 
    [newMovie setValue:movieName forKey:@"message"]; 

    NSError *error = nil; 
    // Save the object to persistent store 
    result = YES; 
    if (![context save:&error]) { 
     result = NO; 
     NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
    } 
    return result; 

和函數來獲取管理對象上下文桑德亞的

- (NSManagedObjectContext *)managedObjectContext { 
    NSManagedObjectContext *context = nil; 
    id delegate = [[UIApplication sharedApplication] delegate]; 
    if ([delegate performSelector:@selector(managedObjectContext)]) { 
     context = [delegate managedObjectContext]; 
    } 
    return context; 
} 

編輯代碼。

-(NSInteger)getMaxLocalId :(NSString*)entitiyName 
{ 
    NSEntityDescription *entitydesc=[NSEntityDescription entityForName:entitiyName inManagedObjectContext:app.context]; 
    NSFetchRequest *request=[[NSFetchRequest alloc]init]; 
    [request setEntity:entitydesc]; 
    NSInteger local_id = 0; 
    request.fetchLimit = 1; 
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"local_id" ascending:NO]]; 
    NSError *error = nil; 
    local_id=[[app.context executeFetchRequest:request error:&error].firstObject integerValue]; 
    return local_id; 
} 

然後用下面的中插入到CoreData

NSInteger local_id =[self getMaxLocalId:name]; 
local_id=local_id+1; 
[message setValue:[NSNumber numberWithInteger:local_id] forKey:@"local_id"]; 

確保你得到的local_id。

如您有NSInteger的,對於轉換你應該使用[NSNumber numberWithInteger:]相反UPDATE的[NSNumber numberWithInt:]

2:

NSString *filter=[[arr_msg objectAtIndex:i] objectForKey:filterText]; 
if(![fetched_data containsObject:filter]) 
{ 
    NSManagedObject *message=[[NSManagedObject alloc] initWithEntity:entitydesc insertIntoManagedObjectContext:app.context]; 
    [arr_keys setArray:[[arr_msg objectAtIndex:i] allKeys]]; 
    [arr_values setArray:[[arr_msg objectAtIndex:i] allValues]]; 
    [message setValue:[NSNumber numberWithInteger:local_id] forKey:@"local_id"]; 
    for (int i=0;i<[arr_keys count];i++) 
    { 
     if([[message.entity propertiesByName] objectForKey:[arr_keys objectAtIndex:i]] != nil 
      && ([[[message.entity propertiesByName] objectForKey:[arr_keys objectAtIndex:i]] isKindOfClass:[NSAttributeDescription class]])) 
     { 
      if(![[arr_keys objectAtIndex:i] isEqualToString:@"local_id"]){ 
       [message setValue:[arr_values objectAtIndex:i] forKey:[arr_keys objectAtIndex:i]]; 
      } 
     } 
    } 
    [arr_keys removeAllObjects]; 
    [arr_values removeAllObjects]; 
} 
+0

如果這不起作用,請詳細發佈您的代碼 – PrafulD

+0

在我的代碼上張貼 – Sandhya

+0

請參閱我已編輯的答案。 – PrafulD

0
-(NSInteger)getMaxLocalId :(NSString*)entitiyName 
{ 
    NSEntityDescription *entitydesc=[NSEntityDescription entityForName:entitiyName inManagedObjectContext:app.context]; 
    NSFetchRequest *request=[[NSFetchRequest alloc]init]; 
    [request setEntity:entitydesc]; 
    NSInteger local_id = 0; 
    request.fetchLimit = 1; 
    request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"local_id" ascending:NO]]; 
    NSError *error = nil; 
    local_id=[[app.context executeFetchRequest:request error:&error].firstObject integerValue]; 
    return local_id; 
} 

然後用下面的中插入到CoreData

NSInteger local_id =[self getMaxLocalId:name]; 
local_id=local_id+1; 
[message setValue:myNumber forKey:@"local_id"]; 
+0

什麼'getMaxLocalId:name'在這裏返回? – vaibhav

+0

這將返回local_id的最大值 – Sandhya

+0

你準確得到錯誤的地方? – vaibhav

相關問題