Search code examples
objective-carraysmultidimensional-arraynsmutablearraynsarray

NSArray crashes my program when being used in a for loop


I am using SQLite3 to grab data from a Database. So I am trying to make an Multidimensional array to hold an array of all records which is a nested array within an array. So when the loop gets to this code:

[[studentsInfo objectAtIndex:recordRow] addObject: [NSMutableArray arrayWithObjects:studentLastName, studentFirstName, studentID, studentEmail, programName, majorityCampus, discipline, cmName, cmID, cmEmail, cmPhone, cmCampus, studentNotes, nil]];

it crashes. Here is what I get from Xcode.

Snapshot

Here is the full code what am I doing wrong?

    - (void) initializeDatabase {

    // get the documents directory
    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docsDir = dirPaths[0];
    NSLog(@"Directory Path: %@", docsDir);

    FindYourMentorDB_Path = [[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"FindYourCM_Info.sqlite"]];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([fileManager fileExistsAtPath:FindYourMentorDB_Path] == NO) {

        // attempt to open the db
        if (sqlite3_open([FindYourMentorDB_Path UTF8String], &_FindYourMentorDB) == SQLITE_OK){

            sqlite3_close(_FindYourMentorDB); // Close the DB

            NSLog(@"Succeeded in opening FindYourMentorDB");
        } else {

            NSLog(@"Failed to Open the FindYourMentorDB");
        } // END OF IF

    } // END OF IF

    NSMutableArray *studentsInfo = [NSMutableArray new];

    sqlite3_stmt *statement;

    if (sqlite3_open([FindYourMentorDB_Path UTF8String], &_FindYourMentorDB) == SQLITE_OK) {

        NSString *selectSQL = [NSString stringWithFormat:@"SELECT StudentLastName, StudentFirstName, StudentID, StudentEmail, ProgramName, MajorityCampus, Discipline, CMName, CMID, CMEmail, CMPhone, CMCampus, StudentNotes FROM FindYourCM_DB"];

        const char *selectStmt = [selectSQL UTF8String];

        if (sqlite3_prepare_v2(_FindYourMentorDB, selectStmt, -1, &statement, NULL) == SQLITE_OK) {

            for (int recordRow = 0; sqlite3_step(statement) == SQLITE_ROW; recordRow++) {

                NSString *studentLastName = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement,0)];

                NSString *studentFirstName = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 1)];

                NSString *studentID = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 2)];

                NSString *studentEmail = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 3)];

                NSString *programName = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 4)];

                NSString *majorityCampus = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 5)];

                NSString *discipline = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 6)];

                NSString *cmName = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 7)];

                NSString *cmID = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 8)];

                NSString *cmEmail = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 9)];

                NSString *cmPhone = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 10)];

                NSString *cmCampus = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 11)];

                NSString *studentNotes = [[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 12)];

                [[studentsInfo objectAtIndex:recordRow] addObject: [NSMutableArray arrayWithObjects:studentLastName, studentFirstName, studentID, studentEmail, programName, majorityCampus, discipline, cmName, cmID, cmEmail, cmPhone, cmCampus, studentNotes, nil]];
            }

            sqlite3_finalize(statement);
        }

        sqlite3_close(_FindYourMentorDB);
    }
}

Solution

  • I figured it out. The StudentNotes in the DB was NULL so that was causing it to crash. So I changed the code to this. Thanks for all the help.

    enter image description here