IOS之分析网易新闻存储数据(CoreData的使用,增删改查)

用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的。

首先:

1、网易新闻用CoreData存储了新闻列表,因为我打开网易新闻的Documents时看到了三个文件:

newsapp.sqlite,newsapp.sqlite-shm,newsapp.sqlite-wal:这三个文件是你在用CoreData时自动生成的。所以我确定他是用coredata存储的数据而不是sqlite数据库。(CoreData优点:能够合理管理内存,避免使用sql的麻烦,高效)

2、网易会隔一断时间请求一次网络,具体时间有可能是隔8个小时或者5个小时或者3个小时都有可能,这个我无法确定时间。反正确实在一定时间后会清空一下数据库并且添加新的请求来的新闻。

3、查看网易新闻后会有一个记录状态,表示已看过,这个也在数据库中存储着。

我这里就简单的实现一下网易新闻的界面,主要讲一下如何用CoreData存储数据,并实现增删改查。

实现的效果:

Demo下载地址:http://download.csdn.net/detail/rhljiayou/6833273

如果Demo打不开请选择一下版本:

首先关于UItableViewCell的使用,大家可以参考此博文:IOS高访新浪微博界面(讲解如何自定义UITableViewCell,处理@#链接 特殊字符)

CoreData介绍参考官方:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdTechnologyOverview.html#//apple_ref/doc/uid/TP40009296-SW1

接下来是如何创建CoreData:

命名为NewsModel:

添加CoreData框架

导入#import<CoreData/CoreData.h>

贴代码之前需要了解6个对象:

1、NSManagedObjectContext

管理对象,上下文,持久性存储模型对象

2、NSManagedObjectModel

被管理的数据模型,数据结构

3、NSPersistentStoreCoordinator

连接数据库的

4、NSManagedObject

被管理的数据记录

5、NSFetchRequest

数据请求

6、NSEntityDescription

表格实体结构

此外还需要知道.xcdatamodel文件编译后为.momd或者.mom文件

以下是封装好的CoreData管理类CoreDataManager.h:

[cpp] view plaincopy

  1. #import <Foundation/Foundation.h>
  2. #import "News.h"
  3. #define TableName @"News"
  4. @interface CoreDateManager : NSObject
  5. @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
  6. @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
  7. @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
  8. - (void)saveContext;
  9. - (NSURL *)applicationDocumentsDirectory;
  10. //插入数据
  11. - (void)insertCoreData:(NSMutableArray*)dataArray;
  12. //查询
  13. - (NSMutableArray*)selectData:(int)pageSize andOffset:(int)currentPage;
  14. //删除
  15. - (void)deleteData;
  16. //更新
  17. - (void)updateData:(NSString*)newsId withIsLook:(NSString*)islook;
  18. @end

以下是.m的实现:

[cpp] view plaincopy

  1. //
  2. //  CoreDateManager.m
  3. //  SQLiteTest
  4. //
  5. //  Created by rhljiayou on 14-1-8.
  6. //  Copyright (c) 2014年 rhljiayou. All rights reserved.
  7. //
  8. #import "CoreDateManager.h"
  9. @implementation CoreDateManager
  10. @synthesize managedObjectContext = _managedObjectContext;
  11. @synthesize managedObjectModel = _managedObjectModel;
  12. @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
  13. - (void)saveContext
  14. {
  15. NSError *error = nil;
  16. NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
  17. if (managedObjectContext != nil) {
  18. if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
  19. // Replace this implementation with code to handle the error appropriately.
  20. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
  21. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  22. abort();
  23. }
  24. }
  25. }
  26. #pragma mark - Core Data stack
  27. // Returns the managed object context for the application.
  28. // If the context doesn‘t already exist, it is created and bound to the persistent store coordinator for the application.
  29. - (NSManagedObjectContext *)managedObjectContext
  30. {
  31. if (_managedObjectContext != nil) {
  32. return _managedObjectContext;
  33. }
  34. NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  35. if (coordinator != nil) {
  36. _managedObjectContext = [[NSManagedObjectContext alloc] init];
  37. [_managedObjectContext setPersistentStoreCoordinator:coordinator];
  38. }
  39. return _managedObjectContext;
  40. }
  41. // Returns the managed object model for the application.
  42. // If the model doesn‘t already exist, it is created from the application‘s model.
  43. - (NSManagedObjectModel *)managedObjectModel
  44. {
  45. if (_managedObjectModel != nil) {
  46. return _managedObjectModel;
  47. }
  48. NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"NewsModel" withExtension:@"momd"];
  49. _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  50. return _managedObjectModel;
  51. }
  52. // Returns the persistent store coordinator for the application.
  53. // If the coordinator doesn‘t already exist, it is created and the application‘s store added to it.
  54. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
  55. {
  56. if (_persistentStoreCoordinator != nil) {
  57. return _persistentStoreCoordinator;
  58. }
  59. NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"NewsModel.sqlite"];
  60. NSError *error = nil;
  61. _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
  62. if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
  63. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  64. abort();
  65. }
  66. return _persistentStoreCoordinator;
  67. }
  68. #pragma mark - Application‘s Documents directory
  69. // Returns the URL to the application‘s Documents directory.获取Documents路径
  70. - (NSURL *)applicationDocumentsDirectory
  71. {
  72. return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
  73. }
  74. //插入数据
  75. - (void)insertCoreData:(NSMutableArray*)dataArray
  76. {
  77. NSManagedObjectContext *context = [self managedObjectContext];
  78. for (News *info in dataArray) {
  79. News *newsInfo = [NSEntityDescription insertNewObjectForEntityForName:TableName inManagedObjectContext:context];
  80. newsInfo.newsid = info.newsid;
  81. newsInfo.title = info.title;
  82. newsInfo.imgurl = info.imgurl;
  83. newsInfo.descr = info.descr;
  84. newsInfo.islook = info.islook;
  85. NSError *error;
  86. if(![context save:&error])
  87. {
  88. NSLog(@"不能保存:%@",[error localizedDescription]);
  89. }
  90. }
  91. }
  92. //查询
  93. - (NSMutableArray*)selectData:(int)pageSize andOffset:(int)currentPage
  94. {
  95. NSManagedObjectContext *context = [self managedObjectContext];
  96. // 限定查询结果的数量
  97. //setFetchLimit
  98. // 查询的偏移量
  99. //setFetchOffset
  100. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
  101. [fetchRequest setFetchLimit:pageSize];
  102. [fetchRequest setFetchOffset:currentPage];
  103. NSEntityDescription *entity = [NSEntityDescription entityForName:TableName inManagedObjectContext:context];
  104. [fetchRequest setEntity:entity];
  105. NSError *error;
  106. NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
  107. NSMutableArray *resultArray = [NSMutableArray array];
  108. for (News *info in fetchedObjects) {
  109. NSLog(@"id:%@", info.newsid);
  110. NSLog(@"title:%@", info.title);
  111. [resultArray addObject:info];
  112. }
  113. return resultArray;
  114. }
  115. //删除
  116. -(void)deleteData
  117. {
  118. NSManagedObjectContext *context = [self managedObjectContext];
  119. NSEntityDescription *entity = [NSEntityDescription entityForName:TableName inManagedObjectContext:context];
  120. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  121. [request setIncludesPropertyValues:NO];
  122. [request setEntity:entity];
  123. NSError *error = nil;
  124. NSArray *datas = [context executeFetchRequest:request error:&error];
  125. if (!error && datas && [datas count])
  126. {
  127. for (NSManagedObject *obj in datas)
  128. {
  129. [context deleteObject:obj];
  130. }
  131. if (![context save:&error])
  132. {
  133. NSLog(@"error:%@",error);
  134. }
  135. }
  136. }
  137. //更新
  138. - (void)updateData:(NSString*)newsId  withIsLook:(NSString*)islook
  139. {
  140. NSManagedObjectContext *context = [self managedObjectContext];
  141. NSPredicate *predicate = [NSPredicate
  142. predicateWithFormat:@"newsid like[cd] %@",newsId];
  143. //首先你需要建立一个request
  144. NSFetchRequest * request = [[NSFetchRequest alloc] init];
  145. [request setEntity:[NSEntityDescription entityForName:TableName inManagedObjectContext:context]];
  146. [request setPredicate:predicate];//这里相当于sqlite中的查询条件,具体格式参考苹果文档
  147. //https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html
  148. NSError *error = nil;
  149. NSArray *result = [context executeFetchRequest:request error:&error];//这里获取到的是一个数组,你需要取出你要更新的那个obj
  150. for (News *info in result) {
  151. info.islook = islook;
  152. }
  153. //保存
  154. if ([context save:&error]) {
  155. //更新成功
  156. NSLog(@"更新成功");
  157. }
  158. }
  159. @end

