Editing Core Data item generates new UUID, causing duplication
I’m making an iOS application using UIKit, SwiftUI, and Core Data.
It’s working fine when adding or deleting items, but I’m encountering an issue when trying to edit (update) an item’s details.
The problem is that when I try to edit an item, a new UUID is generated, which causes the item to be duplicated instead of updating the existing one.
Here is the relevant code:
File Name: DetailView.swift
import SwiftUI
struct QSOLogDetailView: View {
@State var log: QSOLog
@State private var isEditing = false // 編集モードを管理
var onSave: (QSOLog) -> Void
var body: some View {
Form {
/* Omission */
TextField("Sample", text: $log.dataname)
/* Omission */
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
if isEditing {
Button("Save") {
onSave(log)
isEditing = false
}
} else {
Button("Edit") {
isEditing = true
}
}
}
}
}
}
Here is how the QSOLog struct is defined:
file name: TypeLog.swift
import Foundation
import CoreData
/* Omission */
struct QSOLog: Identifiable {
var id = UUID() // 一意のIDを追加
var dataname: String
var time: Date
/* Omission */
// Transfer to CoreData
func toEntity(context: NSManagedObjectContext) -> QSOLogEntity {
let entity = QSOLogEntity(context: context)
entity.dataname = dataname
entity.time = time
/* Omission */
return entity
}
}
// transfer QSOLogEntity to QSOLog
extension QSOLogEntity {
func toQSOLog() -> QSOLog {
return QSOLog(
id: self.id ?? UUID(), // Generate new UUID if item doesn't have it.
dataname: self.dataname ?? "",
time: self.time ?? Date(),
/* Omission */
)
}
}
When adding a new item, I’m using the following code:
File Name: NewEntry.swift
var onSave: (QSOLogEntity) -> Void
/* Omission */
Button("Save") {
saveLog() // Call data to store in Core Data
}
/* Omission */
func saveLog() {
let fetchRequest: NSFetchRequest<QSOLogEntity> = QSOLogEntity.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "dataname == %@ AND time == %@", log.dataname, log.time as CVarArg)
do {
let existingLogs = try context.fetch(fetchRequest)
if existingLogs.isEmpty {
let newLog = QSOLogEntity(context: context)
newLog.dataname = log.dataname
newLog.time = log.time
/* Omission */
try context.save()
onSave(newLog)
presentationMode.wrappedValue.dismiss()
} else {
}
} catch {
print("It's getting Error")
}
}
And QSOLogEntity is defined in other file.
File Name: TypeLog.swift
extension QSOLogEntity {
func toQSOLog() -> QSOLog {
return QSOLog(
id: self.id ?? UUID(), // Get new UUID when doesn't have it.
dataname: self.dataname ?? "",
time: self.time ?? Date(),
/* Omission */
)
}
}
I’ve been trying to solve this for at least 10 hours, but I can’t seem to find a solution. This is my first time developing an app. If anyone could help me solve this problem, I would greatly appreciate it.
2