[英]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.