#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 символов, приложение завершит работу при сохранении этих значений в БД. Вы должны вручную проверить длину входной строки и обрезать ее, если это необходимо, или отказаться от ее сохранения.