簡體   English   中英

檢查數據庫中現有數據的最佳方法(iOS)

[英]Best way to check existent data in the database (iOS)

我正在開發一個用於管理消息的應用程序,並且希望該應用程序連接到服務器,獲取消息並將其保存在數據庫(coredata)中。 如果消息已經存在,則不執行任何操作;如果不存在,則將它們添加到數據庫中。

我正在考慮一些方法,但我不知道該怎么做。 有什么幫助嗎? 提前致謝

我建議使用Restkit框架http://restkit.org
Reskit提供與Core Data的集成。

使用Restkit的優點:
-將HTTP請求/響應API以及對象映射,脫機/緩存支持與Core Data結合在一起,全部集成在一個框架中
-對象映射意味着您正在編寫簡潔的代碼,定義類以及它們如何映射到JSON屬性,然后在執行GET / POST / DELETE之后只需幾行代碼
-核心數據支持意味着您的項目可以離線工作,在線工作時數據是同步的,但是當您離線時數據是持久的
-框架維護良好

缺點:
-僅適用於JSON REST API
-在某些方面可能會有陡峭的學習曲線
-如果您使用的不是完全“標准”的REST API,可能會遇到挑戰

最簡單的方法是將guid屬性(例如,類型為NSString的標識符)添加到您感興趣的實體,並在導入數據時檢查該guid。

在這里,您有兩種方法:讓服務器為您生成Guid或在客戶端(iPhone,iPad等)實現自己的算法。 在這兩種情況下,您都需要確保每個消息的GUI都是唯一的。

因此,例如,假設服務器生成了消息(每個消息都有自己的GUID)。 導入數據時,還要保存每個消息對象的GUID。 如果您已經有帶有特定GUID的消息,則不要添加它,否則就添加它。 可以使用“ 查找或創建”模式來完成此操作(請參閱有效地實現查找或創建 )。

希望能有所幫助。

這很簡單,我花了一些時間來學習它,我在大多數應用程序中都使用了它。

首先,您需要獲取的項目的ID,例如messageID。 當您使用所有項目(例如,使用AFNetworking)獲取JSON時,您將在NSDictionaries中收到一個對象數組。

在解析項目之前,將存儲的項目的所有ID加載到NSMutableDictionary中(鍵=> messageID,值objectID,這與Core Data故障有關)。

不要忘記在某個地方初始化NSMutableArray:

_dictionaryOfEventIDAndObjectID = [NSMutableDictionary dictionary];

- (void)prepareDictionaryOfMessageIDs
{
    [self.dictionaryOfEventIDAndObjectID removeAllObjects];

    NSError *error = nil;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Message"];
    [fetchRequest setResultType:NSDictionaryResultType];
    NSExpressionDescription *objectIDDescription = [[NSExpressionDescription alloc] init];
    objectIDDescription.name = @"objectID";
    objectIDDescription.expression = [NSExpression expressionForEvaluatedObject];
    objectIDDescription.expressionResultType = NSObjectIDAttributeType;
    [fetchRequest setPropertiesToFetch:@[objectIDDescription, @"messageID"]];

    NSArray *objectsDict = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    for (NSDictionary *objectDict in objectsDict) {
        [self.dictionaryOfMessageIDAndObjectID setObject:[objectDict valueForKeyPath:@"objectID"] forKey:[objectDict valueForKeyPath:@"messageID"]];
    }
}

然后在獲取的數據完成塊中添加以下內容:

    for (NSDictionary *objectDict in objectsDict) {

        NSString *fetchedID = [objectDict objectForKey:@"id"];

        if ([self.dictionaryOfMessageIDAndObjectID objectForKey:fetchedID]) {
            continue;
        }

        [self parseMessageFromDictionary:objectDict];
    }

暫無
暫無

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

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