2016-02-23 51 views
1

我在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()); 
     } 
    } 
}); 

,但现在我不知道如何实施。如果我在for loop里使用saveCallBack,那么我不会得到正确的结果。

+0

保存在不同的领域不同的图像得到ParseFile数组对象,你是保存图像中只有一个字段名称是“形象”,所以它不是保存多个图像。 其他智慧商店首先解析文件数组列表,然后保存所有解析文件并获得回叫。 –

回答

0

在这两种情况下,您都需要同步保存文件。这是因为您依赖于ParseFile正在保存,然后将它们添加到您的ParseObject

将您的file.saveInBackground更改为file.save()(我相信这是您的要求,您可能需要查看它)。这样你就知道他们已经保存了,他们已经准备好加入你的ParseObject

您仍然可以异步保存您的ParseObject,因为您不依赖于它被保存在更深层次的代码中。

+0

我刚刚测试与保存而不是saveInBackground,但我得到此错误com.parse.ParseRequest $ ParseRequestException:由java.net.SocketTimeoutException引起的I/O失败:读取超时。 ParseObject已保存,但图像不存在 – user4292106

+0

“ParseFile”有多大,以及您的Internet连接有多好?这听起来像是因为'ParseFile'太大而超时。 – StuStirling

+0

图像的大小是1.09 MB – user4292106

1

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

enter image description here

//添加多个phots同一时间。 //这里是你必须需要添加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"); 
           } 
          }); 
         } 
        }); 


       } 
      }); 
    } 

您可以使用此

@ParseClassName("YourTableName") 
public class YourTableName extends ParseObject { 


    public static ParseQuery<YourTableName> getQuery() { 
     return ParseQuery.getQuery(YourTableName.class); 
    } 



    public List<ParseFile> getParseFilePhotos() { 
     return getList("photos"); 
    } 


} 
+0

好的!这听起来不错。但是我没有创建数据库,也没有更改数据库的权限。 – user4292106

+0

@ user4292106没有问题,您不需要创建数据库,只需添加一个类似我已经解释过的文件,它会自动在该表中创建照片数组对象。只需尝试一次 –

+0

我的意思是数据库还没有被我创建。你告诉我//在Parse表中创建photo array coulum。我说的是我没有获得数据库或表中任何更改的许可.. – user4292106