您的位置:首页 > 移动开发 > Swift

iOS CoreData(Swift版本)

2015-12-22 20:54 435 查看

简介:

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来实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: