本文以资讯App开发实例简单说一下CoreData在实际开发中的应用,直接上代码说明,实际开发过程如下:
一。创建CoreData实体(数据表)数据模型
News
NewsDetail
LoopNews
如图:
创建三个实体模型(数据表)及关联关系
在Default中创建三个实体模型的类名称,并用Editor菜单创建三个NSManagedObject对象
如三个对像NewsEntity对象如下图,注:必须自动生成创建,实体对象类手动创建在实际运行中可能因关联关系属性会出错。
主要要实现的CoreDataFactory.h相关接口代码如下:
@interface CoreDataFactory : NSObject
{
NSManagedObjectContext *_managedObjectContext; //数据上下文
NSManagedObjectModel *_managedObjectModel; //数据模型(插入数据,查询数据,删除数据)
NSPersistentStoreCoordinator *_persistentStoreCoordinator; //持久化存储助理(设置数据存储的名字,位置,存储方式,和存储时机)
//NSManagedObject //被管理的数据记录(数据库中的表记录)
//NSFetchRequest //获取数据的请求(查询语句)
//NSEntityDescription //实体结构(表结构)
}
@property (nonatomic,readonly,getter = managedObjectContext) NSManagedObjectContext *managedObjectContext; //上下文对象
@property (nonatomic,readonly) NSManagedObjectModel *managedObjectModel; //数据模型
@property (nonatomic,readonly) NSPersistentStoreCoordinator *persistentStoreCoordinator; //持久化存储助理
/** 单例 */
+ (CoreDataFactory *)singleton;
/** 保存数据到持久层(数据库)*/
- (void)saveContext;
实现的BaseObjectModel.h相关接口代码如下:
@interface BaseObjectModel : NSObject
/** 新增实体数据 */
- (BOOL)addEntity:(id)aEntity inCotext:(NSManagedObjectContext *)aContext;
/** 删除实体数据 */
- (BOOL)deleteEntity:(id)aEntity inCotext:(NSManagedObjectContext *)aContext;
/** 查询实体 */
- (NSArray *)getEntity:(NSString *)aEntityName page:(int)aPage pageSize:(int)aPageSize sortASC:(BOOL)aSortASC sortField:(NSString *)aSortField inCotext:(NSManagedObjectContext *)aContext;
/** 获取空实体 */
- (id)getEmptyEntityWithContext:(NSManagedObjectContext *)aContext withName:(NSString*)aEntityName;
/** 获取数据库context上下文 */
- (NSManagedObjectContext *)getContext;
@end
实现的LocalNewsModel.h相关接口代码如下:
#import "BaseObjectModel.h"
#import "NewsEntity.h"
#import "LoopNewsEntity.h"
#define NEWS_PAGESIZE 20 //每页资讯数
@class NewsObject;
@interface LocalNewsModel : BaseObjectModel
/** 单例 */
+ (LocalNewsModel *)singleton;
/**
* 根据资讯ID查询资讯是否存在
*
* @param aId 资讯ID
* @return 本地资讯实体对象
*/
- (NewsEntity *)getNewsById:(int)aId;
/**
* 查询本地资讯,转换成NewsObject对象
*
* @param aId 资讯ID
*
* @return 资讯对象
*/
- (NewsObject *)getLocalByNews:(int)aId;
/**
* 根据轮播图ID查询轮播图是否存在
*
* @param aId 轮播图ID
*
* @return 本地轮播图地图
*/
- (LoopNewsEntity *)getLoopNewsById:(int)aId;
/**
* 添加资讯,存在时更新,不存在时插入
*
* @param aNewsAry 资讯对象数组
* @param aCateId 栏目ID
* @param aSchoolId 学校ID
*/
- (void)addNewsToLocal:(NSArray *)aNewsAry cateId:(int)aCateId subCateId:(int)aSubCateId schoolId:(int)aSchoolId;
/**
* 添加资讯,存在时更新,不存在时插入
*
* @param aNewsAry 资讯对象数组
* @param context 上下文
*/
- (void)addNewsToLocal:(NSArray *)aNewsAry cateId:(int)aCateId subCateId:(int)aSubCateId schoolId:(int)aSchoolId inContext:(NSManagedObjectContext *)aContext;
/**
* 添加轮播图资讯至数据库,存在时更新,不存在时插入
*
* @param aLoopNewsAry 轮播图资讯对象数组
* @param aCateId 栏目ID
* @param aSchoolId 学校ID
*/
- (void)addLoopNewsToLocal:(NSArray *)aLoopNewsAry cateId:(int)aCateId schoolId:(int)aSchoolId;
/**
* 添加轮播图资讯至数据库,存在时更新,不存在时插入
*
* @param aLoopNewsAry 轮播图资讯对象数组
* @param aCateId 栏目ID
* @param aSchoolId 学校ID
* @param context 上下文
*/
- (void)addLoopNewsToLocal:(NSArray *)aLoopNewsAry cateId:(int)aCateId schoolId:(int)aSchoolId inContext:(NSManagedObjectContext *)context;
/**
* 清理传入日期之前的本地缓存数据
*
* @param date 清理日期
*/
- (void)clearNewsBeforeDate:(NSDate *)date;
/**
* 分页查询资讯
*
* @param page 分页参数
* @param aCateId 栏目ID
* @param aSchoolId 学校ID
*
* @return 资讯列表
*/
- (NSArray *)getNewsList:(int)aPage cateId:(int)aCateId subCateId:(int)aSubCateId schoolId:(int)aSchoolId;
/**
* 查询轮播图列表
*
* @param aCateId 栏目ID
* @param aSchoolId 学校ID
*
* @return 轮播图列表
*/
- (NSArray*)getLoopNewsList:(int)aCateId schoolId:(int)aSchoolId;
/**
* 标记为已读
*
* @param newsObject 资讯对象
*/
- (void)markAsRead:(NewsObject *)aNewsObject;
/**
* 获取已读文章ID列表(只取ID)
*
* @return 已读文章列表ID
*/
- (NSMutableArray *)getReadNewsList;
@end
大体思路就是这样的,根据业务创建CoreData实体模型,在CoreDataDb中装CoreData所要实际的数据模型的相关添、 删、改、查及本地存储全部存储好,方便与Model下的网络请求类NewsDataRequest.h的资讯类进行数据转换,根据网络状态和产品要求实现调取服务端还是本地CoreData的sqlite数据库中的数据,并实现本地和服务端数据的实时同步处理。在UIViewController.h中去实现数据的写入本地或从本地数据库读取数据。
后边我会介绍一下ASIDownloadCache实现url的cache,使我们所绘制的UI无论在有网络还是无网络状态下都可以正常访问来改善提高我们app的用户体验。