此句:

[cpp] view plaincopy

  1. NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"NewsModel.sqlite"];

生成以后,你可以在Documents下面看到三个文件:

那么你可以打开NewsModel.sqlite文件看一下里面的表格:

Z_METADATA里面记录了一个本机的UUID。

Z_PRIMARYKEY里面是所有自己创建的表格的名字。

ZNEWS是自己创建的表格,打开里面就是我们的数据记录。

此外你需要了解查询时候需要正则表达式:(官方的)

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html

使用是只要:coreManager = [[CoreDateManageralloc]init];创建对象

增删改查:

[cpp] view plaincopy

  1. //增
  2. [coreManager insertCoreData:_resultArray];
  3. //删
  4. [coreManager deleteData];
  5. //改
  6. [coreManager updateData:info.newsid withIsLook:@"1"];
  7. //查
  8. [coreManager selectData:10 andOffset:0];</span>

具体实现看源码。

CoreData很强大,用起来很方便,是一个不错的存储数据的好方法。

ok!

转载注明原创:http://blog.csdn.net/rhljiayou/article/details/18037729

时间: 2024-10-11 05:29:03

IOS之分析网易新闻存储数据(CoreData的使用,增删改查)的相关文章

CoreData 入门使用 增删改查 swift

首先新建一个 点击新建的testInfo.xcdatamodeld 会出现这么个界面 创建完testInfo.xcdatamodeld之后 AppDelegate 会自动帮你添加支持coredata的代码 有兴趣的自己研究 首先 使用coredata 存储数据 1.创建表 2.创建字段 3.创建对应字段的模型类 就足够了 创建表 点击 然后出现 添加字段 .................... 创建对应字段的模型  command+n  都勾上之后会自动帮你创建一个类  好 一切准备完毕.  

