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

ios-CoreData添加、删除数据,聊天记录式分页查询.zip 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.youkuaiyun.com/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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. #import <Foundation/Foundation.h>  
  2. #import "News.h"  
  3. #define TableName @"News"  
  4.   
  5. @interface CoreDateManager : NSObject  
  6.   
  7. @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;  
  8. @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;  
  9. @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;  
  10.   
  11. - (void)saveContext;  
  12. - (NSURL *)applicationDocumentsDirectory;  
  13.   
  14. //插入数据  
  15. - (void)insertCoreData:(NSMutableArray*)dataArray;  
  16. //查询  
  17. - (NSMutableArray*)selectData:(int)pageSize andOffset:(int)currentPage;  
  18. //删除  
  19. - (void)deleteData;  
  20. //更新  
  21. - (void)updateData:(NSString*)newsId withIsLook:(NSString*)islook;  
  22.   
  23. @end  

以下是.m的实现:

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

此句:

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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 plain copy 在CODE上查看代码片 派生到我的代码片
  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.youkuaiyun.com/rhljiayou/article/details/18037729

IOS sqlite 完成增删改查 IOS sqlite UI界面 增删改查 对sqlite简单封装,并用UI界面完成对用户数据的增删改查,将数据库表封装成对象,通过操作对象来操作数据库 立即下载

相关推荐

网易新闻分类数据

已分类,共9个文件夹,每个文件夹一类,总计14000篇新闻

【CoreData】使用命令查看数据

最近在使用CoreData的过程中,想要查看项目中的保存方法是否有效写入磁盘。于是就找到了模拟器沙盒中的文件: 发现这其中有三个文件,实际数据目前只是先存放在wal后缀文件中。WAL机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。(参考来源:S...

fang20180409的博客 1407

Docker拉取ubuntu22.04镜像使用ROS2 humble及仿真工具可视化进行导航

Docker中安装Ubun22以及ROS,gazebo可视化等

lovebc的博客 1678

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

用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的。 首先: 1、网易新闻用CoreData存储了新闻列表,因为我打开网易新闻的Documents时看到了三个文件: newsapp.sqlite,newsapp.sqlite-shm,news...

weixin_30338743的博客 161

【鸿蒙南向开发】OpenHarmony音频驱动audio适配方案

这份鸿蒙(HarmonyOS NEXT)文档包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS_666的博客 4515

金融领域强化学习在多资产类别动态交易执行中的应用

在金融市场中,多资产类别的交易执行面临着诸多挑战,如市场的不确定性、资产间的复杂相关性等。传统的交易策略往往难以适应动态变化的市场环境。本研究的目的在于探索如何运用强化学习技术,实现多资产类别在动态市场环境下的高效交易执行。具体范围涵盖了从强化学习的基本原理到在多资产交易场景中的实际应用,包括核心算法的实现、数学模型的构建以及项目实战等方面。本文首先介绍研究背景,包括目的、预期读者和文档结构。接着阐述核心概念,包括强化学习和多资产类别动态交易执行的原理及其联系。

AI 领航者的博客 630

ios中的coredata的使用

Core Data数据持久化是对SQLite的一个升级,它是ios集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类。    (1)NSManagedObjectModel(被管理的对象模型)            相当于实体,不过它包含 了实体间的关系     (2)NSManagedObjectContext(被管理的对象上下文)      

Mirage520的专栏 808

CZT与FFT频谱分析方法对比:从任意频带重采样到高精度频谱分析

M = 85 % 输出点数f0 = 70 Hz % 起始频率DELF = 0.4 Hz % 频率步长频率分辨率提高到0.4 Hz分析带宽聚焦在[70, 103.6]Hz更清晰地分辨出78Hz和82Hz的频率分量。

2403_88098319的博客 1860

华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“

我们的生活态度就应该是 “不抱怨” ! 其实我想写这篇文章很久了,因为自己做的iOS开发 ,对数据这一块有这极高的要求.所以一些必须的存储数据的使用,我们都有必要熟悉用法.在以前我的简书中我也是写过数据持久化,但是我觉得那一篇是不够完整的,所有我把"增删改查"这个话题单独拿出来说一下. 今天主要说4个方面的增删改查,分别是数组,字典,SQLite数据库,CoreData数据. 数组 首先说一下数组的增删改查.数组结构是我们做开发中经常使用的一种结构.然后看一下数组的"增删改查"是如何进行的吧.当然.

得不到的永远是骚栋. 661

利用 SAP Joule 提升 ABAP 开发效率的前提条件与限制全解析

综上,想要在 ABAP Development Tools 中顺利使用 SAP Joule,既要准备好 BTP、IAS、ABAP 系统与 ADT 的版本与信任链,也要理解许可证、配额、语法范围等限制。只有在这些前提全部满足后,Joule 才能真正发挥生成式 AI 的价值,帮助 ABAP 开发者从繁琐模板中解放出来,把注意力投入在业务创新与 Clean Core 改造之上。未来 SAP 还将扩展中文语境、自动修复建议以及跨系统智能代理等功能,值得持续关注。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 664

基于STM32L4XX、HAL库的ICM-42607-P姿态传感器驱动程序设计

/ 转换为dps(±1000dps量程)float accel_x = sensor_data.accel_x * (8.0f / 32768.0f);// 转换为g值(±8g量程)#define ICM42607_I2C_ADDR 0x68 << 1 // I2C地址(SA0=0)= 0x40) { // ICM-42607的WHO_AM_I值为0x40。// 读取传感器数据。

zhusl6688的博客 835

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

用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的。 首先: 1、网易新闻用CoreData存储了新闻列表,因为我打开网易新闻的Documents时看到了三个文件: newsapp.sqlite,newsapp.sqlite-shm,newsapp.sqlit

sky_2016的专栏 809

使用 Simulink 实现基于相控阵雷达的波束形成技术

摘要:本文详细介绍了利用MATLAB Simulink和Phased Array System工具箱实现相控阵雷达波束形成的完整流程。主要内容包括:1)创建Simulink模型;2)设计天线阵列参数;3)信号生成模块配置;4)波束形成算法实现;5)结果可视化方法;6)仿真调试与优化;7)代码导出与部署。通过分步指导,读者可以掌握从理论到实践的完整开发流程,包括关键参数设置和算法实现示例。该方案适用于军事、气象等领域的雷达系统开发,并支持后续嵌入式和智能算法集成。

xiaoheshang_123的博客 182

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

转载注明原创:http://blog.youkuaiyun.com/rhljiayou/article/details/18037729 用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的。 首先: 1、网易新闻用CoreData存储了新闻列表,因为我打开网易新闻的Docum

wscqqlucy的专栏 1176

【100%通过率】华为OD机试真题2026双机位C卷 C语言 实现【加密算法】

【100%通过率】华为OD机试真题2026双机位C卷 Python&JS 实现【加密算法】有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下

MISAYAONE的博客 650

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 对iOS开发中内存管理的一点总结与理解
下一篇: IOS学习笔记55--统计Crash的工具Crashlytics
ios_che
博客等级 码龄15年 113粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值