CoreData做资讯类文章离线下载的持久化处理方案
2014-08-30 17:16
323 查看
本文以资讯App开发实例简单说一下CoreData在实际开发中的应用,直接上代码说明,实际开发过程如下:
一。创建CoreData实体(数据表)数据模型
News
NewsDetail
LoopNews
如图:
创建三个实体模型(数据表)及关联关系
在Default中创建三个实体模型的类名称,并用Editor菜单创建三个NSManagedObject对象
如三个对像NewsEntity对象如下图,注:必须自动生成创建,实体对象类手动创建在实际运行中可能因关联关系属性会出错。
主要要实现的CoreDataFactory.h相关接口代码如下:
实现的BaseObjectModel.h相关接口代码如下:
实现的LocalNewsModel.h相关接口代码如下:
大体思路就是这样的,根据业务创建CoreData实体模型,在CoreDataDb中装CoreData所要实际的数据模型的相关添、 删、改、查及本地存储全部存储好,方便与Model下的网络请求类NewsDataRequest.h的资讯类进行数据转换,根据网络状态和产品要求实现调取服务端还是本地CoreData的sqlite数据库中的数据,并实现本地和服务端数据的实时同步处理。在UIViewController.h中去实现数据的写入本地或从本地数据库读取数据。
后边我会介绍一下ASIDownloadCache实现url的cache,使我们所绘制的UI无论在有网络还是无网络状态下都可以正常访问来改善提高我们app的用户体验。
一。创建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的用户体验。
相关文章推荐
- CYQ.Data V4.5 离线帮助文档发布下载
- 在xcode 4.2.1中通过RHManagedObject 和RHManagedObjectContextManager 来简化 CoreData的处理
- iOS.数据持久化.PersistenceLayer.Core Data
- CoreData学习-最好的一片文章
- iOS 之Core Data持久化存储
- 精华文章、技术资料,二次开发源代码,行业方案,GIS知识下载索引
- JSP中文文件名下载(含IE处理方案)
- 支持多种浏览器下载的文件名处理方案
- CSDN博客 Android 客户端免费下载, 阅读博客和资讯,搜索博客,离线阅读
- 升级app时coreData的处理及注意事项
- CYQ.Data V4.5 离线帮助文档发布下载
- iOS6 编程:Core Data持久化数据存储(3)-编写Core Data代码
- iOS 6 编程--Core Data持久化数据存储(2)-使用Core Data实现简单ShoppingCart应用程序
- iOS 数据持久化 -- Core Data (2)
- Core Data持久化数据存储(2)-使用Core Data实现简单ShoppingCart应用程序
- iPhone:Core Data 相关文章
- iOS6 编程:Core Data持久化数据存储(1)-Core Data 堆栈
- IOS6 编程:Core Data持久化数据存储(5)-使用Core Data模板创建EntLibCart项目
- IOS数据持久化之Core Data(二) - 单表操作
- iOS 数据持久化之CoreData(二)堆栈建立和基本操作Demo