简介:
1.CoreData是对SQLite的面向对象的封装
2.CoreData框架提供的是对象-关系映射(Object-relation map)功能,即CoreData能够将对象转化成数据,然后保存到SQLite数据库文件,也可以将数据库中的数据直接在查询的时候返回对象,数据库操作语句使用的是NSPredicate类(类似SQL语句)
重要的类:
NSEntityDescription,从数据库的表名映射而来的对象,即,数据库中的一张表,代表一个实例数据模型,就是这个类的实例
NSManagerObjectModel, 用来找到xcdatamodel文件中得对象模型
NSPersistentStoreCoordinator,用来连接到数据库,通过addPersistentStoreWithType方法
NSManagerObjectContext, 用来操作数据库,从名字可以看出他是一个上下文,那么也就需要注意多线程的问题
NSFecthRequest,顾名思义,Fetch 和 Request的,也就是将NSPredicate写出的类SQL语句编译成NSManagerObjectContext对象能执行的数据库操作请求
NSPredicate,不用怀疑,就是类SQL语句的封装
用法:
1.关于如何添加CoreData文件,以及如何建立数据模型的操作,就不赘述,
但通俗的理解,CoreData中,一个Entity就是一个表格,其中的Propery就是表格中得列,另外,关于relationship有两种“一对多,一对一”,relationship也属于Entity中得Property
2.增删查改的Swift用法
private var model:NSManagedObjectModel!
private var context:NSManagedObjectContext!
model = NSManagedObjectModel.mergedModelFromBundles(nil)
let psc = NSPersistentStoreCoordinator(managedObjectModel: model)
let path = self.pathInDcoumentDirectory("data.db")
let url = NSURL.fileURLWithPath(path)
do {
try psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
} catch let error as NSError {
print(error.localizedDescription)
}
context = NSManagedObjectContext(concurrencyType:.MainQueueConcurrencyType)
context.persistentStoreCoordinator = psc
context.undoManager = nil
// 以下是功能函数
func pathInDcoumentDirectory(fileName:String) ->String {
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let path = paths.lastObject as! NSString
let filePath = path.stringByAppendingPathComponent(fileName)
let fileManager = NSFileManager.defaultManager()
if fileManager.fileExistsAtPath(filePath) {
//
} else {
fileManager.createFileAtPath(filePath, contents: nil, attributes: nil)
}
return filePath
}
func insertDatas() {
if NSUserDefaults.standardUserDefaults().integerForKey("Index") >= 100 {
return;
}
var index:Int = 100
repeat {
let column = NSEntityDescription.insertNewObjectForEntityForName("Column", inManagedObjectContext: context) as! Column
column.columnID = NSNumber(integer: index)
column.columnTitle = String(index)
let image = UIImage(named:"icon")
column.columnIcon = UIImagePNGRepresentation(image!)
do {
try context.save()
}catch let error as NSError {
print(error)
}
index++
} while index < 100 + 10
NSUserDefaults.standardUserDefaults().setInteger(index, forKey: "Index")
}
func fetchDatas() {
let request = NSFetchRequest()
let column = NSEntityDescription.entityForName("Column", inManagedObjectContext: context)
request.entity = column
do {
try objects = context.executeFetchRequest(request)
} catch let error as NSError {
print(error.localizedDescription)
}
}
func updateDatas() {
let request = NSFetchRequest()
let column = NSEntityDescription.entityForName("Column", inManagedObjectContext: context)
request.entity = column
let predicate = NSPredicate(format: "columnTitle == 101")
request.predicate = predicate
do {
let results = try context.executeFetchRequest(request) as! [Column]
for var i = 0; i < results.count; i++ {
let col = results[i] as Column
col.columnTitle = "Test"
}
do {
try context.save()
} catch let error as NSError {
print(error.localizedDescription)
}
} catch let error as NSError {
print(error.localizedDescription)
}
self.tableView.reloadData()
}
func deleteDatas(title:String) {
let request = NSFetchRequest()
let column = NSEntityDescription.entityForName("Column", inManagedObjectContext: context)
request.entity = column
let predicate = NSPredicate(format: "columnTitle == '\(title)'")
request.predicate = predicate
do {
let results = try context.executeFetchRequest(request) as! [Column]
for result in results {
context.deleteObject(result)
}
do {
try context.save()
} catch let error as NSError {
print(error.localizedDescription)
}
} catch let error as NSError {
print(error.localizedDescription)
}
}
关于多线程使用CoreData
推荐的做法就是每一个线程维护一个NSManagerObjectContext对象,每个NSManagedObjectContext对象实例都可以使用同一个NSPersistentStoreCoordinator实例,这个实例可以很安全的顺序访问永久存储,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁。
ios5.0之后,为NSManagedObjectContext提供了initWithConcurrentcyType方法,其中的一个NSPrivateQueueConcurrencyType,会自动的创建一个新线程来存放NSManagedObjectContext而且它还会自动创建NSPersistentStoreCoordinator
ios5.0之前,可以用GCD来实现