Search code examples
iphoneobjective-ccore-datainsertnsentitydescription

CoreData inserting very huge DB exc_bad_access


I have ~60000 values in my DB. I must to keep them all. But while inserting values I get exc_bad_access. Here is my code:

if (context == nil)
{
    context = [(radioAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    NSLog(@"After managedObjectContext: %@",  context);
}

[self performSelectorOnMainThread:@selector(deleteAllFromDB) withObject:nil waitUntilDone:YES];

// here is JSON parsing
int i=0;

@synchronized(self)
{
    NSLog(@"Start");
    NSEntityDescription *entity = [[NSEntityDescription entityForName:@"Station" inManagedObjectContext:context] autorelease];

    for (NSString*string in stations)
    {
        if (![string isEqualToString:@""])
        {
            Station*station = [[[Station alloc] initWithEntity:entity insertIntoManagedObjectContext:nil] retain];

            NSError *err = nil;
            id parsedData = [NSJSONSerialization JSONObjectWithData:[string dataUsingEncoding:NSUTF8StringEncoding]
                                                            options:NSJSONReadingMutableContainers error:&err];
            if (err) {
                NSLog(@"error is %@", [err localizedDescription]);
            }

            [station setName:[parsedData objectForKey:@"nm"]];

            [station setBit: [parsedData objectForKey:@"btr"]];
            [station setEnabled: [NSNumber numberWithInt:1]];

            //encoding id of the station

            scanner = [NSScanner scannerWithString:[parsedData objectForKey:@"id"]];

            [scanner scanHexInt:&tempInt];

            NSNumber *numb = [[NSNumber alloc]initWithInt:i];
            [station setNumber: [NSNumber numberWithInt:[numb intValue]]];

            //encoding country ID

            numb = [NSNumber numberWithInt:i];
            [station setCountryID: [NSNumber numberWithInt:[numb intValue]]];

            //encoding genre ID
            numb = [NSNumber numberWithInt:i];
            [station setGenerID:[NSNumber numberWithInt:[numb intValue]]];

            [station setOrder:[NSNumber numberWithInt:i]];

            [context insertObject:station];

            float k = [stations count];
            k = (i + 1)/k;

            [self performSelectorOnMainThread:@selector(increaseProgress:) withObject:[NSNumber numberWithFloat:k] waitUntilDone:YES];

            i++;

            [scanner release];
            [numb release];
            [station release];
            [parsedData release];
        }
    }

    [context save:nil];
    [entity release];

    NSLog(@"Stop"); 

    NSEntityDescription *entityGen = [NSEntityDescription entityForName:@"Genre" inManagedObjectContext:context];

    NSURL* urlForGenre = [NSURL URLWithString:@"xxx.xxx"];
    NSData *genres = [[NSData alloc] initWithContentsOfURL:urlForGenre];

    NSError *err = nil;
    NSArray *parsedGenres = [NSJSONSerialization JSONObjectWithData:genres options:NSJSONReadingMutableContainers error:&err];
    if (err)
    {
        NSLog(@"error is %@", [err localizedDescription]);
    }


    for (int i =0; i<parsedGenres.count; i++)
    {
        Genre*gen = [[Genre alloc] initWithEntity:entityGen insertIntoManagedObjectContext:nil];

        gen.name = [[parsedGenres objectAtIndex:i] objectForKey:@"nm"];

        int tempInt;
        NSScanner *scanner= [[NSScanner alloc] init];
        scanner = [NSScanner scannerWithString:[[parsedGenres objectAtIndex:i] objectForKey:@"id"]];

        [scanner scanInt:&tempInt];

        NSNumber *numb = [[NSNumber alloc] init];
        numb = [NSNumber numberWithInt:tempInt];

        gen.number = [NSNumber numberWithInt:[numb integerValue]];

        float k = [parsedGenres count];
        k = (i + 1)/k;

        [self performSelectorOnMainThread:@selector(increaseProgress:) withObject:[NSNumber numberWithFloat:k] waitUntilDone:YES];
        [context insertObject:gen];

        [gen release];
    }

    [entityGen release];
    [context save:nil];

    NSEntityDescription *entityCon = [NSEntityDescription entityForName:@"Country" inManagedObjectContext:context];

    NSURL* urlForCoun = [NSURL URLWithString:@"yyy.yyy"];
    NSData *countr = [[NSData alloc] initWithContentsOfURL:urlForCoun];

    err = nil;
    NSArray *parsedCountr = [NSJSONSerialization JSONObjectWithData:countr options:NSJSONReadingMutableContainers error:&err];
    if (err)
    {
        NSLog(@"error is %@", [err localizedDescription]);
    }

    NSMutableArray* temp = [[NSMutableArray alloc] init];

    for (int i =0; i<parsedCountr.count; i++)
    {
        Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:nil];

        countr.name = [[parsedCountr objectAtIndex:i] objectForKey:@"nm"];

        int tempInt;
        NSScanner *scanner= [[NSScanner alloc] init];
        scanner = [NSScanner scannerWithString:[[parsedCountr objectAtIndex:i] objectForKey:@"id"]];

        [scanner scanInt:&tempInt];

        NSNumber *numb = [[NSNumber alloc] init];
        numb = [NSNumber numberWithInt:tempInt];

        countr.number = [NSNumber numberWithInt:[numb integerValue]];

        [temp addObject:countr];

        float k = [parsedCountr count];
        k = (i + 1)/k;

        [self performSelectorOnMainThread:@selector(increaseProgress:) withObject:[NSNumber numberWithFloat:k] waitUntilDone:YES];

        [context insertObject:countr];

        [countr release];
    }

    [context save:nil];

If my app doesn't crash, yes, it happens not by every launch. It crashes on:

Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:nil];

Please help! And sorry for my terrible English.

Update:

On: Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:nil];

Thread 7: EXC_BAD_ACCESS (code=1, address=0x3f800008)

Other error is exc_bad_access too. But with code=2 and on other thread.

Update 2:

I enabled zombies mode in scheme of my debug. Nothing happened.

Update 3:

I think I have problems with memory.

GuardMalloc: Failed to VM allocate 4128 bytes

GuardMalloc: Explicitly trapping into debugger!!!


Solution

  • You can't pass nil as managedObjectContext parameter to initWithEntity:insertIntoManagedObjectContext: method. Try changing this:

    Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:nil];
    

    to this

    // pass managed object context parameter
    Country*countr = [countr initWithEntity:entityCon insertIntoManagedObjectContext:context];