CoreData做资讯类文章离线下载的持久化处理方案

本文以资讯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的用户体验。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值