2013-10-24 89 views
0

我有一個返回不同參數的JSON請求,例如name。我想緩存名稱參數的變量,我可以在應用程序中查看它。如何在本地存儲JSON資源?

例如:來自JSON request的名稱= david。該變量被稱爲firstnamefirstname應該等於「大衛」。應該存儲firstname,以便我可以在我的應用程序的所有部分查看它。

+2

這是非常廣泛的,你可以使用NSUserDefaults,你可以使用CoreData,如果它只是應用程序的生命所需要的,那麼你將它作爲一個單例存儲在內存中。 – Tim

+0

[將字符串保存到NSUserDefaults?](http://stackoverflow.com/questions/3074483/save-string-to-the-nsuserdefaults) – RyanR

回答

1

首先,您可能會考慮checking out RestKit,因爲它在iOS中成功完成了一系列服務器交互和CoreData持久性。

我的時間有點短(在午餐時間休息),所以我只是懶洋洋地從一個應用程序中發佈一個例子。

- (void)loadFiltersFromJSON { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"FreeFilterBank" ofType:@"json"]; 
    NSData *filterData = [NSData dataWithContentsOfFile:path]; 

    NSError *err; 
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:filterData options:kNilOptions error:&err]; 
    if (err) { //TODO this can be removed prior to shipping the app 
     NSLog(@"%@", err); 
    } 
    NSArray *definedFilters = [json objectForKey:@"Filter"]; 
    NSManagedObjectContext* moc = [self managedObjectContext]; 

    for (NSDictionary *filter in definedFilters) { 
     NSString *name = [filter valueForKey:@"name"]; 
     BOOL exists = [self alreadyExists:name inManagedObjectContext:moc]; 
     if (!exists) { 
      NSString *imageNamed = [filter valueForKey:@"imageName"]; 
      NSString *filterDesignator = [filter valueForKey:@"filterDesignator"]; 
      NSString *paid = [filter valueForKey:@"paidOrFree"]; 
      [self createFilterWithName:name imageNamed:imageNamed filterDesignator:filterDesignator paidOrFree:paid]; 
     } 
    } 


} 

- (BOOL)alreadyExists:(NSString*)filterNamed inManagedObjectContext:(NSManagedObjectContext*)moc { 
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name == %@", filterNamed]; 
    NSEntityDescription* description = [NSEntityDescription entityForName:@"Filter" inManagedObjectContext:moc]; 
    NSFetchRequest* request = [[NSFetchRequest alloc] init]; 
    [request setEntity:description]; 
    [request setPredicate:predicate]; 
    NSError* error; 
    NSArray* fetchedResult = [moc executeFetchRequest:request error:&error]; 
    if (error) { 
     NSLog(@"%@",error.localizedDescription); 
    } 

    if (fetchedResult.count == 0) { 
     return NO; 
    } 
    else { 
     return YES; 
    } 

} 

- (void)createFilterWithName:(NSString*)name imageNamed:(NSString*)imageName filterDesignator:(NSString*)designator paidOrFree:(NSString *)paid { 
    NSManagedObjectContext* moc = [self managedObjectContext]; 
    Filter* newFilter = [NSEntityDescription insertNewObjectForEntityForName:@"Filter" inManagedObjectContext:moc]; 
    newFilter.name = name; 
    newFilter.imageName = imageName; 
    newFilter.filterDesignator = designator; 
    newFilter.paidOrFree = paid; 

    NSError* error; 
    [moc save:&error]; 
    if (error) { 
     NSLog(@"%@",error.localizedDescription); 
    } 
} 

TL; DR從存儲束中的JSON此加載數據,檢查SQLite的數據存儲,看看我們是否已經有相同名稱的東西,並創建該對象的一個​​新的持久化實例,如果我們不「T。

就這個例子來說,除了這個例子之外,還有很多更多的調用來自Web上的序列化數據和iOS內部的持久數據。

+0

無論您當前的項目是由NSUserDefaults還是CoreData提供最佳服務。我真的很建議熟悉CoreData,它在各種各樣的情況下非常有用,尤其是因爲持久數據在處理應用程序中斷和背景/前景轉換時更加強大。 –

0

最簡單的方法是使用NSUserDefaults並將密鑰設置爲@「firstname」,值將是@「david」。話雖如此,你可能會考慮使用更好的持久性模型,如CoreData。您也可以使用Sqlite數據庫或將鍵/值保存在plist中。有很多方法可以做到這一點。

僅供參考,請參閱本: Save string to the NSUserDefaults?

2

對於一些簡單的字符串,快速和骯髒的解決方案是將其存儲在NSUserDefaults

存儲

[[NSUserDefaults standardDefaults] setObject:firstname forKey:@"kUserFirstName"]; 
[[NSUserDefaults standardDefaults] synchronize]; 

檢索

NSString *string = [[NSUserDefaults standardDefaults] objectforKey:@"kUserFirstName"]; 

如果它變得複雜多了,你必須要考慮一個更有條理的持久性存儲。有效的選項是CoreData

存在一些框架可能會幫助您在CoreData中存儲JSON資源,最有趣的是RestKit