swift 3 Xcode 8 中的 NSManagedObject 和 CoreData
Posted
技术标签:
【中文标题】swift 3 Xcode 8 中的 NSManagedObject 和 CoreData【英文标题】:NSManagedObject and CoreData in swift 3 Xcode 8 【发布时间】:2016-11-01 08:00:32 【问题描述】:我正在使用 Xcode 8 和 swift 3,我正在从编辑器菜单 NSManageObjectModel 为我的实体创建 NSManagedObject,如何使用此文件来获取和创建对象,在 Xcode 7 中我正在使用核心数据堆栈来创建管理对象、持久存储和 ,....现在我不知道如何在swift 3中使用核心数据。
【问题讨论】:
【参考方案1】:swift 3 中的以下核心数据代码使用 x 代码 8 及更高版本工作正常,部署目标可以是低 ios 8 及更高版本,一旦尝试即可工作。我逐步编写代码。
1)在appdelegate中导入Coredata
import UIKit
import CoreData
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate
var window: UIWindow?
在 appdelegate 中添加的这段代码中,只有当 coredata 在所有版本的操作系统中工作时,你才需要这段代码
private lazy var applicationDocumentsDirectory: URL =
let urls = FileManager.default.urls(for: .documentDirectory, in:
.userDomainMask)
return urls[urls.count-1]
()
// Core Data stack
lazy var managedObjectModel: NSManagedObjectModel =
let modelURL = Bundle.main.url(forResource: "Coredata", withExtension: "momd")!
return NSManagedObjectModel(contentsOf: modelURL)!
()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator =
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite")
var failureReason = "There was an error creating or loading the application's saved data."
do
try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
catch
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
return coordinator
()
lazy var managedObjectContext: NSManagedObjectContext =
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
()
// Core Data Saving support
func saveContext ()
if managedObjectContext.hasChanges
do
try managedObjectContext.save()
catch
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
3.保存数据这是你需要的数据保存到数据库然后 你写下面的代码 这个在 ViewControllers 类中的写入只是再次导入 coredata 并创建 NSManagedObject
var dataBase = [NSManagedObject]()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let entity = NSEntityDescription.entity(forEntityName:
"YourEntityName",in:managedContext)
let activityData = NSManagedObject(entity: entity!,insertInto:
managedContext)
activityData.setValue(storeData1, forKey: "attributeKey1")
activityData.setValue(storeData2, forKey: "attributeKey2")
do
try managedContext.save()
dataBase.append(activityData)
catch let error as NSError
print("Could not save \(error), \(error.userInfo)")
4.你在哪个类中获取数据然后你写这段代码这里也一样 就是这样
import coredata and create NSMangedObject
var getData= [NSManagedObject]()
//获取数据 func getLogsData()
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "YourEntityName")
do
let results = try managedContext.fetch(fetchRequest)
catch let error as NSError
print("Could not fetch \(error), \(error.userInfo)")
【讨论】:
以上是关于swift 3 Xcode 8 中的 NSManagedObject 和 CoreData的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 8.3.3 中的 iOS Swift Researchkit 谓词问题
Xcode 8 / Swift 3 中的 iOS 异步单元测试(waitForExpectations 失败)
如果 Swift 3/Xcode 8 中的“活动”列是“否”,如何隐藏单元格