直接使用 CoreData,而不是封装它 :-)
ManagedModels 提供的主要功能是一个 @Model
宏,它与 SwiftData 的 @Model
宏类似(但不完全相同)。它直接从代码生成一个 NSManagedObjectModel
。也就是说,不需要 CoreData 模型编辑器/数据模型文件。
一个小型模型示例
@Model class Item: NSManagedObject {
var timestamp : Date
var title : String?
}
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 没有其他依赖项。
NSManagedObject
(超类不能通过宏添加),例如 @Model class Person: NSManagedObject
。@FetchRequest
属性包装器,而不是 @Query
。@Model
中添加对 originalName/versionHash 的支持:Issue 10addItemToGroup
等):Issue 11@Query
属性包装器/宏?:Issue 12fetchRequest()
类函数。var title = "No Title"
):Issue 14非常欢迎提交拉取请求!即使只是 DocC 文档或更多测试也将是受欢迎的贡献。
@Model
SwiftData 和 SwiftUI 是 Apple Inc. 拥有的商标。 作为本项目一部分维护的软件与 Apple Inc. 无关。
ManagedModels 由 Helge Heß / ZeeZide 提供。我们喜欢反馈、GitHub 星星、酷炫的合同工作,大概是您能想到的任何形式的赞美。