103

Swift 2 では、次のコードが機能していました。

let request = NSFetchRequest(entityName: String)

しかし、Swift 3ではエラーが発生します:

汎用パラメーター「ResultType」を推測できませんでした

NSFetchRequestはジェネリック型になったためです。彼らの文書には、次のように書かれています。

let request: NSFetchRequest<Animal> = Animal.fetchRequest

私の結果クラスがたとえば、Levelどのように正しくリクエストすればよいですか?

これが機能しないため:

let request: NSFetchRequest<Level> = Level.fetchRequest
4

10 に答える 10

56

私はこれを行うことでうまくいったと思います:

let request:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Level")

少なくとも、DataBase からデータを保存およびロードします。

しかし、それは適切な解決策ではないように感じますが、今のところ機能しています。

于 2016-06-14T12:14:35.567 に答える
13

あなたの質問に答えるかもしれないいくつかの一般的な 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)")
    }
}

次のような連絡先の NSManagedObject セットアップがあると仮定します。

class Contact: NSManagedObject
{
    @NSManaged var contactNo: Int
    @NSManaged var contactName: String
}

これらのメソッドは、次のように使用できます。

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()
于 2016-10-15T07:47:18.437 に答える
1

Swift 3.0 これでうまくいくはずです。

let request: NSFetchRequest<NSFetchRequestResult> = NSManagedObject.fetchRequest()
request.entity = entityDescription(context)
request.predicate = predicate
于 2017-12-26T08:33:36.917 に答える
0

これまでのところ、私にとって最も効果的だったのは次のとおりです。

let request = Level.fetchRequest() as! NSFetchRequest<Level>
于 2016-09-30T09:57:57.577 に答える
0

同じ問題があり、次の手順で解決しました。

  • xcdatamodeld ファイルを選択し、Data Model Inspector に移動します
  • 最初のエンティティを選択し、セクション クラスに移動します
  • Codegen の「クラス定義」が選択されていることを確認します。
  • 生成されたすべてのエンティティ ファイルを削除します。それらはもう必要ありません。

それを行った後、XCodeがコード生成バージョンと何らかの形で混同しているように見えるため、fetchRequestのすべての出現を削除/書き換える必要がありました。

HTH

于 2016-12-23T08:29:43.357 に答える
0
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

func loadItemsCategory() {

    let request: NSFetchRequest<Category> = Category.fetchRequest()
    
    do {
        categoryArray = try context.fetch(request)
    } catch {
        print(error)
    }
    
    tableView.reloadData()
    
}
于 2021-06-10T08:38:00.890 に答える