MFC中对基于ODBC对数据ACCESS数据库的增删改查。

在MFC中可以使用很多方法对数据库进行操作. 什么ODBC  什么ADO之类的,这里要介绍使用的ODBC这种方法,通过本文的阅读可以达初步掌握在MFC里面通过ODBC访问ACCESS数据库. 涉及到的软件: 系统Win7 64位, 开发环境是VS2010,Office2007 . ××××××××××××××××××××××××××××××××××××××××××××××××××× ODBC是什么东东...? ODBC全称:Open Database Connectivity,开放数据库互连.

4-[表操作]--表的存储引擎、表的增删改查

1 2 3 25 5 原文地址:https://www.cnblogs.com/venicid/p/9020868.html

CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移

上一篇中我们已经使用CoreData创建了一个SQLite数据库 CoreData的简单使用(一)数据库的创建 现在对数据库进行数据的CRUD(增删改查) 1.Data Model 的设置 创建一个DataModel,取名CRUD.xcdatamodeld,添加Entity(Library和Book),添加属性,在Book中设置和Library的关联关系(一个Book可以存放在一个Library里) Book的属性和关联关系(选择Destination为Library,关系名称取名为librar

iOS界面-仿网易新闻左侧抽屉式交互

1.介绍 用过网易新闻客户端的同学都会发现,网易新闻向左滑动时,左侧的导航栏会跟着拖动出来,新闻内容列表会拉到最右侧.像一个抽屉拉出来一样.很酷.除了网易新闻,现在好多应用都采用了这样的交互. 对手势识别不熟悉的请参考上篇: iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) 这个交互效果主要用到两个手势,一个是pan拖拽,一个是tap点击.拖拽可以把抽屉拉出来,再推回去.点击可以把抽屉推回去. 效果如下:     那么这个效果如何实现呢? 2.实现思路和步骤 思路:从实现

ios CoreData框架的使用,对上下文数据的增删改查,表与表之间的关联,1对多,1对1,谓词查询,多表连接

这里是只是代码,因为博客插入图片效果不是很好,我自己写的总结比较详细,有兴趣的朋友可以在评论里留下邮箱,我收到后会发给大家. 转载注明出处,重视原创者的劳动成果,谢谢! - (void)viewDidLoad { [super viewDidLoad]; [self _creatTable];//插入数据 //    [self _query];// 查询数据 // KVC很霸道,即使readonly通过kvc也可赋值,kvo精华 //    Book * book = [[Book alloc

iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势)

本文转载至  http://blog.csdn.net/totogo2010/article/details/8637430 1.介绍 有的博友看了上篇博文iOS界面-仿网易新闻左侧抽屉式交互 ,在微博里问,网易新闻里的内容和评论的拖拽如何实现, 上面的UINavigation如何嵌进去.可能不少人有这样的需求,现在花了些时间把这两个效果做一下, 和大家分享交流.思路和上篇基本差不多,但是没有用到UINavigation,其实在我看来上面的返回. 评论按钮都是可以通过addsubview添加的.

iOS CoreData 增删改查详解

最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然Swift3 已经有了,目前整理的这个版本是Swift2 的.Swift 3 的话有些新特性. 需要另外调整,后续有时间再整理. 继承CoreData有两种方式: 创建项目时集成 这种方式是自动继承在AppDelegate里面,调用的使用需要通过UIApplication的方式来获取AppDelega

iOS CoreData (一) 增删改查

代码地址如下:<br>http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象,通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量! ##一.运行效果##二.程序实现 1. 首先创建一个coreData 模型文件:系统