解析 - 在同一对象中保存多个图像

时间:2016-02-23 09:15:12

标签: android parse-platform

我在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,那么我将无法获得正确的结果。

2 个答案:

答案 0 :(得分:1)

//在Parse表中创建照片数组列。

enter image description here

//同时添加多张照片。 //这里是数组列表,您必须添加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异步,因为它不会被保存在代码中的代码中。