2016-02-23 52 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