2013-10-22 78 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.