CoreData在开发中的应用

创建篇(方式一、方式二)


方式一:手动创建CoreData模板

步骤一.新建CoreData模板

One.png

步骤二.创建表

Two.png
Three.png
Four.png

修改表名

修改表名.png

方式二:自动创建CoreData模板

步骤一.新建项目时勾选coreData

勾选coreData.png

步骤二.创建CoreData模板成功

查看.png

使用篇

不解释,直接上部分代码,代码来自互联网,如有侵权,提醒删之

  • ViewController.m文件
#import "ViewController.h"
#import "JSONKit.h"
#import "CoreDateManager.h"
#import "NewsCell.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITableView *newsTableView;
@property (nonatomic, strong) NSMutableArray *resultArray;
@end

@implementation ViewController{
    
    CoreDateManager *coreManager;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    NSLog(@"%@",NSHomeDirectory());
    coreManager = [[CoreDateManager alloc]init];
    
    //更新时间   从NSUserDefaults中读取updateDate这个key对应的value
    NSString *updateDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"updateDate"];
    
    if (!updateDate) {//如果无此对象(没有"updateDate"这个key),表示第一次,那么就读数据(数据来自服务器或者本地的plist文件)写到数据库中
        [self writeDate];
        
    }else{
        //有此对象说明只要从数据库中(NSUserDefaults的存储路径)读数据
        NSTimeInterval update = updateDate.doubleValue;
        NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate];
        //8小时一更新
        if ((now - update)>8*60*60) {
            //如果超出八小时就把数据库清空再重新写
            [coreManager deleteData];
            [self writeDate];
        }else{
            //没有超过8小时就从数据库中读
            NSMutableArray *array = [coreManager selectData:10 andOffset:0];
            self.resultArray = [NSMutableArray arrayWithArray:array];
            [self.newsTableView reloadData];
        }
    }
    
    
}
-(void)writeDate
{
    [[NSUserDefaults standardUserDefaults] setObject:[NSString stringWithFormat:@"%f",[NSDate timeIntervalSinceReferenceDate]] forKey:@"updateDate"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    //读取信息,我在这里写成本地的了,一般的都是从网上获取数据
    NSString *path = [[NSBundle mainBundle]pathForResource:@"News" ofType:@"txt"];
    NSString *data = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    // json数据解析成数组
    NSArray *array = [data objectFromJSONString];
    //    NSLog(@"%@",array);
    self.resultArray = [NSMutableArray arrayWithCapacity:array.count];
    // 遍历数组中的每一个对象,每一个对象都是字典,用dict表示
    for (NSDictionary *dict in array) {
        // 手写initWithDictionary:方法进行字典转模型
        News *info = [[News alloc]initWithDictionary:dict];
        // 将每一个模型存储到可变数组self.resultArray中。self.resultArray就是平时所说的模型数组
        [self.resultArray addObject:info];
    }
    //    NSLog(@"%@",self.resultArray);
    
    //把数据(模型数组)写到数据库
    [coreManager insertCoreData:self.resultArray];
    // 刷新newsTableView
    [self.newsTableView reloadData];
}

#pragma UITableView

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.resultArray.count;
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 90;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"NewsCell";
    NewsCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *cells = [[NSBundle mainBundle] loadNibNamed:@"NewsCell" owner:self options:nil];
        cell = [cells lastObject];
    }
    News *info = [self.resultArray objectAtIndex:indexPath.row];
    // 设置数据
    [cell setContent:info];
    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //当你点击时说明要看此条新闻,那么就标注此新闻已被看过
    News *info = [self.resultArray objectAtIndex:indexPath.row];
    info.islook = @"1";
    //改变数据库查看状态
    [coreManager updateData:info.newsid withIsLook:@"1"];
    //改变resultarry数据
    [self.resultArray setObject:info atIndexedSubscript:indexPath.row];
    
}

@end
  • CoreDateManager.h和CoreDateManager.m文件
