本文以资讯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;
@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
#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
后边我会介绍一下ASIDownloadCache实现url的cache,使我们所绘制的UI无论在有网络还是无网络状态下都可以正常访问来改善提高我们app的用户体验。