CoreData基本使用

里面的代码都是在xcode已经设置好的前提下进行的,怎么在xcode中添加model之类的,就不记录了,在这里记录下代码

//
//  ViewController.swift
//  CoreData基本使用
//
//  Created by admin on 16/3/14.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit
import CoreData
class ViewController: UIViewController {
    lazy var dbFilePath:String = {
        // 数据库保存的路径,这里是设置的沙盒的缓存文件
        // let temp = "\(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as String)/testdb.sqlite"
        // 数据库的保存路径,方便查看,所以写了个固定的目录
        let temp = "/Users/admin/sqllite/testdb.sqlite"
        return temp
    }()
    lazy var fileDirectory:String = {
        // 数据库保存的路径,这里是设置的沙盒的缓存文件
        // let temp = "\(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as String)/"
        // 数据库的保存路径,方便查看,所以写了个固定的目录
        let temp = "/Users/admin/sqllite/"
        return temp
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
//        self.setContext()
        self.setContextWithModelName("UserModel")
        self.insertGroup()
    }
    // 根据模型设置上下文,setContext方法会把所有的模型的表保存在同一个数据库文件中,这里可以根据那个传递的模型名称分开保存
    func setContextWithModelName(modelName:String)
    {
        let context = NSManagedObjectContext()
        let path = NSBundle.mainBundle().pathForResource(modelName, ofType: "momd")
        let model = NSManagedObjectModel(contentsOfURL: NSURL(fileURLWithPath: path!))
        let story = NSPersistentStoreCoordinator(managedObjectModel: model!)
        let savePath = "\(self.fileDirectory)\(modelName).sqlite"
        let _ = try? story.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: NSURL(fileURLWithPath: savePath), options: nil)
        context.persistentStoreCoordinator = story
        self.context = context
    }
    // 根据分组查询用户
    func selectUserWithGroup()
    {
        let request = NSFetchRequest(entityName: "Group")

        let pre = NSPredicate(format: "name = %@", argumentArray: ["管理员"])
        request.predicate = pre

        let groups:[Group]? = try? self.context?.executeFetchRequest(request) as! [Group]

        let requesUser = NSFetchRequest(entityName: "User")
        // 设置查询条件
        let preUser = NSPredicate(format: "group = %@", argumentArray: [groups![0]])
        requesUser.predicate = preUser

        let users:[User]? = try? self.context?.executeFetchRequest(requesUser) as! [User]

        for user in users!
        {
            print("用户名:\(user.name)")
            print("密码:\(user.password)")
            print("年龄:\(user.age)")
            // 这个字断是一个对象,但是需要转一下,有点麻烦啊,不知道有没有更好的方法
            let temp = user.group as! Group
            print("分组:\(temp.name)")
            print("*******************")
        }

    }
    func insertUser()
    {
        /**
        let num = 40000
        var sum = 0
        for var i = 0; i < num;i++
        {
            sum += i
        }
        print(sum)
        */
        let request = NSFetchRequest(entityName: "Group")
        // 获得所有分组
        let groups:[Group]? = try? self.context?.executeFetchRequest(request) as! [Group]

        let num = 100
        // 循环插入100个小芳
        for var i = 0; i < num;i++
        {
            let user:User = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: self.context!) as! User
            user.name = "小芳\(arc4random_uniform(100000))"
            user.age = NSNumber(unsignedInt: arc4random_uniform(100000))
            user.password = "\(arc4random_uniform(999999999))"
            user.group = groups?[Int(arc4random_uniform(UInt32((groups?.count)!)))]
            let _ = try? self.context?.save()
        }
    }
    // 插入关联表数据,这里是用户分组表
    func insertGroup()
    {
        let groupA:Group = NSEntityDescription.insertNewObjectForEntityForName("Group", inManagedObjectContext: self.context!) as! Group
        groupA.name = "管理员"
        let groupB:Group = NSEntityDescription.insertNewObjectForEntityForName("Group", inManagedObjectContext: self.context!) as! Group
        groupB.name = "游客"
        let _ = try? self.context?.save()
    }

    // 按条件查询
    func select()
    {
        let request = NSFetchRequest(entityName: "User")
        // 查询出在18岁和24岁之间的小芳
//        let pre = NSPredicate(format: "age <= %@ and age >= %@", argumentArray: [24,18])
        // 查询出名字中包含 22 的小芳
        let pre = NSPredicate(format: "name like %@", argumentArray: ["*22*"])

        request.predicate = pre

        let users:[User]? = try? self.context?.executeFetchRequest(request) as! [User]
        // 输出
        for user in users!
        {
            print("名字:\(user.name)")
            print("密码:\(user.password)")
            print("年龄:\(user.age)")
            print("***********")
        }
    }
    // 修改
    func update()
    {
        // 修改年龄
        // 1.查找到要删除的对象
        let request = NSFetchRequest(entityName: "User")

        // 条件,age 小于等于 0
        let pre = NSPredicate(format: "age <= %@", argumentArray: [0])

        request.predicate = pre;

        // 2.先读取出用户
        let users:[User]? = try? self.context?.executeFetchRequest(request) as! [User]
        // 改成 18
        for user in users!
        {
//            self.context?.deleteObject(user)
            user.age = 18
            // [self.context deleteObject:emp];
        }

        // 3.用context同步下数据库
        //所有的操作暂时都是在内存里,调用save 同步数据库
        let _ = try? self.context?.save()
    }
    // 删除
    func delete()
    {
        // 删除zhangsan
        // 1.查找到要删除的对象
        let request = NSFetchRequest(entityName: "User")

        // 条件,age字段等于 15089 的
        let pre = NSPredicate(format: "age=%@", argumentArray: [15089])

        request.predicate = pre;

        // 2.删除zhangsan
        let users:[User]? = try? self.context?.executeFetchRequest(request) as! [User]

        for user in users!
        {
            self.context?.deleteObject(user)
            // [self.context deleteObject:emp];
        }

        // 3.用context同步下数据库
        //所有的操作暂时都是在内存里,调用save 同步数据库
        let _ = try? self.context?.save()
    }
    // 添加数据
    func insert()
    {
        for var i = 0;i < 100;i++
        {
            // 创建模型对象
            let user:User = NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: self.context!) as! User
            // 设置模型属性
            user.name = "小芳\(rand())"
            user.password = "\(rand())"
            user.age = NSNumber(int: rand())
            //保存 - 通过上下文操作
            if (try? self.context?.save()) == nil
            {
                print("error")
            }
            else
            {
                print("ok")
            }
        }
    }
    // 所有的操作都需要上下文
    var context:NSManagedObjectContext?
    // 获得上下文
    func setContext()
    {
        // 1.上下文 关联UserModel.xcdatamodeld 模型文件
        let context = NSManagedObjectContext()

        // 关联模型文件

        // 创建一个模型对象
        // 传一个nil 会把 bundle 下的所有模型文件(xcdatamodeld后缀的文件) 关联起来
        let model = NSManagedObjectModel.mergedModelFromBundles(nil)

        // 持久化存储调度器
        let store = NSPersistentStoreCoordinator(managedObjectModel: model!)

        // 数据库保存的路径
        let fielPath = self.dbFilePath

        //
        let res = try? store.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: NSURL(fileURLWithPath: fielPath), options: nil)

        if res != nil
        {
            context.persistentStoreCoordinator = store
        }
        // 完成上下文的初始化
        self.context = context;
    }
}

标签: swift

添加新评论