CoreData 的 ManagedModels

直接使用 CoreData,而不是封装它 :-)

ManagedModels 提供的主要功能是一个 @Model 宏,它与 SwiftData 的 @Model 宏类似(但不完全相同)。它直接从代码生成一个 NSManagedObjectModel。也就是说,不需要 CoreData 模型编辑器/数据模型文件。

一个小型模型示例

@Model class Item: NSManagedObject {
  var timestamp : Date
  var title     : String?
}
完整的 CoreData 模板应用程序转换为 ManagedModels
import SwiftUI
import ManagedModels

@Model class Item: NSManagedObject {
  var timestamp : Date
}

struct ContentView: View {

  @Environment(\.modelContext) private var viewContext
  
  @FetchRequest(sort: \.timestamp, animation: .default)
  private var items: FetchedResults<Item>
  
  var body: some View {
    NavigationView {
      List {
        ForEach(items) { item in
          NavigationLink {
            Text("Item at \(item.timestamp!, format: .dateTime)")
          } label: {
            Text("\(item.timestamp!, format: .dateTime)")
          }
        }
        .onDelete(perform: deleteItems)
      }
      .toolbar {
        ToolbarItem(placement: .navigationBarTrailing) {
          EditButton()
        }
        ToolbarItem {
          Button(action: addItem) {
            Label("Add Item", systemImage: "plus")
          }
        }
      }
      Text("Select an item")
    }
  }
  
  private func addItem() {
    withAnimation {
      let newItem = Item(context: viewContext)
      newItem.timestamp = Date()
      try! viewContext.save()
    }
  }
  
  private func deleteItems(offsets: IndexSet) {
    withAnimation {
      offsets.map { items[$0] }.forEach(viewContext.delete)
      try! viewContext.save()
    }
  }
}

#Preview {
  ContentView()
    .modelContainer(for: Item.self, inMemory: true)
}

不是旨在作为 SwiftData 的替代实现。也就是说,API 保持与 SwiftData 相似,但并不完全相同。它不会试图隐藏 CoreData,而是提供实用程序,以类似于 SwiftData 的方式使用 CoreData。

一个完整的 To-Do 列表应用程序示例:ManagedToDos.app

描述该功能的博文文章:CoreData 的 @Model

要求

宏实现需要 Xcode 15/Swift 5.9 进行编译。但是,生成的代码本身应该可以向后移植到 iOS 10 / macOS 10.12(引入 NSPersistentContainer 时)。

包 URL

https://github.com/Data-swift/ManagedModels.git

ManagedModels 没有其他依赖项。

与 SwiftData 的区别

待办事项

非常欢迎提交拉取请求!即使只是 DocC 文档或更多测试也将是受欢迎的贡献。

链接

免责声明

SwiftData 和 SwiftUI 是 Apple Inc. 拥有的商标。 作为本项目一部分维护的软件与 Apple Inc. 无关。

ManagedModels 由 Helge Heß / ZeeZide 提供。我们喜欢反馈、GitHub 星星、酷炫的合同工作,大概是您能想到的任何形式的赞美。