我正在尝试使用CoreData保存用户个人资料图片,但不知道如何继续。
我知道我必须创建一个实体,并且读取它必须是BinaryData类型,但是后来我不知道如何保存和加载它。
我尝试过这种方式:
let profilePicture = UserPicture(context: AppDelegate.viewContext)
profilePicture.userProfilePicture = profilPictureImageView.image?.pngData()
try? AppDelegate.viewContext.save()
但是不起作用。 我找不到足够明显的帮助我的东西。
答案 0 :(得分:1)
要在CoreData中保存图像,必须将图像转换为DATA类型,然后才能将其保存到CoreData中。此代码对于在CoreData中保存图像很有用。
@IBOutlet weak var profileimg: UIImageView?
let data = (profileimg?.image)!.pngData()
let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
let newUser = NSEntityDescription.insertNewObject(forEntityName: "Entity", into: context!)
newUser.setValue(data, forKey: "img")
do {
try Constant.context?.save()
}
确保输入的密钥正确。必须在数据模型检查器中选中“允许外部存储”复选框。但是我不建议将图像保存在CoreData中。希望这会有所帮助。
答案 1 :(得分:1)
您可以将图像转换为字符串并存储在核心数据中。
function AutoSave({ saveData, cookieBearer, oldState }) {
const [saving, setSaving] = useState(false);
const [
updateDecorDoc,
{ data: docData, loading: savingMutate },
] = useMutation(UPDATE_DECOR_DOC, {
context: {
headers: {
authorization: cookieBearer,
},
},
});
const debounceSave = useCallback(
debounce(async (saveData) => {
setSaving(true);
function compareArray(oldItem, newItem) {
const compared = {};
for (let key in oldItem) {
if (oldItem[key] != newItem[key]) {
compared[key] = newItem[key];
compared["col10"] = newItem["col10"];
}
}
return compared;
}
oldState
.map((old, i) => [old, saveData[i]])
.forEach((item) => {
var test = compareArray(...item);
console.log(test)
});
})
);
useEffect(() => {
if (saveData) {
debounceSave(saveData);
}
}, [saveData, debounceSave]);
if (saving) return <p>saving</p>;
if (!saving) return <p>Auto Save on</p>;
}
并使用此代码从核心数据加载图像
self.selectedImage?.jpegData(compressionQuality: 1)?.base64EncodedString()