2012-04-16 21 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配列を使用すると、すべてがバックグラウンドスレッドで発生するため、データベースヒットは表示されません。

先に進み、テストしてください。 begin/move/endタッチをオーバーライドし、すべてのタッチでオブジェクトをデータベースにスローします。私が記述しているようにそれをやっているなら、あなたはデータベースヒットに気付かないでしょう。

モデル内の2つのエンティティ、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]; 
} 

オブジェクトの作成にコストがかかる場合は、プライベートコンテキストを作成する方法を追加し、その中ですべての作業を2つのオプションで実行できます。あなたはドキュメントの主なコンテキストに親をおくことができます。その場合、ブロックにコードを埋め込み、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のもののどれもが、すべてのメインスレッド上で実行されません。その場合には兄弟、(UIManagedDocumentのメインコンテキストはメインスレッドで実行されますので、上記のケースでは作ることができます主スレッドはオブジェクトを保存を行うコンテキストに渡します)。ただし、この場合、document.managedObjectContextは、データベースに格納されたものを取得するためにFETCHを実行する必要があります。ただし、ストレージ中にメインスレッドにパフォーマンスが発生しません。

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

これらはデータベースに送られますが、ドキュメントで参照したい場合はフェッチを実行する必要があります。あなたのユースケースに基づいて最適なものを選びなさい。私はあなたが最初の例でうまくいくと思います。

関連する問題