2013-10-22 116 views
3

我在寫一個以JSON格式讀取數據的應用程序。它應該是一個分類廣告應用程序。例如,它從單獨的JSON文件中提取類別列表,子類別和每個廣告。現在我想添加一個搜索選項。問題是我不知道是否有可能通過JSON文件進行搜索,以及它是否有效。有沒有人有更好的方式來做到這一點?如何搜索JSON文件?

+0

有看看這裏http://stackoverflow.com/questions/777455/is-there-a-query-language-for-json – PeterMmm

+0

你可以加載文件到NSArray然後filterUsingPredicate:[NSPredicate predicateWithBlock ^:...] – kgu87

+0

@這是我首先想到的。但讓我們說,即時通訊在主頁,我想尋找一輛2008年的寶馬。因此,應用程序必須開始將每個類別的詳細信息解析爲數組或字典,然後執行搜索。這絕對會導致內存不足! – user3687

回答

4

如果你想爲了避免使用數據庫,您只有幾個選項。將它們加載到內存中(前端或延遲)。這有利於以內存佔用成本(空間和時間)爲代價實現更快的速度。但是,在你的評論中,你說過這會使用很多內存。另一種選擇是每次加載和卸載每個JSON文檔。但是如果你擔心由於文檔數量造成的內存佔用,這可能會太慢。有一種方法可以創建自己的本土索引,但是在那個時候,你開始創建自己的數據庫。

因此,最終,這聽起來像你努力努力避免使用數據庫。

考慮CoreData或SqlLite

如果您想使用簡單的JSON文檔,請考慮EJDB這是一個基於嵌入式JSON文檔的文檔數據庫(如MongoDb)。還有一個叫做EJDBKit的objective-c wrapper for EJDB

它的目標是可以被嵌入到 C/C++ ,. NET的NodeJS,Python和Lua中,轉到一個快速的MongoDB樣庫,在LGPL許可的 條款Java和Ruby應用程序。

EJDB是基於東京內閣改進版本的C庫。

基於 çBSON

0

要從JSON文件中進行搜索,首先需要解析它。一旦你獲得了NSDictionary那麼你可以使用NSPredicate通過它來搜索

NSData *theData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"fileName"ofType:@"json"]]; 
NSDictionary *myJSONData = [NSJSONSerialization JSONObjectWithData:theData options:NSJSONReadingMutableContainers error:nil]; 

按照此步驟。

希望這將幫助你

+0

或NSArray當然 –

+0

好吧,我知道它需要解析。但即時編寫分類廣告應用程序。當你在主頁上並且想要搜索特定項目時,所有的JSON對象都必須被解析爲數組或字典。這不好!我需要另一種解決方案我開始懷疑它是否可能帶有JSON。 – user3687

0

假設你是在本地存儲的廣告數據,那麼另一個選擇是使用SimpleDB的,我寫了一個鍵/值數據存儲與API實現的查詢和數據的JSON表示。有了它,你將存儲你的JSON值,然後返回符合你的需求的密鑰。 (https://github.com/AaronBratcher/SimpleDB

[SimpleDB setValue:adJSONValue forKey:myKey inTable: kAdsTable]; 

你passingTest代碼塊將在同一時間只分析1個項目,所以內存不會是一個問題,這似乎是你的心頭大患。

您的代碼將是這個樣子:

self.ads = [SimpleDB keysInTable:kAdsTable orderByJSONValueForKey:@"name" passingTest:^BOOL(NSString *key, NSString *value, NSDate *dateAdded, NSDate *dateModified) { 
     Ad *ad = [[Ad alloc] initWithJSON:value]; 
     BOOL include = NO; 

     // do testing here 

     return include; 
    } 
}]; 

你可以這樣使用鍵,讓您的TableView中的行數和填充你的時候,因爲需要創建對象:

UITableViewCell *cell = AdCell; 
Ad *ad = [[Ad alloc] initWithJson:[SimpleDB valueForKey:[self.ads[indexPath.row]] inTable:kAdsTable]; 
cell.ad = ad; 
return cell; 

// This is assuming you have a subclass of UITableViewCell to handle the population of the cell's contents.