2012-04-16 2 views
1

데이터베이스에서 많은 읽기/쓰기 작업을 수행해야하는 iPad 응용 프로그램을 개발 중입니다. 데이터베이스의보기에 클릭을 저장해야합니다. 클릭에 기반한 클릭은 일부 작업을 수행함). 나는이 경우 어떻게 진행해야하는지 혼란 스럽다. SQLIte 데이터베이스를 만들고 읽기/쓰기를 수행해야합니까 (응용 프로그램의 응답 시간이 느려지나요?) 또는 다른 일부 기술 (핵심 데이터에 대해 들어 보았지만 확실하지는 않습니다) . 나에게데이터베이스에서 읽기/쓰기 작업을 많이 수행하는 방법

감사

Ajith

도와주세요

답변

0

클릭이 많이가있는 경우, 당신은 확실히 별도로 데이터베이스에 각을 쓰고 싶지 않아. 아마도 마우스 동작을 축적하여 -mouseUp: 이벤트에 저장하는 것이 좋습니다.

핵심 데이터는 절차를 단순화하여 여기에 약간의 도움이 될 수 있습니다. 객체를 매우 빠르게 생성하고 영구 저장소에 저장하는 것을 연기 할 수 있습니다. 그러나 CFRunLoopObserver을 설치하면 SQLite에서 동일한 효과를 얻을 수 있습니다. 이벤트가 없을 때까지 기다렸다가 데이터베이스에 데이터 일괄 처리를 작성합니다.

무엇을 선택하든, 전략은 클릭 수를 누적하여 일괄 적으로 저장하는 것입니다.

0

가장 좋은 방법은 파일 시스템의 파일로 작업을 스트리밍하는 것입니다. 그렇다면 거기에 그대로 두거나 정말로 필요하다면 Core Data를 통해 SQLite로 업로드 할 수 있습니다. 그 이유는 모든 짝수에 대해 ManagedObjectContext을 커밋하면 상황이 실제로 느리게 실행되기 때문입니다.

사용 : backingFile = [NSFileHandle fileHandleForUpdatingAtPath:eventsFilePath];[backingFile writeData:...];

관계형 데이터베이스의 기본 목적은 데이터를 '검색'하는 것을 기억 사용에 이벤트를 추가 할 수 있습니다. UI 클릭 이벤트를 통해 검색하지 않으면 (필자가 의심 스럽지만) 파일로 스트리밍하는 것이 가장 좋습니다.

1

순서대로 저장 한 다음 동일한 순서로 다시 읽으려면 일반 파일이 가장 적합 할 수 있습니다. 그러나 다른 작업을 수행하려면 CoreData를 사용하십시오. 그것은 단지 관계형 데이터베이스가 아닙니다. 그것은 영구 객체 그래프를 허용합니다. 또한 UIManagedDocument 또는 자신의 부모/자식 NSManagedObjectContext 배열을 사용하는 경우에는 모두 백그라운드 스레드에서 발생하기 때문에 데이터베이스 히트가 표시되지 않습니다.

가서 테스트 해보세요. 시작/이동/끝 접촉을 재정의하고 매 터치시 데이터베이스에 객체를 던집니다. 내가 설명하는대로 당신이 그것을하고 있다면, 당신은 심지어 데이터베이스 히트를 통지하지 않습니다.

MyTouchEvent가 MyTouch와 일대 다 관계를 갖는 MyTouchEvent 및 MyTouch 모델의 두 엔터티를 사용한다고 가정합니다.

// Call this from touchesBegan, touchesMoved, and touchesEnded... 
- (void) saveTouches:(NSSet*)touches kind:(NSString*)kind 
{ 
    NSManagedObjectContext *moc = self.document.managedObjectContext; 
    MyTouchEvent *myTouchEvent = [NSEntityDescription insertNewObjectForEntityForName:@"MyTouchEvent" inManagedObjectContext:moc]; 
    myTouchEvent.kind = kind; 
    for (UITouch *touch in touches) { 
     CGPoint touchPoint = [touch locationInView:self]; 
     MyTouch *myTouch = [NSEntityDescription insertNewObjectForEntityForName:@"MyTouch" inManagedObjectContext:moc]; 
     myTouch.x = [NSNumber numberWithFloat:touchPoint.x]; 
     myTouch.y = [NSNumber numberWithFloat:touchPoint.y]; 
     [myTouchEvent addTouchesObject:myTouch]; 
    } 
    [self.document updateChangeCount:UIDocumentChangeDone]; 
} 

개체 생성에 비용이 많이 드는 경우 개인용 컨텍스트를 만드는 방법을 추가하고 두 가지 옵션을 사용하여 모든 작업을 수행 할 수 있습니다. 당신은 그것을 문서의 메인 컨텍스트에 적용 할 수 있습니다.이 경우, 블록에 코드를 삽입하고 MOC에서 save를 호출하면됩니다.

- (NSManagedObjectContext*)moc 
{ 
    if (!_moc) { 
     _moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
     _moc.parentContext = self.document.managedObjectContext; 
    } 
    return _moc; 
} 
- (void) saveTouches:(NSSet*)touches kind:(NSString*)kind 
{ 
    NSManagedObjectContext *moc = self.moc; 
    [self.moc preformBlock:^{ 
     MyTouchEvent *myTouchEvent = [NSEntityDescription insertNewObjectForEntityForName:@"MyTouchEvent" inManagedObjectContext:moc]; 
     myTouchEvent.kind = kind; 
     for (UITouch *touch in touches) { 
      CGPoint touchPoint = [touch locationInView:self]; 
      MyTouch *myTouch = [NSEntityDescription insertNewObjectForEntityForName:@"MyTouch" inManagedObjectContext:moc]; 
      myTouch.x = [NSNumber numberWithFloat:touchPoint.x]; 
      myTouch.y = [NSNumber numberWithFloat:touchPoint.y]; 
      [myTouchEvent addTouchesObject:myTouch]; 
     } 
     NSError *error = nil; 
     [moc save:&error]; 
    }]; 
} 

또는, 당신은 그것을 DB 물건의 경우 어느 것도 모두에서 메인 스레드에서 실행하지하는 형제, (A UIManagedDocument의 주요 컨텍스트 만들 수는 위의 경우에, 그래서 메인 스레드에서 실행 주 스레드는 개체를 저장 작업을 수행하는 컨텍스트로 전달합니다. 그러나이 경우 document.managedObjectContext는 데이터베이스에 저장된 내용을 가져 오기 위해 FETCH를 수행해야합니다. 그러나 저장 중에는 주 스레드에 성능이 없습니다.

- (NSManagedObjectContext*)moc 
{ 
    if (!_moc) { 
     _moc = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
     _moc.parentContext = self.document.parentContext; 
    } 
    return _moc; 
} 

이제는 데이터베이스로 이동 하겠지만, 문서에서 볼 수있게하려면 가져 오기를 수행해야합니다. 사용 사례에 따라 가장 적합한 것을 선택하십시오. 그래도 첫 번째 예에서는 괜찮을 것이라고 생각합니다.

관련 문제