我遇到的问题是,当我从工作表视图更新核心数据资产对象时,更改不会反映在 AssetListView 的 UI 中。(请注意,从工作表视图插入新对象会刷新 AssetListView 的 UI。在工作表视图中删除对象也会刷新AssetListView 的 UI)唯一不起作用的操作是更新。
当核心数据对象发生变化时,如何使 AssetListView 发生变化?
我有以下 SwiftUI 代码显示来自 CoreData FetchRequest 的资产列表:
struct AssetListView: View {
@State private var showingSheet = false
@State private var selectedAssetId: NSManagedObjectID?
@Environment(\.managedObjectContext) var moc
@FetchRequest(entity: Asset.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Asset.allocationPercentage, ascending: false)]) var assets: FetchedResults<Asset>
var body: some View {
VStack {
Form {
ForEach(assets, id: \.self) { asset in
Section {
AssetRowView(asset: asset)
.onTapGesture {
self.selectedAssetId = asset.objectID
self.showingSheet = …Run Code Online (Sandbox Code Playgroud) 我无法将 core Data 对象中的 bookName 绑定到循环内的 TextField ForEach。我怎样才能让这个绑定工作?我希望该bookName值在更改时保存到核心数据中。
我收到一条错误消息:无法在范围内找到 $book。
extension Book: Identifiable {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Book> {
return NSFetchRequest<Book>(entityName: "Book")
}
@NSManaged public var id: UUID?
@NSManaged public var bookName: String?
var wrappedBookName: String {
bookName ?? ""
}
}
struct BookListView: View {
@FetchRequest(entity: Book.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Book.rankNumber, ascending: false)]) var books: FetchedResults<Book>
var body: some View {
ForEach(books) { book in
TextField("Book Name", text: $book.bookName) //Error: cannot find $book in …Run Code Online (Sandbox Code Playgroud) 我正在使用实体框架,我有几种方法,我正在使用事务.我收到此错误:连接已在事务中,无法参与另一个事务.EntityClient不支持并行事务. 我有多种方法,取决于'MethodB',如下面的代码示例:
public void MethodA(){
using (var tran = Db.Database.BeginTransaction()){
MethodB();
var tableARecord = new TableARecord();
try
{
_context.TableAs.Add(tableARecord)
Db.SaveChanges();
}
catch (Exception excp)
{
tran.Rollback();
throw;
}
}
}
public void MethodC(){
using (var tran = Db.Database.BeginTransaction()){
MethodB();
//do something else
}
}
public int MethodB(){
int ret = 0
//exception happens when starting the transaction below
using (var tran = Db.Database.BeginTransaction()){
//do something else
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)