서버에서 내 앱으로로드되고 데이터베이스에 삽입되는 5000 개 이상의 레코드가 있습니다. 삽입 성공 후 이러한 레코드를 삽입하는 동안 이런 종류의 오류가 발생하고 응용 프로그램이 다운됩니다. 유용 할 수 코드데이터베이스가 iphone + 오류 디스크 I/O 오류로 잘못 형성되었습니다.
데이터베이스가 다음 아이폰 + 오류 디스크 I/O 오류
으로 기형화되어 있으며, 여기에 내가 한 5 개 카테고리 중 하나에 기록을 얻고 데이터베이스에 삽입하고
if (tag==1) {
NSMutableDictionary *catDic=[dic valueForKeyPath:@"GetAllRecords.results.categories.category"];
[self performSelectorInBackground:@selector(insertDataInCategoryMaster:) withObject:catDic];
NSMutableDictionary *levelDic=[dic valueForKeyPath:@"GetAllRecords.results.levels.level"];
[self performSelectorInBackground:@selector(insertDataInLevelMaster:) withObject:levelDic];
NSMutableDictionary *queDic=[dic valueForKeyPath:@"GetAllRecords.results.questions.question"];
[self performSelectorInBackground:@selector(insertDataInQueMaster:) withObject:queDic];
[self getQueCatLevelData:2];
}
else if(tag==2){
NSMutableDictionary *queDic=[dic valueForKeyPath:@"GetAllRecords.results.questions.question"];
[self performSelectorInBackground:@selector(insertDataInQueMaster:) withObject:queDic];
[self getQueCatLevelData:3];
}
else if(tag==3){
NSMutableDictionary *queDic=[dic valueForKeyPath:@"GetAllRecords.results.questions.question"];
[self performSelectorInBackground:@selector(insertDataInQueMaster:) withObject:queDic];
[self getQueCatLevelData:4];
}//and so on for 5 also
각 insertDataInQueMaster에서 다음 작업을 수행하고 있습니다. 앱이 AppDelegate.m에로드되는 동안
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
for(NSDictionary *queDictionary in dictionary)
{
NSString *strQuery = [NSString stringWithFormat:@"insert into QuestionMaster values(%d,'%@','%@',%d,%d,%d,%d,%d,0,'%@')",[[queDictionary valueForKey:@"questionid"]intValue], [queDictionary valueForKey:@"questiontext"],[queDictionary valueForKey:@"answertext"],[[queDictionary valueForKey:@"categoryid"]intValue],[[queDictionary valueForKey:@"levelid"] intValue],[[queDictionary valueForKey:@"status"]intValue],[[queDictionary valueForKey:@"RangeFrom"]intValue],[[queDictionary valueForKey:@"RangeTo"]intValue],[queDictionary valueForKey:@"Fact"]];
[NSNumber requestWithSynchronousExcuteQuery:strQuery withReturnningError:&error];
if(error)
{
NSLog(@"error description:%@",[[error userInfo] description]);
[[NSUserDefaults standardUserDefaults]setBool:NO forKey:@"FirstTime"];
}
}
count++;
[[NSUserDefaults standardUserDefaults]setInteger:count forKey:@"CheckCount"];
[[NSUserDefaults standardUserDefaults]synchronize];
[pool drain];
그래서 나는 데이터베이스를 열고 삽입에 문제가 없다고 생각도 배경 에 오류가 후 성공적으로 데이터베이스에 몇 가지 기록을 삽입 온다,이 모든 일을하고있다.
나는 분명하다. 혼란이 있으면 언제든지 말씀해주십시오. 답장을 기다리는 중입니다. 미리 감사드립니다.
SQLite 파일을 손상 시키려고합니다. 잠금없이 두 개의 다른 스레드에서 액세스 할 수 있습니다 (일반적으로 SQLite는 자체에서 보호하기 위해 컴파일되지만) 실수로 DB를 다시 초기화하는 경로로 떨어지는 것과 같은 다른 파일 작업이 될 수 있습니다. –
(SQLite를 여러 스레드에서 사용하는 경우 충돌을 방지하기 위해 DB에 대한 액세스를 직렬화/잠글 필요가 있음을 기억하십시오.) –