用核心数据保存图像

时间:2018-10-28 08:35:10

标签: ios swift core-data swift4

我正在尝试使用CoreData保存用户个人资料图片,但不知道如何继续。

我知道我必须创建一个实体,并且读取它必须是BinaryData类型,但是后来我不知道如何保存和加载它。

我尝试过这种方式:

let profilePicture = UserPicture(context: AppDelegate.viewContext)
profilePicture.userProfilePicture = profilPictureImageView.image?.pngData()
    try? AppDelegate.viewContext.save()

但是不起作用。 我找不到足够明显的帮助我的东西。

2 个答案:

答案 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中。希望这会有所帮助。

enter image description here

答案 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()