关注微信公众号 太平洋学习网 扫描二维码
最新消息:关注【太平洋学习网】微信公众号,可以获取全套资料,【全套Java基础27天】【JavaEE就业视频4个月】【Android就业视频4个月】

swift3 coredata增删改查使用教程

IOS admin 浏览 评论

之前ios开发使用的是object-c的coredata来对sqllite数据库增删改查操作,使用教程如下:http://www.tpyyes.com/a/kuozhan/2017/0403/88.html,现在准备用下swift3 coredata来对sqlite进行增删改查操作,使用也差不多,下面将一一讲解。

1)下面开始学习ios coredata的使用,本开发工具为xcode8.3.3。首先在新建项目的时候勾选“use Core Data”,如图,如果项目已经建好。可以选择项目右键-new File-IOS-Data Model。

QQ20170801-155617.png

项目新建成功之后,会在项目中自动生成一个coredata的模型文件,如下图所示。

QQ20170801-160035.png

 2)点击如上的coredata模型文件之后就可以创建数据库表了,如图所示,

QQ20170801-160344.png

第1步:选择model模型文件。

第2步:添加sqllite数据库表对应的实体类,如Student类。

第3步:已经创建的coredata实体类。

第4步:添加实体类对应的属性,以后会自动生成对应的数据库表字段。

3)自动生成coredata实体类,如图所示,由于mac不方便截图,在此采用别人的图片解释。


通过此步骤之后设计的数据表就会自动生成student对应的swift实体类了,如下图。

QQ20170801-160902.png

4)下面是coredata对sqllite数据库的student表增删改查以及分页查询等步骤了,代码如下。

import UIKit
import CoreData
class SinforData: NSObject { 
 
    var _context:NSManagedObjectContext?
    
    override init(){   
        //上下文
        let context = NSManagedObjectContext.init(concurrencyType:NSManagedObjectContextConcurrencyType.privateQueueConcurrencyType)
        
        // 2. 上下文关连数据库
        // 2.1 model模型文件,nil为默认名称
        let model = NSManagedObjectModel.mergedModel(from: nil)
        
        // 2.2 持久化存储调度器
        // 持久化,把数据保存到一个文件,而不是内存
        let store = NSPersistentStoreCoordinator.init(managedObjectModel: model!)
        
        // 2.3 设置CoreData数据库的名字和路径
        let doc = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,
                                               FileManager.SearchPathDomainMask.userDomainMask, true)[0] as String
        let sqlitePath = doc+"/ContactsData.sqlite"
        print("sqlitePath====\(sqlitePath)")
        
