#pragma mark - Core Data Methods

- (void)insertObjectWithFileName:(NSString *)fileName

{

/**

SQL新增记录的过程

1. 拼接一个INSERT的SQL语句

2. 执行SQL

*/

// 1. 实例化并让context“准备”将一条个人记录增加到数据库

ReaderDocument *document = [NSEntityDescription insertNewObjectForEntityForName:kOAPDFDocument inManagedObjectContext:self.managedObjectContext];

// 2. 设置个人信息

document.fileName = fileName;

// 3. 保存(让context保存当前的修改)

if ([self.managedObjectContext save:nil]) {

NSLog(@"新增成功");

} else {

NSLog(@"新增失败");

}

}

- (NSMutableArray *)getObjectsWithPredicate:(NSString *)predicate

{

// 1. 实例化一个查询(Fetch)请求

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:kOAPDFDocument];

// 3. 条件查询,通过谓词来实现的

//    request.predicate = [NSPredicate predicateWithFormat:@"age < 60 && name LIKE '*五'"];

// 在谓词中CONTAINS类似于数据库的 LIKE '%王%'

//    request.predicate = [NSPredicate predicateWithFormat:@"phoneNo CONTAINS '1'"];

// 如果要通过key path查询字段,需要使用%K

//    request.predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS '1'", @"phoneNo"];

// 直接查询字表中的条件

// 2. 让_context执行查询数据

NSArray *array = [self.managedObjectContext executeFetchRequest:request error:nil];

//    for (OAPDFDocument *pdf in array) {

//        NSLog(@"\nfielName:%@ \nfilePath:%@ \nfileSize:%@", pdf.fileName, pdf.filePath, pdf.fileSize);

// 在CoreData中,查询是懒加载的

// 在CoreData本身的SQL查询中,是不使用JOIN的,不需要外键

// 这种方式的优点是:内存占用相对较小,但是磁盘读写的频率会较高

//        for (Book *b in p.books) {

//            NSLog(@"%@ %@ %@", b.name, b.price, b.author);

//        }

//    }

//    for (Book *b in array) {

//        NSLog(@"%@ %@ %@", b.name, b.price, b.author);

//    }

return [NSMutableArray arrayWithArray:array];

}

- (void)editObjectsWithPredicate:(NSPredicate *)predicate withState:(NSNumber *)state

{

// 1. 实例化一个查询(Fetch)请求

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:kOAPDFDocument];

// 2. 条件查询,通过谓词来实现的

request.predicate = predicate;

// 在谓词中CONTAINS类似于数据库的 LIKE '%王%'

//    request.predicate = [NSPredicate predicateWithFormat:@"phoneNo CONTAINS '1'"];

// 如果要通过key path查询字段,需要使用%K

//    request.predicate = [NSPredicate predicateWithFormat:@"%K CONTAINS '1'", @"phoneNo"];

// 直接查询字表中的条件

// 3. 让_context执行查询数据

NSArray *array = [self.managedObjectContext executeFetchRequest:request error:nil];

for (ReaderDocument *pdf in array) {

// 3.1修改公文阅读状态

pdf.fileTag = state;

// 3.2修改公文最新打开日期

NSFileManager* fileMngr = [NSFileManager defaultManager];

NSDictionary* attributes = [fileMngr attributesOfItemAtPath:pdf.fileURL error:nil];

pdf.lastOpen = (NSDate *)[attributes objectForKey:NSFileModificationDate];

// 3.3获取并保存,该文件的首页缩略图

UIImage *thumbImage = [pdf imageFromPDFWithDocumentRef:pdf.fileURL];

pdf.thumbImage = UIImagePNGRepresentation(thumbImage);

[self.collectionView reloadData];

break;

}

// 4. 通知_context修改数据是否成功

if ([self.managedObjectContext save:nil]) {

NSLog(@"修改成功");

} else {

NSLog(@"修改失败");

}

}

- (void)removeObjectsWithPredicate:(NSString *)predicate

{

// 1. 实例化查询请求

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:kOAPDFDocument];

// 2. 设置谓词条件

//    request.predicate = [NSPredicate predicateWithFormat:@"name = '张老头'"];

request.predicate = [NSPredicate predicateWithFormat:predicate];

// 3. 由上下文查询数据

NSArray *result = [self.managedObjectContext executeFetchRequest:request error:nil];

// 4. 输出结果

for (ReaderDocument *pdf in result) {

// 删除一条记录

[self.managedObjectContext deleteObject:pdf];

BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:pdf.filePath];

