文章

CoreData使用

由于最近写了个 gank.io 客户端,鬼使神差的想添加一个收藏功能,并且秉着努力学习新知识的原则,所以我在该项目中试了一下水,感觉还不错,在此,分享出来,供新手参考参考。 特别声明: 感谢干货集中营开源的接口。 干货集中营是一个不错的网站,希望越来越好。

  1. 创建一个新工程,在AppDelegate里面多了下面方法。
  2. 如果你已经创建好工程,但是没勾选上面选项,没关系,新建一个CoreData文件 但是AppDelegate里面没东西,没关系,新建一个新项目,将里面的内容拷进你的项目,但是你得修改一个地方
  3. 新建一个实体 双击修改名字
  4. 添加属性
  5. 新建NSManagedObject,通过Core Data从数据库取出的对象,默认情况下都是NSManagedObject对象 next -> next -> next OK,多了两个文件
  6. KL_Test+CoreDataProperties.swift 不需要变
  7. KL_Test.swift 添加增删查改的方法 ``` import Foundation import CoreData import UIKit

@objc(CollectGank) class KL_Test: NSManagedObject { static let app = UIApplication.sharedApplication().delegate as! AppDelegate static let context = app.managedObjectContext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
// 插入
static func insert(model: KL_Test) {
    let collectGank = NSEntityDescription.insertNewObjectForEntityForName("KL_Test",inManagedObjectContext: context) as! KL_Test
    collectGank.name = model.name
    collectGank.age = model.age
    do {
        try context.save()
        print("成功")
    }catch {
        fatalError("不能保存\(error)")
    }
}

// 查询所有的数据并返回
static func fetch() -> [KL_Test] {
    var array = [KL_Test]()
    //声明数据的请求
    let fetchRequest:NSFetchRequest = NSFetchRequest()

    //声明一个实体结构
    let entity:NSEntityDescription? = NSEntityDescription.entityForName("KL_Test",                  inManagedObjectContext: context)
    //设置数据请求的实体结构
    fetchRequest.entity = entity
    //查询操作
    do {
        let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)

        //遍历查询的结果
        print(fetchedObjects)
        array = fetchedObjects as! [KL_Test]

    }catch {
        fatalError("不能保存:\(error)")
    }
    return array
}

// 修改
static func update(gank: KL_Test) {
    //声明数据的请求
    let fetchRequest:NSFetchRequest = NSFetchRequest()
    fetchRequest.fetchLimit = 1 //限定查询结果的数量
    fetchRequest.fetchOffset = 0 //查询的偏移量

    //声明一个实体结构
    let entity:NSEntityDescription? = NSEntityDescription.entityForName("KL_Test",                  inManagedObjectContext: context)
    //设置数据请求的实体结构
    fetchRequest.entity = entity

    //设置查询条件
    let predicate = NSPredicate(format: "name = 'kellen' ")
    fetchRequest.predicate = predicate

    //查询操作
    do {
        let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)

        //遍历查询的结果
        print(fetchedObjects)
        try context.save()
    }catch {
        fatalError("不能保存:\(error)")
    }
}

// 是否存在(查找)
static func exist(gank: KL_Test) -> Bool {
    //声明数据的请求
    let fetchRequest:NSFetchRequest = NSFetchRequest()
    //声明一个实体结构
    let entity:NSEntityDescription? = NSEntityDescription.entityForName("KL_Test",                  inManagedObjectContext: context)
    //设置数据请求的实体结构
    fetchRequest.entity = entity
    //设置查询条件
    let predicate = NSPredicate(format: "name = '\(gank.name)' ")
    fetchRequest.predicate = predicate
    //查询操作
    do {
        let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)
        //遍历查询的结果
        guard (fetchedObjects != nil && fetchedObjects!.count > 0) else {
            return false
        }
        return true
    }catch {
        fatalError("不能保存:\(error)")
    }
}

// 删除
static func deleted(gank: KL_Test) {
    //声明数据的请求
    let fetchRequest:NSFetchRequest = NSFetchRequest()
    //声明一个实体结构
    let entity:NSEntityDescription? = NSEntityDescription.entityForName("CollectGank",                  inManagedObjectContext: context)
    //设置数据请求的实体结构
    fetchRequest.entity = entity

    //设置查询条件
    let predicate = NSPredicate(format: "name = '\(gank.name)'")
    fetchRequest.predicate = predicate

    //查询操作
    do {
        let fetchedObjects:[AnyObject]? = try context.executeFetchRequest(fetchRequest)
        print(fetchedObjects)
        //遍历查询的结果
        for info:KL_Test in fetchedObjects as! [KL_Test]{
            //删除对象
            context.deleteObject(info)
        }
        //重新保存-更新到数据库
        try context.save()

    }catch {
        fatalError("不能保存:\(error)")
    }
} } ```
本文由作者按照 CC BY 4.0 进行授权