        //异常捕获
        do {
            //创建数据库
            try store.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil,
                                         at: NSURL.fileURL(withPath:sqlitePath), options: nil)           
        } catch let error as NSError{
            print("创建数据库失败: \(error.localizedDescription)")
        }        
        context.persistentStoreCoordinator = store
        _context = context
    }
    
    //增加数据
    func insertStudent() {
        let stu = NSEntityDescription.insertNewObject(forEntityName: "Student", into: _context!) as! Student
        stu.id = 1
        stu.username = "zhangsan"
        stu.password = "66666666"
        stu.phone = "100000000"
        do {
            try _context?.save()
            print("数据保存成功")
        } catch  let error as NSError{
            print("数据保存失败: \(error.localizedDescription)")
        }
        
    }
    
    //删除数据
    func deleteStudent(id : Int) -> () {
        let request = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Student")
        let pre = NSPredicate.init(format: "id=%d",id)
        request.predicate = pre
        do {
            let result = try _context?.fetch(request)
            let resultData = result as! [Student]
            for stu in resultData {
                _context?.delete(stu)
            }
            try _context?.save()
            print("数据删除成功")
        } catch let error as NSError {
            print("数据删除失败: \(error.localizedDescription)")
        }
    }
    
    //修改数据,例如只修改电话
    func updateStudent(phone:String, id:Int) -> () {
        let request = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Student")
        let pre =  NSPredicate.init(format: "id=%d", id)
        request.predicate = pre
        do {
            
            let result = try _context?.fetch(request)
            let resultData = result as! [Student]
            for stu in resultData {
                stu.phone = phone
            }
            try _context?.save()
            print("数据修改成功")
        } catch  let error as NSError  {
            print("数据修改失败: \(error.localizedDescription)")
        }
    }
    
    //查询数据,根据id查询
    func findStudentById(id : Int) -> NSArray {
        let request = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Student")
        let pre =  NSPredicate.init(format: "id=%d", id)
        request.predicate = pre
        let mutArr = NSMutableArray.init()
        do {
            let result = try _context?.fetch(request)
            let resultData = result as! [Student]
            for stu in resultData {
                let dict = NSMutableDictionary.init()
                dict.setValue(stu.id, forKey: "id")
                dict.setValue(stu.username, forKey: "username")
                dict.setValue(stu.password, forKey: "password")
                dict.setValue(stu.phone, forKey: "phone")
                mutArr.add(dict)
            }
            
        } catch{
            print("数据查询失败")
        }
        return mutArr
    }
    
    //根据id倒序排序查询,批量查询
    func findAllStudent() -> NSArray {
        let request = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Student")
        let sort = NSSortDescriptor.init(key: "id", ascending: false)
        request.sortDescriptors = [sort]
        let mutArr = NSMutableArray.init()
        do {
            let result = try _context?.fetch(request)
            let resultData = result as! [Student]
            for stu in resultData {
                let dict = NSMutableDictionary.init()
                dict.setValue(stu.id, forKey: "id")
                dict.setValue(stu.username, forKey: "username")
                dict.setValue(stu.password, forKey: "password")
                dict.setValue(stu.phone, forKey: "phone")
                mutArr.add(dict)
            }
            
        } catch{
            print("数据查询失败")
        }
        return mutArr
    }
    
    //分页查询,参数为当前页
    func findStudentByPage(page : Int) -> NSArray {
        let request = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Student")
        //每页显示条数
        request.fetchLimit = 2
        //从第几条数据开始查,计算公式:(当前页-1) * 每页显示条数
        request.fetchOffset = (page - 1) * 2
        let mutArr = NSMutableArray.init()
        do {
            let result = try _context?.fetch(request)
            let resultData = result as! [Student]
            for stu in resultData {
                let dict = NSMutableDictionary.init()
                dict.setValue(stu.id, forKey: "id")
                dict.setValue(stu.username, forKey: "username")
                dict.setValue(stu.password, forKey: "password")
                dict.setValue(stu.phone, forKey: "phone")
                mutArr.add(dict)
            }
            
        } catch{
            print("数据查询失败")
        }
        return mutArr
    }
}

5)在ViewController.swift里面写代码测试一下我们定义的增删改查方法。

import UIKit
class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        //SinforData.init().insertStudent()
        //SinforData.init().updateStudent(phone: "11111111111", id: 2)
        //SinforData.init().deleteStudent(id: 3)
        //let dict = SinforData.init().findStudentById(id: 4)[0] as! NSMutableDictionary
        //print("学生的名字:\(String(describing: dict.object(forKey: "username")))")
        //let stuArr = SinforData.init().findAllStudent()
        let stuArr = SinforData.init().findStudentByPage(page: 1)
        for arr in stuArr {
            let dict = arr as! NSMutableDictionary
            let id = dict.object(forKey: "id")
            let username = dict.object(forKey: "username")
            print("学生的名字:\(String(describing: id))=====\(String(describing: username))")
        }
        
    }
}

注意事项:当我们在第3步骤新建完coredata实体类之后会报student类重复定义的错误,如:Invalid redeclaration of 'Student',则我们要删除掉student相关的实体类文件,因为有model模型文件就不需要导入这两个文件了,点击项目进入。

QQ20170801-162346.png


全部完成!

来源网站:太平洋学习网,转载请注明出处:http://www.tpyyes.com/a/object-c_ios/2017/0801/178.html

    与本文相关的文章