2016-11-26 6 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; 
} 

Edited код сандхью.

-(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:] Вместо [NSNumber numberWithInt:]

UPDATE 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