сбой приложения из-за отсутствия хранения данных в базе данных

#iphone #objective-c #database #sqlite

#iPhone #objective-c #База данных #sqlite

Вопрос:

Я не знаю, где я ошибаюсь, вот вывод консоли

 2011-10-07 11:03:29.508 Golden Corral[2365:207] After whole process Name : Ggggggggggg
2011-10-07 11:03:29.513 Golden Corral[2365:207] After whole process Score : 27600
2011-10-07 11:03:29.515 Golden Corral[2365:207] Error : Error Domain=NSCocoaErrorDomain Code=1660 "The operation couldn’t be completed. (Cocoa error 1660.)" UserInfo=0x5566d60 {NSValidationErrorObject=<HighScore: 0x5563eb0> (entity: HighScore; id: 0x5555ed0 <x-coredata:///HighScore/tDAD877F0-0594-4E14-819F-AF5BDA4A38A82> ; data: {
PlayerName = Ggggggggggg;
TopTenScore = 27600;
}), NSValidationErrorKey=PlayerName, NSLocalizedDescription=The operation couldn’t be completed. (Cocoa error 1660.), NSValidationErrorValue=Ggggggggggg}
  

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

     -(void)calculateHighScore
{

    //////////////////////////       Core Data  Entries.    ///////////////


    HighScore *ScoreData = (HighScore*)[NSEntityDescription insertNewObjectForEntityForName:@"HighScore" inManagedObjectContext:self.managedObjectContext];



    if ([txtName.text isEqualToString:@""] || [txtName.text length] == 0 )
    {



            NSLog(@"The Name :%@",txtName.text);

            NSLog(@"%d",CountHighScore);

            ScoreData.PlayerName = @"Anonymous";
            ScoreData.TopTenScore = [NSNumber numberWithInt:CountHighScore];

            NSLog(@"The Name :%@",ScoreData.PlayerName);

            NSLog(@"%d",CountHighScore);

            isWinner = NO;
            levelCount   ;




    }

    else 
    {



            NSLog(@"Befor Text assign highscore :%d",CountHighScore);

            //CountHighScore = [txtName.text intValue];

            ScoreData.PlayerName = txtName.text;
            ScoreData.TopTenScore = [NSNumber numberWithInt:CountHighScore];

            NSLog(@"The Name :%@",txtName.text);

            NSLog(@"%d",CountHighScore);


            isWinner = NO;
            levelCount   ;




    }

    NSLog(@"After whole process Name : %@",ScoreData.PlayerName);
    NSLog(@"After whole process Score : %d",CountHighScore);

    // Code for inserting into DataBase
    NSError *CorrectError;      
    if (![self.managedObjectContext save:amp;CorrectError])
    {
        // Handle the error...
        NSLog(@"Error : %@",CorrectError);
    }



}
  

Комментарии:

1. Что такое тип PlayerName ?

2. Имя игрока — это тип строки, а TopTenscore — целочисленный тип.

3. Добавляйте ли какие-либо функции проверки этого свойства в свой файл модели? Длина?

4. да, я установил максимальную длину имени игрока до 8, это не обязательно, я должен удалить его?

5. Привет, спасибо, я удалил длину, и теперь она работает нормально.

Ответ №1:

Ответ был найден во время разговора в комментариях.

Когда вы создаете новый ключ в своей модели, вы можете установить ограничения на значения этого свойства.

В текущем примере были установлены ограничения на значения ключа PlayerName : максимальная его длина была установлена равной 8.

Поэтому, когда вы устанавливаете значение PlayerName ключа @"Ggggggggggg" , длина которого превышает 8, вы получите сообщение об ошибке при внесении изменений в базу данных. Все ограничения проверяются только после того, как вы внесли все изменения в объекты и хотите сохранить их в своей базе данных, зафиксировав изменения.

Комментарии:

1. не могу ли я проверить это во время выполнения и попросить пользователя ввести имя меньше 8 или если пользователь вводит более 8 букв, допустимы только первые 8 букв???

2. Если пользователь введет более 8 символов, приложение завершит работу при сохранении этих значений в БД. Вы должны вручную проверить длину входной строки и обрезать ее, если это необходимо, или отказаться от ее сохранения.