坦率地说,您没有选中Use CoreData项目创建框就做出了正确的思考。我觉得这只是用大量易于手动(且更具洞察力)的工作来充实项目。
简而言之,无论您在项目创建时选择了什么选项,都可以实现相同的CoreData。
当我想向项目中添加CoreData支持(手动/编程)时,通常会执行以下步骤:
这些只是NSManagedObjects代表您的应用程序的数据结构。例如,一个User,Message,BlogPost,等我也使一个为我的用户设置。
例:
import CoreData
class User : NSManagedObject
{
// @NSManaged is the replacement for @dynamic when using CoreData in Swift
@NSManaged var identifier : String
@NSManaged var firstName : String?
@NSManaged var lastName : String?
// This is called when a new User object is inserted to CoreData
override func awakeFromInsert()
{
super.awakeFromInsert()
self.identifier = NSUUID().UUIDString // generate a random unique ID
}
}
Run Code Online (Sandbox Code Playgroud)
这是您通过以下方式添加到项目中的另一个文件:File-> New-> iOS-> CoreData-> Data Model。我通常将同一xcmodeldata文件存储在Models项目文件夹中(以及实际的模型类)。
选择此新文件后,您将看到CoreData模型编辑器。您将希望看到右侧的检查器窗格(热键为1)。对于核心数据编辑器,您还将主要使用第三个选项卡(数据模型检查器),该选项卡可通过?3进行切换。
现在,您可以将实体对象添加到此数据模型中(通过底部的“ 添加实体 ”)。假设上面的示例,添加一个User实体。与User实体选择的,添加三个属性在上述类中定义的:identifier,firstName,和lastName。它们应该使用String类型匹配类定义。
下一步是告诉CoreData,User此处定义的此实体映射到我们实际的类文件。随着User选择和数据模型检查窗格中打开,设置名称,以User和类来YourAppName.User。
这是Swift和CoreData的“陷阱”,您的类以模块名称作为前缀,以便为它们命名空间(避免名称冲突)。令人高兴的是,您不再需要向对象添加“ XYZ”类前缀。
定义数据模型后,您需要初始化CoreData堆栈本身(数据库存储和上下文)。最基本的示例是您的全局单例NSManagedObjectContext,它将在需要时延迟加载。
您可以将其放在自己的Swift文件(CoreDataStack.swift)中:
import CoreData
let managedObjectContext : NSManagedObjectContext =
{
// This is your xcdatamodeld file
let modelURL = NSBundle.mainBundle().URLForResource("MyApp", withExtension: "momd")
let dataModel = NSManagedObjectModel(contentsOfURL: modelURL!)
// This is where you are storing your SQLite database file
let documentsDirectory : NSURL! = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask).last as? NSURL
let storeURL = documentsDirectory.URLByAppendingPathComponent("MyApp.sqlite")
let psc = NSPersistentStoreCoordinator(managedObjectModel: dataModel!)
var error : NSError?
let store = psc.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: nil, error: &error)
if let error = error
{
println("Uhoh, something happened! \(error), \(error.userInfo)")
}
let context = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
context.persistentStoreCoordinator = psc
context.undoManager = nil
return context
}()
Run Code Online (Sandbox Code Playgroud)
因此,既然您有一个正常工作的Core Data堆栈,已经定义和映射了一些数据模型...接下来呢?
让我们获取一些对象!
func getUsersByFirstName(firstName: String) -> [User]
{
let fetchRequest = NSFetchRequest(entityName: "User")
// The [c] part indicates case-insensitive, "Bob" == "bob"
fetchRequest.predicate = NSPredicate(format: "firstName ==[c] %@", firstName)
var error : NSError?
let results = context.executeFetchRequest(fetchRequest, error: &error) as [User]
// Handle errors here
return results
}
Run Code Online (Sandbox Code Playgroud)
哦,对,我们没有东西可取。您还可以插入对象...
func insertNewUser() -> User
{
return NSEntityDescription.insertNewObjectForEntityForName("User", inManagedObjectContext: context) as User
}
Run Code Online (Sandbox Code Playgroud)
当然,您可以删除对象...
func deleteUser(user: User)
{
context.deleteObject(user)
}
Run Code Online (Sandbox Code Playgroud)
关键是要记住CoreData上下文(NSManagedObjectContext)跟踪内存中的更改。尽管您可以在上下文中执行以下CRUD操作并立即(在同一上下文中)查看更改,但是在您保存更改之前,它们不会持久存在于数据库中:
func saveContext() -> Bool
{
var error : NSError?
if context.hasChanges && !context.save(&error)
{
println("Something happened when saving! \(error!), \(error!.userInfo)")
return false
}
return true
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用来从上次保存回滚更改context.rollback()。
随意探索CoreData并尝试使用更高级的功能,例如谓词(NSPredicate),排序描述符(NSSortDescriptor)和设置对象关系。
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |