swift中使用CoreData实现增删查改

1.建立CoreData项目

创建项目时勾选 User Core Data

2.创建实体(Entity)

创建项目后,可以看到目录中有一个.xcdatamodeld文件。打开它,点击下方Add Entity按钮即可创建新的实体。这里,我创建了Student尸体,两个属性分别是创建时间data和名字name。完成后点击右侧Show the Data Model Inspector按钮,里面有Name和Class两个选项,分别是实体名称和要生成的类名。

完成后,选择菜单Editor–>Create NSManagedObject Subclass…即可完成创建StudentManagedObject实体。

代码如下:

import Foundation
import CoreData

@objc(StudentManagedObject)class StudentManagedObject: NSManagedObject {
    @NSManaged var date: NSDate
    @NSManaged var name: String

}

3.创建模型

既然有了实体,为什么还要创建模型呢?这是基于分层设计考虑的,上面一步生产的实体是NSManagedObject的子类,从层级考虑是属于持久层。持久层和业务层,展示层分离,在项目逻辑比较复杂的时候会体现出很大的优势。因此,我这里再创建一个继承NSObject的StudentModel模型,属性和StudentManagedObject完全一致。

代码如下:

import UIKit

class StudentModel: NSObject {
    var name: String?
    var date: NSDate?
}

4.创建BaseDao基类

CoreData项目创建的时候,在AppDelegate中会自动生成四个参数:

applicationDocumentsDirectory 这个参数是数据库文件的路径

managedObjectModel 数据库所有实体或数据结构,包含各实体的定义信息

persistentStoreCoordinator 相当于数据库的连接

managedObjectContext 被管理对象上下文,可以在上下文中实现查找,删除,插入等操作,最后需要同步

虽然看上去很复杂,用到的主要还是最后一个managedObjectContext。

默认这几个参数是在AppDelegeta中,为了构建一个统一的数据库访问接口,我们需要创建一个BaseDao类,所有然后把四个参数拷贝过去,所有数据库访问Dao都继承这个基类,这样就可以方便调用。代码如下:

//
//  BaseDao.swift
//  CoreDataDemo
//
//  Copyright (c) 2015年 worthy.zhang. All rights reserved.
//

import UIKit
import CoreData

class BaseDao: NSObject {
    // MARK: - Core Data stack

    lazy var applicationDocumentsDirectory: NSURL = {
        // The directory the application uses to store the Core Data store file. This code uses a directory named "com.worthy.CoreDataDemo" in the application‘s documents Application Support directory.
        let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
        return urls[urls.count-1] as! NSURL
        }()

    lazy var managedObjectModel: NSManagedObjectModel = {
        // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
        let modelURL = NSBundle.mainBundle().URLForResource("CoreDataDemo", withExtension: "momd")!
        return NSManagedObjectModel(contentsOfURL: modelURL)!
        }()

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
        // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
        // Create the coordinator and store
        var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
        let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("CoreDataDemo.sqlite")
        var error: NSError? = nil
        var failureReason = "There was an error creating or loading the application‘s saved data."
        if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil, error: &error) == nil {
            coordinator = nil
            // Report any error we got.
            var dict = [String: AnyObject]()
            dict[NSLocalizedDescriptionKey] = "Failed to initialize the application‘s saved data"
            dict[NSLocalizedFailureReasonErrorKey] = failureReason
            dict[NSUnderlyingErrorKey] = error
            error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
            // Replace this 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()
        }

        return coordinator
        }()

    lazy var managedObjectContext: NSManagedObjectContext? = {
        // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
        let coordinator = self.persistentStoreCoordinator
        if coordinator == nil {
            return nil
        }
        var managedObjectContext = NSManagedObjectContext()
        managedObjectContext.persistentStoreCoordinator = coordinator
        return managedObjectContext
        }()
}

5.创建数据访问对象StudentDao

在StudentDao实现对Student的增删查改等操作,具体方法代码如下,需要注意模型StudentModel与实体StudentManagedObject之间的转换。

查询:

func findAll()-> NSMutableArray {
        println(self.applicationDocumentsDirectory.description)
        let cxt = self.managedObjectContext
        let entityDescription = NSEntityDescription.entityForName("Student", inManagedObjectContext:cxt!
        )
        let request = NSFetchRequest()
        request.entity = entityDescription
        var error: NSError? = nil
        var listData:[AnyObject]? = cxt?.executeFetchRequest(request, error: &error)
        var resListData: NSMutableArray = NSMutableArray()
        for data in listData as! [StudentManagedObject] {
            var entity = data
            var model = StudentModel()
            model.name = entity.name
            model.date = entity.date
            resListData.addObject(model)
        }
        return resListData
    }

新增:

func insert(student: StudentModel){
        let cxt = self.managedObjectContext
        let entity = NSEntityDescription.insertNewObjectForEntityForName("Student", inManagedObjectContext: cxt!) as! StudentManagedObject
        entity.name = student.name!
        entity.date = NSDate()
        var error: NSError? = nil
        if (self.managedObjectContext?.save(&error) != nil) {
            println("插入成功")
        }else{
            println("插入失败")
        }
    }

删除:

func remove(student:StudentModel){
        let ctx = self.managedObjectContext
        let entityDescription = NSEntityDescription.entityForName("Student", inManagedObjectContext: ctx!)
        let request = NSFetchRequest()
        request.entity = entityDescription
        request.predicate = NSPredicate(format: "date == %@", student.date!)
        var error: NSError? = nil
        let listData:[AnyObject]? = ctx?.executeFetchRequest(request, error: &error)
        for data in listData as! [StudentManagedObject] {
            ctx?.deleteObject(data)
            var savingError: NSError? = nil
            if ctx?.save(&savingError) != nil {
                println("删除成功")
            }else{
                println("删除失败")
            }
        }
    }

修改:

func modify(student:StudentModel){
        let ctx = self.managedObjectContext
        let entityDescription = NSEntityDescription.entityForName("Student", inManagedObjectContext: ctx!)
        let request = NSFetchRequest()
        request.entity = entityDescription
        request.predicate = NSPredicate(format: "date == %@", student.date!)
        var error: NSError? = nil
        let listData:[AnyObject]? = ctx?.executeFetchRequest(request, error: &error)
        for data in listData as! [StudentManagedObject] {
            data.name = student.name!
            var savingError: NSError? = nil
            if ctx?.save(&savingError) != nil {
                println("修改成功")
            }else{
                println("修改失败")
            }
        }
    }

最后,通过调用sharedDao返回唯一实例。

private let sharedInstance = StudentDao()
class StudentDao: BaseDao {

    class var sharedDao : StudentDao {
        return sharedInstance
    }

......
}

6.Demo演示

Demo中通过调用StudentDao中的四个方法,演示了简单的增删查改操作。

Demo地址:https://github.com/WorthyZhang/CoreDataDemo

时间: 2024-11-09 21:23:13

swift中使用CoreData实现增删查改的相关文章

SQL Server 中BIT类型字段增删查改那点事

话说BIT类型字段之前,先看“诡异”的一幕,执行Update成功,但是查询出来的结果依然是1,而不是Update的2 当别人问起我来的时候,本人当时也是处于懵逼状态的,后面联想具体的业务突然想起来这个字段是bit类型的 如果把这个现象跟BIT类型字段连续起来就不觉得奇怪了. 废话不多,直接上代码看结果就好了. 先建一个测试表 CREATE TABLE TestBIT ( Id INT IDENTITY(1,1), BitColumn BIT ) 按照常规来说,bit类型字段只能存0或者1,所以直

python中列表的增删查改

本文将学习python中对列表中的元素进行增删查改操作以l为例:l=['hello','tomorrow','!']1.增加:(1)在列表末尾增添元素:列表名.append('element') l.append('hello') print(l) 输出:(2)在列表任意位置插入元素:列表名.insert(索引,'element')l.insert(1,"luu's")print(l)输出: 2.删除(1)del 列表名[序号] del l[1] print(l) (2)列表名.pop

c++中的顺序表写法,主要实现(增删查改,构造函数,运算符重载)

本文的内容主要是,利用c++写出顺序表,并对写出的代码进行测试, 主要实现的功能:实现对顺序表的增删查改, 要写的函数:构造函数,赋值运算符重载,析构函数.在编写代码过程中应注意到深浅拷贝问题. 下面是顺序表的类函数: #pragma once #include<iostream> using namespace std; typedef int DataType; class SeqList { public: SeqList(); SeqList(DataType *array, size

在MVC程序中,使用泛型仓储模式和工作单元实现增删查改

在这片文章中,我将自己动手为所有的实体:写一个泛型仓储类,还有一个工作单元. 工作单元的职责就是:为每一个实体,创建仓储实例.仓储(仓库)的职责:增删查改的功能实现. 我们将会在控制器中,创建工作单元类(UnitOfWork)的实例,然后根据实体,创建仓储实例,再就是使用仓储里面的方法,做操作了. 下面的图中,解释了,仓储和EF 数据上文的关系,在这个图里面,MVC控制器和仓储之间的交互,是通过工作单元来进行的,而不是直接和EF接触. 那么你可能就要问了,为什么要使用工作单元??? 工作单元,就

4.CRUD Operations Using the Repository Pattern in MVC【在MVC中使用仓储模式进行增删查改】

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-using-the-repository-pattern-in-mvc/ 上一篇文章,讲到了MVC中基本的增删查改,这篇文章,我会继续说到,使用仓储模式,进行增删查改. 什么是仓储模式呢,我们先来了解一下:  仓储模式是为了在程序的数据访问层和业务逻辑层之间创建一个抽象层,它是一种数据访问模式,提供了一种更松散耦合的数据访问方法.我们把创建数据访问的逻辑代码写在单独的类中,或者类库中

6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pattern-and-dep/ 系列目录: Relationship in Entity Framework Using Code First Approach With Fluent API[[使用EF Code-First方式和Fluent API来探讨EF中的关系]] Code First Mig

IOS CoreData的(增删查改)

(1).CoreDataa>什么是CoreDatab>CoreData增删改查 "什么时候使用COredata 什么时候使用FMDatabases"CoreData 在公司使用的比较少,用户的比较多的是FMDatabases 数据存储的结构比较简单的时候,使用CoreData 开发效率会高点,为什么?面向对象,而且不用写sql语句FMDatabases 数据结果比较复杂的时候,表与表之前的关联比较的时候 CoreData表与表之前的关联 查询分页查询模糊查询 一个数据库有一

SQLite在Android程序中的使用方法,SQLite的增删查改方法

Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序中使用SQLite的语句来创建数据库,并实现数据库的增删查改 SQLite的简单使用方法: 如何获得一个数据库的class模板,并设定数据库里的数据结构: 自己新建一个类,继承SQLiteOpenHelper,并重写构造方法,oncreate(),onUpgrade() 自定义类的代码实现方法和构造

5.在MVC中使用泛型仓储模式和工作单元来进行增删查改

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pattern-and-uni/ 系列目录: Relationship in Entity Framework Using Code First Approach With Fluent API[[使用EF Code-First方式和Fluent API来探讨EF中的关系]] Code First Mig