2012-10-18 2 views
0

서버에서 내 앱으로로드되고 데이터베이스에 삽입되는 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]; 

그래서 나는 데이터베이스를 열고 삽입에 문제가 없다고 생각도 배경 에 오류가 후 성공적으로 데이터베이스에 몇 가지 기록을 삽입 온다,이 모든 일을하고있다.

나는 분명하다. 혼란이 있으면 언제든지 말씀해주십시오. 답장을 기다리는 중입니다. 미리 감사드립니다.

+0

SQLite 파일을 손상 시키려고합니다. 잠금없이 두 개의 다른 스레드에서 액세스 할 수 있습니다 (일반적으로 SQLite는 자체에서 보호하기 위해 컴파일되지만) 실수로 DB를 다시 초기화하는 경로로 떨어지는 것과 같은 다른 파일 작업이 될 수 있습니다. –

+0

(SQLite를 여러 스레드에서 사용하는 경우 충돌을 방지하기 위해 DB에 대한 액세스를 직렬화/잠글 필요가 있음을 기억하십시오.) –

답변

2

만세, 나는 그냥

@synchronized(self) 
    { 
     //My Whole Code for Background methods goes here 
    } 

을 배치하고이 너무 내 오류 및 충돌 해결, 그것 뿐이다이

에 간단한 해결책을 얻었다.

@synchronized() 지시문은 단일 스레드에서 사용할 코드 섹션을 잠급니다. 다른 스레드는 스레드가 보호 된 코드를 종료 할 때까지 차단됩니다. 즉, @synchronized() 블록의 마지막 문장을지나 실행이 계속 될 때까지 차단됩니다.

@synchronized() 지시문은 self를 포함하여 Objective-C 객체를 유일한 인수로 취합니다.

+3

* 동일한 *'self'가 * 모두 * 당신이 DB 작업을 수행하는 위치. 또한 첫 번째'select'에서'finalize'까지 하나의 동기화 된 범위에서 * 전체 * 연산을 다루는 지 확인하십시오. –

+0

고맙습니다. – Anand

+0

고맙습니다. –

관련 문제