#import <Foundation/Foundation.h>
#import "News.h"
#import <CoreData/CoreData.h>
//  必须和ZbModel.xcdatamodeld文件的News表的表名一致。否则当TableName作为entityForName:方法的参数时,由于找不到此表程序就会崩溃
#define TableName @"News"

@interface CoreDateManager : NSObject

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;

//插入数据
- (void)insertCoreData:(NSMutableArray*)dataArray;
//查询
- (NSMutableArray*)selectData:(int)pageSize andOffset:(int)currentPage;
//删除
- (void)deleteData;
//更新
- (void)updateData:(NSString*)newsId withIsLook:(NSString*)islook;

@end





#import "CoreDateManager.h"

@implementation CoreDateManager

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            // Replace this implementation with code to handle the error appropriately.
            // 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.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

#pragma mark - Core Data stack
- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel
{
    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }
    // 加载ZbModel表
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"ZbModel" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }
    // 必须为ZbModel.sqlite,数据都存在了ZbModel.sqlite文件。若为别的文件,则cell上显示不出数据,因为数据源为空。
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ZbModel.sqlite"];
    
    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    
    return _persistentStoreCoordinator;
}

#pragma mark - Application's Documents directory

// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

//插入数据
- (void)insertCoreData:(NSMutableArray*)dataArray
{
    NSManagedObjectContext *context = [self managedObjectContext];
    // 遍历数组中的每一个元素,每一个元素都是模型,用info表示。以后可以通过info方法模型中的属性
    for (News *info in dataArray) {
        // NSEntityDescription:描述一种抽象数据类型,相当于数据库中的一个表
        News *newsInfo = [NSEntityDescription insertNewObjectForEntityForName:TableName inManagedObjectContext:context];
        // 将遍历出来的newsid属性赋值给等号左侧的newsid
        newsInfo.newsid = info.newsid;
        newsInfo.title = info.title;
        newsInfo.imgurl = info.imgurl;
        newsInfo.descr = info.descr;
        newsInfo.islook = info.islook;
        
        NSError *error;
        if(![context save:&error])
        {
            NSLog(@"不能保存:%@",[error localizedDescription]);
        }
    }
}

//查询
- (NSMutableArray*)selectData:(int)pageSize andOffset:(int)currentPage
{
    NSManagedObjectContext *context = [self managedObjectContext];
    
    // 限定查询结果的数量
    //setFetchLimit
    // 查询的偏移量
    //setFetchOffset
    
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    [fetchRequest setFetchLimit:pageSize];
    [fetchRequest setFetchOffset:currentPage];
    // entityForName的参数必须为ZbModel.xcdatamodeld文件的表名,否则程序会因为找不到这个表名而崩溃。
    NSEntityDescription *entity = [NSEntityDescription entityForName:TableName inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSError *error;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    NSMutableArray *resultArray = [NSMutableArray array];
    
    for (News *info in fetchedObjects) {
        NSLog(@"id:%@", info.newsid);
        NSLog(@"title:%@", info.title);
        [resultArray addObject:info];
    }
    return resultArray;
}

//删除
-(void)deleteData
{
    NSManagedObjectContext *context = [self managedObjectContext];
    NSEntityDescription *entity = [NSEntityDescription entityForName:TableName inManagedObjectContext:context];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setIncludesPropertyValues:NO];
    [request setEntity:entity];
    NSError *error = nil;
    NSArray *datas = [context executeFetchRequest:request error:&error];
    if (!error && datas && [datas count])// datas中有数据且没有错误
    {
        for (NSManagedObject *obj in datas)// 遍历datas中的每一个数据
        {
            // 删除每一个数据
            [context deleteObject:obj];
        }
        if (![context save:&error])
        {
            NSLog(@"error:%@",error);  
        }  
    }
}
//更新
- (void)updateData:(NSString*)newsId  withIsLook:(NSString*)islook
{
    NSManagedObjectContext *context = [self managedObjectContext];

    NSPredicate *predicate = [NSPredicate
                              predicateWithFormat:@"newsid like[cd] %@",newsId];
    
    //首先你需要建立一个request
    NSFetchRequest * request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:TableName inManagedObjectContext:context]];
    [request setPredicate:predicate];//这里相当于sqlite中的查询条件,具体格式参考苹果文档
    
    //https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html
    NSError *error = nil;
    NSArray *result = [context executeFetchRequest:request error:&error];//这里获取到的是一个数组,你需要取出你要更新的那个obj
    for (News *info in result) {
        info.islook = islook;
    }
    
    //保存
    if ([context save:&error]) {
        //更新成功
        NSLog(@"更新成功");
    }
}
@end
  • 数据源:News.txt文件
