我目前正在使用多用户系统进行一个项目。用户可以使用CoreData创建持久保存的新配置文件。
我的问题是:一次只能有一个配置文件是活动配置文件,所以我想获取创建的配置文件的ObjectID并将其保存到UserDefaults。
此外,我还认为,只要我需要活动配置文件的数据,我就可以简单地从UserDefaults中获取ObjectID,并执行READ-Request,这只会给我返回带有特定ObjectID的结果。
到目前为止我保存数据的代码:
// 1. Create new profile entry to the context.
let newProfile = Profiles(context: context)
newProfile.idProfileImage = idProfileImage
newProfile.timeCreated = Date()
newProfile.gender = gender
newProfile.name = name
newProfile.age = age
newProfile.weight = weight
// 2. Save the Object ID to User Defaults for "activeUser".
// ???????????????????
// ???????????????????
// 3. Try to save the new profile by saving the context to the persistent container.
do {
try context.save()
} catch {
print("Error saving context (error)")
}
我迄今为止读取数据的代码
// 1. Creates an request that is just pulling all the data.
let request: NSFetchRequest<Profiles> = Profiles.fetchRequest()
// 2. Try to fetch the request, can throw an error.
do {
let result = try context.fetch(request)
} catch {
print("Error reading data (error)")
}
正如您所看到的,我还不能实现第一个代码块的第2部分。将保存新配置文件,但ObjectID不会保存为UserDefaults。
第二个代码块的第1方也不是最终目标。该请求只会返回该实体的所有数据,而不仅仅是ObjectID I存储在User Defaults中的数据。
我希望你们对如何解决这个问题有一个想法。感谢你们的提前帮助,伙计们
由于NSManagedObjectID
不符合UserDefaults
处理的类型之一,您将不得不使用另一种方式来表示对象id。幸运的是,NSManagedObjectID
有一个返回URL的uriRepresentation()
,该URL可以存储在UserDefaults
中。
假设您使用的是NSPersistentContainer
,这里有一个扩展将处理活动用户Profile
:的存储和检索
extension NSPersistentContainer {
private var managedObjectIDKey: String {
return "ActiveUserObjectID"
}
var activeUser: Profile? {
get {
guard let url = UserDefaults.standard.url(forKey: managedObjectIDKey) else {
return nil
}
guard let managedObjectID = persistentStoreCoordinator.managedObjectID(forURIRepresentation: url) else {
return nil
}
return viewContext.object(with: managedObjectID) as? Profile
}
set {
guard let newValue = newValue else {
UserDefaults.standard.removeObject(forKey: managedObjectIDKey)
return
}
UserDefaults.standard.set(newValue.objectID.uriRepresentation(), forKey: managedObjectIDKey)
}
}
}
这使用NSPersistentStoreCoordinator
上的一个方法从URI表示中构造NSManagedObjectID
。