簡體   English   中英

對數據庫執行大量讀/寫操作的方法

[英]method for performing lot of read/write operations on a database

我正在開發一個iPad應用程序,在該應用程序中,我將不得不對數據庫執行很多讀/寫操作(我必須將對視圖的點擊存儲在數據庫中,而基於點擊的執行一些操作)。 我對在這種情況下如何進行感到困惑。 我應該創建一個SQLIte數據庫並執行讀/寫操作(這會減慢應用程序的響應時間嗎?),還是有其他技術(我聽說過Core數據,但不確定是否適合我的情況) 。 請幫我

謝謝

阿吉斯

如果只按順序保存它們,然后以相同順序讀回它們,則最好使用常規文件。 但是,如果您要執行其他任何操作,請使用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東西都不會在主線程上運行(UIManagedDocument的主上下文在主線程上運行,因此在上述情況下,主線程將傳遞對象進行保存的上下文)。 但是,在這種情況下,document.managedObjectContext將必須執行FETCH才能獲取放入數據庫的所有內容。 但是,它在存儲期間不會對主線程造成任何性能。

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

現在,這些將進入數據庫,但是如果您的文檔想查看它們,則必須執行提取。 根據您的用例選擇最合適的。 我想您會很喜歡第一個示例。

如果單擊次數很多,則絕對不希望將它們分別寫入數據庫。 也許,最好是累積鼠標操作並將它們保存在-mouseUp:事件中,這是一個不錯的選擇。

通過簡化過程,核心數據可能會有所幫助。 它使您可以快速創建對象並推遲將其保存到持久性存儲中。 但是,如果安裝CFRunLoopObserver ,則可以使用SQLite達到相同的效果,請等待直到沒有事件並將一批數據寫入數據庫。

無論您選擇什么,策略都是累積點擊次數並批量保存。

最好的選擇是將操作流式傳輸到文件系統上的文件。 然后,您可以將其保留在此處,或者如果確實需要,可以通過Core Data將其上傳到SQLite。 這樣做的原因是,如果對每個偶數都提交ManagedObjectContext ,則運行會非常緩慢。

使用: backingFile = [NSFileHandle fileHandleForUpdatingAtPath:eventsFilePath]; 使用[backingFile writeData:...];將事件附加到

請記住,關系數據庫的主要目的是“搜索”數據。 如果您不打算搜索UI單擊事件(我懷疑您會這樣做),那么流式傳輸到文件是最好的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM