2015-05-11 4 views
-4

Я использую SQLite, и я хочу сохранить текстовые поля имени, адреса и телефона, чтобы они отображались в следующем контроллере представления, когда «показать детали» нажмите кнопку в 1-м VC.массив не пуст, но все еще получает индекс ошибки 0

Я разместил кнопку «Сохранить» и «Показать детали» в 1-м VC, а также «предыдущая» и «следующая» кнопка в 2-м VC. Всякий раз, когда я нажимаю «показать детали», я получаю это сообщение об ошибке:

индекс 0 за пределами для пустого массива.

Однако я вижу, что массив не пуст. Я хочу сохранить данные о студенте в массиве.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 



    NSString *homeDirectory = NSHomeDirectory(); 
    NSString *documentsDirectoryPath = [homeDirectory stringByAppendingPathComponent:@"Documents"]; 
    self.dbFilePathInDocuments = [documentsDirectoryPath stringByAppendingPathComponent:@"details.db"]; 
    self.studentDetails = [[NSMutableArray alloc]init]; 

    NSString *selectQuery = [NSString stringWithFormat:@"select name,address,phone from contacts"]; 
    sqlite3_open([self.dbFilePathInDocuments UTF8String], &dataBase); 
    sqlite3_prepare_v2(dataBase, [selectQuery UTF8String], -1,&selectStatement, NULL); 
    while (sqlite3_step(selectStatement) == SQLITE_ROW) 
    { 
     NSMutableDictionary *studentDict = [[NSMutableDictionary alloc]init]; 
     NSString *name = [NSString stringWithFormat:@"%s",sqlite3_column_text(selectStatement, 0)]; 
     NSString *address = [NSString stringWithFormat:@"%s",sqlite3_column_text(selectStatement, 1)]; 
     NSString *phone = [NSString stringWithFormat:@"%s",sqlite3_column_text(selectStatement, 2)]; 
     [studentDict setObject:name forKey:@"name"]; 
     [studentDict setObject:address forKey:@"address"]; 
     [studentDict setObject:phone forKey:@"phone"]; 
     [self.studentDetails addObject:studentDict]; 
     NSLog(@"student is:%@",self.studentDetails); 
    } 

    sqlite3_finalize(selectStatement); 
    sqlite3_close(dataBase); 

    self.nameLabel.text = [[self.studentDetails objectAtIndex:0] valueForKey:@"name"]; 
    self.addressLabel.text = [[self.studentDetails objectAtIndex:0] valueForKey:@"address"]; 
    self.phoneLabel.text = [[self.studentDetails objectAtIndex:0] valueForKey:@"phone"]; 

    currentStudentIndex = 0; 

} 

- (IBAction)clickPrevious:(id)sender { 
    if(currentStudentIndex <=0) 
    { 
     currentStudentIndex = 0; 
    }else 
    { 
     currentStudentIndex = currentStudentIndex - 1; 
    } 


    self.nameLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"name"]; 
    self.addressLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"address"]; 
    self.phoneLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"phone"]; 
} 


- (IBAction)clickNext:(id)sender { 

    if(currentStudentIndex >= [self.studentDetails count] - 1) 
    { 
     currentStudentIndex = [self.studentDetails count] - 1; 
    }else 
    { 
     currentStudentIndex = currentStudentIndex + 1; 
    } 

    self.nameLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"name"]; 
    self.addressLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"address"]; 
    self.phoneLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"phone"]; 
} 
+4

Если он говорит, что массив пуст, тогда массив пуст, и вы смотрите на что-то еще, что НЕ пусто. –

+0

Можете ли вы отформатировать код – KrisJones

+0

Показать полный стек и код, на который он ссылается. – trojanfoe

ответ

0

Вопрос заключается в том, что вы всегда доступ к массиву self.studentDetails, даже если он пуст. Это вызовет исключение.

Первый предел установка меток к одному методу и проверить доступ к массиву преуспеет перед пытается его:

- (void)updateLabels 
{ 
    if (currentStudentIndex >= [self.studentDetails count]) 
     return; 
    self.nameLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"name"]; 
    self.addressLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"address"]; 
    self.phoneLabel.text = [[self.studentDetails objectAtIndex:currentStudentIndex] valueForKey:@"phone"]; 
} 

и использовать этот метод в 3 местах вы в настоящее время набор этикеток. Например:

- (IBAction)clickPrevious:(id)sender { 
    currentStudentIndex--; 
    [self updateLabels]; 
} 

- (IBAction)clickNext:(id)sender { 
    currentStudentIndex++; 
    [self updateLabels]; 
} 

При использовании в viewDidLoad метод этот код:

... 
sqlite3_finalize(selectStatement); 
sqlite3_close(dataBase); 
currentStudentIndex = 0; 
[self updateLabels]; 

После того, что вы собираетесь хотите работать на включение/отключение кнопок в зависимости от того, есть следующий или previous Студент для просмотра, чтобы сделать приложение более интуитивно понятным.

+0

как вы говорите, что self.studentDetails массив пуст? – Krish

+0

Я сделал то, что вы мне сказали, но по-прежнему ту же ошибку – Krish

+0

Нужно ли мне что-то менять в первом VC? Кнопка «сохранить»? если вы хотите, я отправлю код? – Krish