我在Parse.com
中有一个名为Objects的类。此类包含许多字段,还包含10个ParseFile
字段,这些字段是图像。我正在使用以下代码,以便在类对象中添加新项目。
ParseObject object = new ParseObject("Objects");
object.put("field1", "test1");
object.put("field2", "test2");
int imagesSize = Details.getInstance().getImages().size();
for (int i = 0; i < imagesSize; i++) {
//convert bitmap to byte[]
Bitmap bmp = Details.getInstance().getImages().get(i);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] data = stream.toByteArray();
//convert byte[] to parse file
ParseFile file = new ParseFile("objectImage.png", data);
file.saveInBackground();
object.put("image" + numbers[i], file);
}
object.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Log.i("Add", "done");
}else{
Log.i("Add", e.getMessage());
}
}
});
我的问题是我收到此错误
java.lang.IllegalStateException: Unable to encode an unsaved ParseFile
我知道我应该使用以下内容来保存ParseFile
//convert bitmap to byte[]
Bitmap bmp = Details.getInstance().getImages().get(i);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] data = stream.toByteArray();
//convert byte[] to parse file
ParseFile file = new ParseFile("objectImage.png", data);
file.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
object.put("image" + numbers[i], file);
}else{
Log.i("Add", e.getMessage());
}
}
});
但现在有多张图片,我不知道如何实施。如果我在saveCallBack
内使用for loop
,那么我将无法获得正确的结果。
答案 0 :(得分:1)
//在Parse表中创建照片数组列。
//同时添加多张照片。 //这里是数组列表,您必须添加ParseFile对象
gameScore.addAllUnique("photos", Arrays.asList(parsefilephotoobject1, parsefilephotoobject2,parsefilephotoobject3));
gameScore.saveInBackground();
//您在照片阵列中逐一添加单张照片。 我使用glide从图像中获取字节数组。 destination_profile是我从图库中选择的文件对象。
if (destination_profile != null) {
Glide.with(getActivity()).load(destination_profile.getAbsolutePath()).asBitmap().toBytes().centerCrop().diskCacheStrategy(DiskCacheStrategy.ALL).into(new SimpleTarget<byte[]>() {
@Override
public void onResourceReady(byte[] resource, GlideAnimation<? super byte[]> glideAnimation) {
final ParseFile parseFile = new ParseFile(destination_profile.getName(), resource);
parseFile.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
gameScore.addUnique("photos", parseFile);
gameScore.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException e) {
showToast("Profile image upload success");
}
});
}
});
}
});
}
您可以使用此
获取ParseFile数组对象@ParseClassName("YourTableName")
public class YourTableName extends ParseObject {
public static ParseQuery<YourTableName> getQuery() {
return ParseQuery.getQuery(YourTableName.class);
}
public List<ParseFile> getParseFilePhotos() {
return getList("photos");
}
}
答案 1 :(得分:0)
在这两种情况下,您都需要同步保存文件。这是因为您依赖于正在保存的ParseFile
,然后将其添加到ParseObject
。
将您的file.saveInBackground
更改为file.save()
(我相信这是电话。您可能需要查找它)。通过这种方式,您知道他们已保存,并且已准备好将其添加到您的ParseObject
。
您仍然可以保存ParseObject
异步,因为它不会被保存在代码中的代码中。