Базовые данные — как вставить массив

Я хотел бы знать, как сохранить несколько строковых объектов, хранящихся в массиве, с помощью Core Data.

Я понимаю, как хранить одну строку, но есть ли какой-либо удобный метод/могу ли я сохранить сам объект массива, а не перебирать массив и хранить каждый элемент строки отдельно?

NSManagedObject *alice = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
[alice setValue:@"Alice" forKey:@"name"];
[alice setValue:@"Computer Science" forKey:@"major"];

В принципе, могу ли я сделать setValue массивом вместо Алисы?

(В качестве несвязанного вопроса, как я могу кэшировать данные на iphone, например изображение...)

Спасибо за любую помощь


person Apollo    schedule 05.01.2012    source источник


Ответы (3)


Посмотрите на этот пост: вставьте NSDictionary в CoreData просто замените слово NSDictionary на NSArray кроме того, это тот же вопрос.

person Vincent Bernier    schedule 05.01.2012

Я не знаю, есть ли какие-либо готовые методы. Например, вам придется отслеживать ключи в отдельном контейнере или определять их как константы где-то, например, в следующем примере:

static NSUInteger const kMyNameIdx = 0U;
static NSUInteger const kMyMajorIdx = 1U;
static NSString * const kMyNameKey = @"name";
static NSString * const kMyMajorKey = @"major";

/* this does no error checking on the mo or array */
/* being null. it would be better to return an    */
/* NSError from this function and check its value */
/* to handle error cases                          */

- (void) updateManagedObject:(NSManagedObject *)mo withOrderedArray:(NSArray *)array
{
    id obj;
    NSUInteger objIdx = 0U;

    /* this assumes that name and major objects in */
    /* your array are in the same order as set by  */
    /* the constants                               */

    for (obj in array) {
        switch (objIdx) { 
            case kMyNameIdx:
                [mo setValue:obj forKey:kMyNameKey];
                break;
            case kMyMajorIdx:
                [mo setValue:obj forKey:kMyMajorKey];
                break;
            default:
                break;
        }
        objIdx++;
    }
}

Чтобы использовать его:

NSManagedObject *alice = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
NSArray *myArray = /* ... */
[self updateManagedObject:alice withOrderedArray:myArray];

Вы можете внести дополнительные изменения, например сделать это методом категории. для NSManagedObject типа сущности Student. Затем вы можете вызывать эту функцию везде, где вы используете Student управляемые объекты.

person Alex Reynolds    schedule 05.01.2012

где бы вы ни вызывали этот метод с вашим массивом

-(void)viewDidLoad
{
  [self insertLoginData:YOUR ARRAY NAME];
}

- (BOOL)insertLoginData:(NSMutableArray *)loginInfoArray
{
    NSError *error=nil;
    NSManagedObjectContext *context = [self managedObjectContext];
    NSManagedObject *propertyInfo = [NSEntityDescription
                                     insertNewObjectForEntityForName:@"UserLogin" 
                                     inManagedObjectContext:context];
    for(int count=0;count<[loginInfoArray count];count++)
    {
        [propertyInfo setValue:[[loginInfoArray objectAtIndex:count]objectForKey:@"UserId"] forKey:@"userName"];
        [propertyInfo setValue:[[loginInfoArray objectAtIndex:count]objectForKey:@"Password"] forKey:@"password"];  
    }

    if (![__managedObjectContext save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
        return NO;
    }
    else  
    {
        return YES; 
    }
}

Получить данные ==========

-(NSMutableArray *)fetchLoginData
{
    NSFetchRequest *fetchReq = [[NSFetchRequest alloc]init];

    [fetchReq setEntity:[NSEntityDescription entityForName:@"UserLogin" inManagedObjectContext:self.managedObjectContext]];
    NSMutableArray *resultArray = [[NSMutableArray alloc]initWithArray:[self.managedObjectContext executeFetchRequest:fetchReq error:nil]];
    NSMutableArray *array=[[NSMutableArray alloc]init];
    for(UserLogin *pnt in resultArray)
    {
        //[array addObject:pnt.userName];
        [array addObject:pnt];
    }
    return array;
}
person razesh    schedule 20.06.2014