[
    {
        "id": "1",
        "title": "明星双11也疯狂晒单晒幸福",
        "descr": "一起来看看明星们是如何度过光棍节这个疯狂的日子吧",
        "imgurl": "http://img1.cache.netease.com/lady/2013/11/12/2013111209141859623.jpg"
    },
    {
        "id": "2",
        "title": "\"代码女神\"脱俗 成最美程序员",
        "descr": "\"代码女神\"美貌惊人,她竟然是个程序员",
        "imgurl": "http://img3.cache.netease.com/lady/2013/11/12/201311120830507ac45.jpg"
    },
    {
        "id": "3",
        "title": "黄菡:安全感源于强大的内心",
        "descr": "现代女性首先一定要自立,能够有独立的思想能力。",
        "imgurl": "http://img2.cache.netease.com/lady/2013/11/12/20131112084431b6aee.jpg"
    },
    {
        "id": "4",
        "title": "女王范冰冰穿衣造型变懒惰",
        "descr": "范冰冰这位造型女王近来变得十分\"懒惰\"。",
        "imgurl": "http://img6.cache.netease.com/lady/2013/11/12/2013111209111471ed4.jpg"
    },
    {
        "id": "5",
        "title": "应采儿产后首拍封面大片",
        "descr": "应采儿产后首拍封面大片,尽显迷人气质。",
        "imgurl": "http://img4.cache.netease.com/lady/2013/11/12/201311120829029cc3a.jpg"
    },
    {
        "id": "6",
        "title": "张亮父子示范型男亲子装",
        "descr": "惹人爱亲子装系列,今天小编盘点张亮父子的时尚型男亲子装。",
        "imgurl": "http://img3.cache.netease.com/lady/2013/11/12/201311120904577c9a0.jpg"
    },
    {
        "id": "7",
        "title": "本14岁清纯萝莉走红网络",
        "descr": "日本14岁清纯萝莉走红网络,外表清纯可爱。",
        "imgurl": "http://img1.cache.netease.com/lady/2013/11/12/20131112083235f5b8b.jpg"
    },
    {
        "id": "8",
        "title": "石头诗龄学包饺子 王岳伦刷碗",
        "descr": "近日,王诗龄和石头在郭涛的指导下包出的饺子有模有样。",
        "imgurl": "http://img2.cache.netease.com/lady/2013/11/12/20131112091709fa3dc.jpg"
    },
    {
        "id": "9",
        "title": "MTV音乐大奖 李宇春战袍加身",
        "descr": "美国,万人瞩目的MTV欧洲音乐大奖举行。",
        "imgurl": "http://img4.cache.netease.com/lady/2013/11/12/20131112090132f4647.jpg"
    },
    {
        "id": "10",
        "title": "吴奇隆公开承认与刘诗诗恋情",
        "descr": "发微博称\"很珍惜這份得之不易的感情\",刘诗诗予以转发。",
        "imgurl": "http://img4.cache.netease.com/3g/2013/11/13/2013111302215625fea.jpg"
    }
]

效果篇

101.150.gif

[LS](https://pan.baidu.com/s/1i518aRr 密码: qfh7)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容