5

parse.com 提供了一种在离线模式下使用 object.saveEventually() 保存对象的方法;call.. 这会将对象存储在本地数据存储中,除非与服务器同步。

问题是,我无法使用以下给定行存储文件

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 80, stream);
byte[] byteArray = stream.toByteArray();
file = new ParseFile("pic.png",byteArray);  
object.put("file.png", file);   
object.saveEventually();

它给出以下错误

java.lang.IllegalStateException: Unable to encode an unsaved ParseFile

根据解析文档保存文件 file.saveInBackground 应该被调用...我认为 saveInBackground 仅在有互联网连接时才有效...

但我要实现的事情是从本地数据存储中获取数据(对象或文件),直到与服务器完成同步......

那么如何在离线模式下以这样的方式保存文件,以便我可以从本地数据存储访问该文件,直到与服务器完成同步...

4

4 回答 4

2

我也遇到了同样的问题,我确实喜欢这样来满足我的要求。我希望它可能会有所帮助。

如何在离线时将带有 ParseFile 的 ParseObject 固定到 Parse Local Datastore?

于 2014-11-18T05:33:53.710 回答
2

最终保存您的对象并在 saveeventally 的回调中调用 parsefile 的 saveinbackground 并再次将该文件放入您的对象中并最终保存。这将离线保存您的文件

于 2015-07-14T10:25:24.427 回答
1

您永远不会在文件上调用 save (仔细阅读错误:“无法编码未保存的 ParseFile”)

您必须首先保存文件 - 完成后,您可以在引用该文件的对象上调用 save 。

我建议您使用回调调用 file.saveInBackground()。 https://parse.com/docs/android/api/com/parse/ParseFile.html#saveInBackground(com.parse.SaveCallback , com.parse.ProgressCallback)

例子:

私人无效 saveImageOnParseWithCallbacks(){

parseFile = new ParseFile(gate_image.getName(), byte_image);
parseFile.saveInBackground(new SaveCallback() {
    @Override
public void done(ParseException e) {                          
                if (e == null) {
                    saveParseObject(); // this is where you call object.SaveEven....
                }else {
                   e.printStackTrace(System.err);
                }
              }   
             }, new ProgressCallback() {
               @Override
           public void done(Integer percentDone) {
              // Update your progress spinner here. percentDone will be between 0 and 100.
                }
              });
    }

查看 parse 的新本地数据存储。它适用于 ParseObjects 但不适用于 ParseFiles(据我所知)对于离线解决方案,您必须首先固定目标文件并将图像本地存储在 sdcard 上。当对象的保存回调完成时,您可以保存图像(即您知道您已恢复互联网)。当图像保存回调完成时,您可以使用图像的引用更新对象。

https://parse.com/docs/android/api/com/parse/ParseObject.html#pinAllInBackground(java.lang.String , java.util.List, com.parse.SaveCallback)

于 2014-05-17T21:48:54.540 回答
1

我最近遇到了同样的情况。@vaibhav 的答案对我有用,直到设备因未保存的对象而脱机并且应用程序从任务管理器中关闭。如果应用程序在 saveEventually() 的回调运行之前终止,我注意到回调将不再运行。这导致 parseFile 没有被保存。

我使用的一种解决方法是首先将字节数组存储为 parseObject 的一部分。像这样

object.put("imgBytes", byteArray);

当您在对象上调用 saveEventually 时,字节将随之发送到服务器。但是当你从解析中检索对象时,它需要更长的时间,因为它也在向你发送字节。所以我决定使用云代码 beforeSave 触发器在它到达服务器后将其转换为 parseFile。我使用的代码是这样的......

Parse.Cloud.beforeSave(Parse.Object.extend("<Name of Class>"), function(request, response){
        var object = request.object;
        var bytes = object.get("imgBytes");
        if(bytes != null){
            var parsefile=new Parse.File("img.png",bytes);
            parsefile.save().then(function(file){
            object.set("ImageParseFile",file);
            object.set("imgBytes",null);
            response.success();

            },function(error){
            console.error("Can't save imageBytes as ParseFile");
            response.error("Error in cloud code before save");     //set to response.error if parsefile is required, otherwise response.success()
            });
        }
        else{
             response.success();
         }

});

使用上面的代码,当您检索对象时,它就像一个普通的解析文件。即使应用程序终止,解析文件仍将被保存并链接到对象。请记住更改为您的班级名称。

于 2018-03-06T20:03:59.680 回答