Parse支持的数据类型
目前Parse的table column支持NSString, NSNumber, NSDate, NSData,
或者另外一个PFObject。同时也可以使用NSDictionary and NSArray保存结构化的数据。其中NSArray
支持相对应的查询。虽然可以使用NSData保存二进制数据,但是推荐先使用PFFile保存文件,比如照片等,而在对应的column保存PFFile
的引用。
常用的查询
类似SQL,查询时先创建PFQuery对象,然后设置查询条件。
先看个简单的,查询GameScore表中playName等于 “Dan Stemokoski”的所有记录。
- PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];[query whereKey:@"playerName" equalTo:@"Dan Stemkoski"];NSArray *objects = [query findObjects];
这个是查NSNumber,查询 playAge大于18的所有记录。
- [query whereKey:@"playerAge" greaterThan:[NSNumber numberWithInt:18]];
这个是查数组的,aryMatchTypes是一个NSArray的数组,下面的语句查询aryMatchTypes包含"Football"的所有记录。
复制代码
- [query whereKey:@"aryMatchTypes" equalTo:@"Football"];
既然是面向对象的,Parse也支持关联查询,下面的例子中Comment和Post都是Parse的对象,下面的代码可以查询包含myPost对象的所有comment记录。
- PFQuery *query = [PFQuery queryWithClassName:@"Comment"];
- [query whereKey:@"post" equalTo:myPost];
Parse支持子查询,下面的例子是找到所有comments的记录,其中的post含有image。
- PFQuery *innerQuery = [PFQuery queryWithClassName:@"Post"];
- [innerQuery whereKeyExists:@"image"];
- PFQuery *query = [PFQuery queryWithClassName:@"Comment"];
- [query whereKey:@"post" matchesQuery:innerQuery];
或查询,很遗憾,Parse不支持OR条件查询,只支持AND,要用OR的话可以用Compound query,类似SQL的Union
- PFQuery *lotsOfWins = [PFQuery queryWithClassName:@"Player"];
- [lotsOfWins whereKey:@"wins" greaterThan:[NSNumber numberWithInt:150]];
- PFQuery *fewWins = [PFQuery queryWithClassName:@"Player"];
- [lotsOfWins whereKey:@"wins" lessThan:[NSNumber numberWithInt:5]];
- PFQuery *query = [PFQuery orQueryWithSubqueries:[NSArray arrayWithObjects:fewWins,lotsOfWins,nil]];
缓存
查询的结果集合支持缓存,也可以设定不同的缓存策略。缓存都是Query级别的。
- query.cachePolicy = kPFCachePolicyNetworkElseCache;
可以指定以下几种缓存策略:
kPFCachePolicyIgnoreCache: 查询结果来自服务器,而且也不会保存在缓存。这是默认的设定。
kPFCachePolicyCacheOnly : 只从缓存取数据。如果缓存没有数据会产生PFError,也可以忽略不处理这个error。
kPFCachePolicyNetworkOnly: 只从网络取数据,同时保存在缓存。
kPFCachePolicyCacheElseNetwork: 先从缓存取数据,如果没有的话,再从网络取。
kPFCachePolicyNetworkElseCache: 先从网络取数据, 没有的话再从缓存取。
kPFCachePolicyCacheThenNetwork;
先从缓存取数据,无论结果如何都会再次调用callback函数查询服务器。也就是说会产生2次调用。通常的用法是先快速取出数据展示view,然后再后
台连接网络取得最新数据,取到后用来自网络服务器的最新数据更新view。这种policy不能用于findObjects方法,只能用在异步调用的
findObjectsInBackground。
第六种策略引出了Parse的一大特色: 后台异步调用,这也是iOS网络APP开发经常需要解决的问题,Parse可以让用户无需在按下某个按钮后无所是从的看着一动不动的屏幕发呆。Parse提供了多种解决方案,有空再讲。
分享到: