1

データベースで多くの読み取り/書き込み操作を実行する必要があるiPadアプリケーションを開発しています(クリックに基づいてデータベースにビューのクリックを保存し、いくつかの操作を実行する必要があります)。この場合、どうすればいいのか困っています。SQLIte データベースを作成して読み取り/書き込みを実行する必要がありますか (これによりアプリの応答時間が遅くなりますか??)、または他の手法がありますか (コアデータについて聞いたことがありますが、これが私のケースで機能するかどうかはわかりません)。 . 私を助けてください

ありがとう

アジット

4

3 に答える 3

1

それらを順番に保存するだけで、同じ順序で読み返す場合は、おそらく通常のファイルが最適です。ただし、それ以外のことを行う場合は、CoreData を使用してください。単なるリレーショナル データベースではありません。永続的なオブジェクト グラフを許可します。また、UIManagedDocument、または独自の親/子 NSManagedObjectContext 配置を使用する場合、すべてバックグラウンド スレッドで発生するため、データベース ヒットさえ表示されません。

さあ、試してみてください。開始/移動/終了タッチをオーバーライドし、タッチするたびにオブジェクトをデータベースにスローします。説明どおりに実行している場合は、データベース ヒットにさえ気付かないでしょう。

モデル内の 2 つのエンティティ、MyTouchEvent と MyTouch を想定しています。ここで、MyTouchEvent は MyTouch と 1 対多の関係にあります。

// 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;
}

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

于 2012-04-17T00:30:15.910 に答える
0

最善の策は、アクションをファイルシステム上のファイルにストリーミングすることです。次に、そのままにしておくか、本当に必要な場合は、CoreDataを介してSQLiteにアップロードします。この理由は、ManagedObjectContextすべての偶数に対してコミットすると、処理が非常に遅くなるためです。

使用:使用backingFile = [NSFileHandle fileHandleForUpdatingAtPath:eventsFilePath];にイベントを追加します[backingFile writeData:...];

リレーショナルデータベースの主な目的は、データを「検索」することであることを忘れないでください。UIクリックイベントを検索しない場合(私はそうは思わないが)、ファイルへのストリーミングが最善の策です。

于 2012-04-16T18:27:56.047 に答える
0

クリック数が多い場合は、それぞれを個別にデータベースに書き込む必要はありません。-mouseUp:おそらく、マウスアクションを蓄積し、イベントでそれらを保存することは良い妥協案でしょう。

コアデータは、手順を簡素化することで、ここで少し役立つ場合があります。これにより、オブジェクトを非常に高速に作成し、永続ストアへの保存を延期できます。CFRunLoopObserverただし、をインストールし、イベントがなくなるまで待ってからデータベースにデータのバッチを書き込むと、SQLiteでも同じ効果を得ることができます。

どちらを選択しても、戦略はクリックを累積してバッチで保存することです。

于 2012-04-16T16:26:16.513 に答える