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;
}
}