Den*_*iss 100 core-data swift swift3
在Swift 2中,以下代码正在运行:
let request = NSFetchRequest(entityName: String)
Run Code Online (Sandbox Code Playgroud)
但是在Swift 3中它给出了错误:
无法推断通用参数"ResultType"
因为NSFetchRequest现在是通用类型.他们在文件中写道:
let request: NSFetchRequest<Animal> = Animal.fetchRequest
Run Code Online (Sandbox Code Playgroud)
所以如果我的结果类是例如Level我应该如何正确请求?
因为这不起作用:
let request: NSFetchRequest<Level> = Level.fetchRequest
Run Code Online (Sandbox Code Playgroud)
Sul*_*han 130
let request: NSFetchRequest<NSFetchRequestResult> = Level.fetchRequest()
Run Code Online (Sandbox Code Playgroud)
要么
let request: NSFetchRequest<Level> = Level.fetchRequest()
Run Code Online (Sandbox Code Playgroud)
取决于您想要的版本.
您必须指定泛型类型,否则方法调用是不明确的.
定义第一个版本NSManagedObject,使用扩展名为每个对象自动生成第二个版本,例如:
extension Level {
@nonobjc class func fetchRequest() -> NSFetchRequest<Level> {
return NSFetchRequest<Level>(entityName: "Level");
}
@NSManaged var timeStamp: NSDate?
}
Run Code Online (Sandbox Code Playgroud)
重点是删除String常量的用法.
Den*_*iss 55
我想通过这样做我得到了它:
let request:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Level")
Run Code Online (Sandbox Code Playgroud)
至少它保存并加载DataBase中的数据.
但感觉它不是一个合适的解决方案,但它现在有效.
Ron*_*iel 33
我发现在3.0中工作的最简单的结构如下:
let request = NSFetchRequest<Country>(entityName: "Country")
Run Code Online (Sandbox Code Playgroud)
数据实体类型为国家/地区的位置.
但是,在尝试创建Core Data BatchDeleteRequest时,我发现此定义不起作用,您似乎需要使用表单:
let request: NSFetchRequest<NSFetchRequestResult> = Country.fetchRequest()
Run Code Online (Sandbox Code Playgroud)
即使ManagedObject和FetchRequestResult格式应该是等效的.
iph*_*aaw 10
以下是一些可能回答您问题的通用CoreData方法:
import Foundation
import Cocoa
func addRecord<T: NSManagedObject>(_ type : T.Type) -> T
{
let entityName = T.description()
let context = app.managedObjectContext
let entity = NSEntityDescription.entity(forEntityName: entityName, in: context)
let record = T(entity: entity!, insertInto: context)
return record
}
func recordsInTable<T: NSManagedObject>(_ type : T.Type) -> Int
{
let recs = allRecords(T.self)
return recs.count
}
func allRecords<T: NSManagedObject>(_ type : T.Type, sort: NSSortDescriptor? = nil) -> [T]
{
let context = app.managedObjectContext
let request = T.fetchRequest()
do
{
let results = try context.fetch(request)
return results as! [T]
}
catch
{
print("Error with request: \(error)")
return []
}
}
func query<T: NSManagedObject>(_ type : T.Type, search: NSPredicate?, sort: NSSortDescriptor? = nil, multiSort: [NSSortDescriptor]? = nil) -> [T]
{
let context = app.managedObjectContext
let request = T.fetchRequest()
if let predicate = search
{
request.predicate = predicate
}
if let sortDescriptors = multiSort
{
request.sortDescriptors = sortDescriptors
}
else if let sortDescriptor = sort
{
request.sortDescriptors = [sortDescriptor]
}
do
{
let results = try context.fetch(request)
return results as! [T]
}
catch
{
print("Error with request: \(error)")
return []
}
}
func deleteRecord(_ object: NSManagedObject)
{
let context = app.managedObjectContext
context.delete(object)
}
func deleteRecords<T: NSManagedObject>(_ type : T.Type, search: NSPredicate? = nil)
{
let context = app.managedObjectContext
let results = query(T.self, search: search)
for record in results
{
context.delete(record)
}
}
func saveDatabase()
{
let context = app.managedObjectContext
do
{
try context.save()
}
catch
{
print("Error saving database: \(error)")
}
}
Run Code Online (Sandbox Code Playgroud)
假设有一个NSManagedObject设置为Contact,如下所示:
class Contact: NSManagedObject
{
@NSManaged var contactNo: Int
@NSManaged var contactName: String
}
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式使用这些方法:
let name = "John Appleseed"
let newContact = addRecord(Contact.self)
newContact.contactNo = 1
newContact.contactName = name
let contacts = query(Contact.self, search: NSPredicate(format: "contactName == %@", name))
for contact in contacts
{
print ("Contact name = \(contact.contactName), no = \(contact.contactNo)")
}
deleteRecords(Contact.self, search: NSPredicate(format: "contactName == %@", name))
recs = recordsInTable(Contact.self)
print ("Contacts table has \(recs) records")
saveDatabase()
Run Code Online (Sandbox Code Playgroud)
小智 6
这是迁移到Swift 3.0的最简单方法,只需添加即可 <Country>
(测试和工作)
let request = NSFetchRequest<Country>(entityName: "Country")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
41650 次 |
| 最近记录: |