if (fileExists) {

[self removeFileWithName:pdf.fileName];

}else{

NSLog(@"File:%@ is not exist!",pdf.fileName);

}

//        break;

}

// 5. 通知_context保存数据

if ([self.managedObjectContext save:nil]) {

NSLog(@"删除%lu文件成功",(unsigned long)[result count]);

} else {

NSLog(@"删除失败");

}

}

- (void)removeFileWithName:(NSString *)fileName

{

NSFileManager *fileManager = [NSFileManager defaultManager];

NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

NSString *filePath = [documentsPath stringByAppendingPathComponent:fileName];

NSError *error;

BOOL success = [fileManager removeItemAtPath:filePath error:&error];

if (success) {

NSLog(@"Remove fiel:%@ Success!",fileName);

}

else

{

NSLog(@"Could not delete file -:%@ ",[error localizedDescription]);

}

}

IOS - CoreData 增删改查的更多相关文章

  1. iOS CoreData 增删改查详解

    最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然S ...

  2. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  3. iOS SQLite 增删改查的封装(关系型)

    在工程里导入libsqlite3.tbd库(Xcode 7) #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder &l ...

  4. [IOS]包含增删改查移动的tableView展示+plist文件保存+程序意外退出保存Demo

    做一个tableView,包含增删改移动功能,并且修改值的时候,在按home键的时候会自动保存.如果可以的话使者保存自定义的类数组保存到plist中. 实现步骤: 1.创建一个SingleViewAp ...

  5. CoreData 增删改查

    #pragma mark - Core Data Methods - (void)insertObjectWithFileName:(NSString *)fileName { /** SQL新增记录 ...

  6. iOS SQLite增删改查(简单应用)

    // 注意: 在工程里导入libsqlite3.tbd库(Xcode7,如果Xcode7以下的版本则导入libsqlite3.dylib). #import <UIKit/UIKit.h> ...

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

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

  8. iOS CoreData (一) 增删改查

    代码地址如下:http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系映 ...

  9. CoreData 从入门到精通(二) 数据的增删改查

    在上篇博客中,讲了数据模型和 CoreData 栈的创建,那下一步就是对数据的操作了.和数据库一样,CoreData 里的操作也无非是增删改查.下面我们将逐步讲解在 CoreData 中进行增删改查的 ...

随机推荐

  1. 《黑白团团队》第八次团队作业:Alpha冲刺 第五天

    项目 内容 作业课程地址 任课教师首页链接 作业要求 团队项目 填写团队名称 黑白团团队 填写具体目标 认真负责,完成项目 团队项目Github仓库地址链接. 第五天 日期:2019/6/19 成员 ...

  2. solrj 操作 solr 集群版

    一.添加 @Test public void testAddDocument() throws Exception{ //创建一个集群的连接,应该使用 CloudSolrServer,//zkHost ...

  3. POJ 2110

    终于过了,SHIT,二分+DFS即可,二分区间,根据数字是否在区间内,变成迷宫题了.枚举第一个格子,二分上界,即可. #include <iostream> #include <cs ...

  4. 一个三年Android开发的总结-开篇

    一个三年Android开发的总结-开篇 转眼间全职从事Android开发已有三年,想把这一阶段的积累总结记录并展现出来,作为Android开发必备的知识,希望对有一定Android开发基础的人进阶有裨 ...

  5. Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)

    本文将介绍网络连接建立的过程.收发包流程,以及当中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的server端程序.我们会先调用socket函 ...

  6. Toast分析——实现自己的Toast

    android 4.0以后,新增了一个功能:关闭某个应用发出的通知.Toast等.详细操作为:打开应用安装列表.找到要屏蔽的应用(长按通知,点击弹出的"应用信息",就可以跳到应用信 ...

  7. Java笔试面试题001

    Java笔试面试题之中的一个 1.Struts1中actionform和action属于MVC哪一层,为什么? 解答:actionform和action属于MVC的Model层,Action用来处理业 ...

  8. HDU 2874 LCA离线算法 tarjan算法

    给出N个点,M条边.Q次询问 Q次询问每两点之间的最短距离 典型LCA 问题   Marjan算法解 #include "stdio.h" #include "strin ...

  9. 基于Linux环境Tomcat-MySQL的server搭建

    在开发日趋激烈的今天.我们可不能再仅仅会编码了.这样搞不好.就成了一辈子的码奴!所以这里简单的分享一下server的搭建,因为Linux的安全性等一切因素让它成为了server平台的首选环境!今天跟大 ...

  10. 9. Palindrome Number[E]回文数

    题目 Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same b ...