如何使用ParseFile将ParseObject固定到OFFLINE中的解析本地数据存储区?

时间:2014-10-31 09:21:41

标签: android parse-platform

我使用以下代码将ParseObject与ParseFile一起存储。我在Application子类中启用了Parse本地数据存储区。当应用程序连接到Internet时,此代码在本地数据存储区和解析服务器中存储ParseObject的实例。

final ParseFile file = new ParseFile(position + ".mp4", data);
    file.saveInBackground(new SaveCallback() {

        @Override
        public void done(ParseException e) {
            ParseObject po = new ParseObject("Recordings");
            po.put("code", position);
            po.put("name", myname);
            po.put("file", file);
            po.saveEventually();                
        }
    });

当应用未连接到互联网时,相同的代码会抛出以下异常。 java.lang.IllegalStateException:无法编码未保存的ParseFile。应用程序崩溃了。对象未存储在本地数据存储中。

那么在没有互联网的情况下,如何在解析本地数据存储区时将ParseFile与ParseFile一起存储?

3 个答案:

答案 0 :(得分:7)

我通过简单地用ParseObject存储文件的字节来解决这个问题。当我需要我的文件时,我将这些字节写回文件。

我的要求是在分析中存储带有名字的录音文件。 我按照以下步骤操作: 1.获取文件的字节数组 2.将字节数组放入ParseObject 3.调用ParseObject#saveEventually()

代码:

    File file = new File(filePath);
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(file);
        byte data[] = new byte[(int) file.length()];
        fis.read(data);

        ParseObject obj = new ParseObject("Recordings");
        obj.put("name", name);          
        obj.put("data", data);
        obj.saveEventually();
    } catch (IOException e) {
        e.printStackTrace();
    }

答案 1 :(得分:1)

我真的很喜欢ashokgujju的解决方案。在我的情况下,我想在离线模式下从Android设备保存图片,所以这就是我发生的事情:

1.-只有通过这样做(ashokgujju'解决方案)才会在你的解析表中添加一个文件,正如SAndroidD指出的那样,如果你想要,你可以使用一个aftersave Parse Cloud函数,就像这样:

Parse.Cloud.afterSave("Recordings_or_WhatEverYourTableIs", function(request){
    bytes = request.object.get("data"); //"data" is the name given by  ashokgujju at "obj.put("data", data);"

    if(bytes){
         var file = new Parse.File("myFile.png", bytes); //png or whatever you want
         file.save().then(function(success){
                  request.object.set("record_or_MyColumnWithParseFile", file);
                  request.object.unset("data"); //optional, if you are not going to use this data, it has no meaning keep it there anymore and you will save some space
                  request.object.save();
         },function(error){
                  //error
         }); 
    }

}

这就像一个魅力!但...

2.-但仅限于缩略图,我的意思是,一张非常小的图片,一旦我想用大图片做同样的事情,我就面对这个:

com.parse.ParseRequest$ParseRequestException: The object is too large -- should be less than 128 kB

我花了一段时间才意识到这一点,因为没有出现任何错误,就像SAndroidD所说的那样。我不得不添加一个回调来保存以便查看它。

  File file = new File(filePath);
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(file);
        byte data[] = new byte[(int) file.length()];
        fis.read(data);

        ParseObject obj = new ParseObject("Recordings");
        obj.put("name", name);          
        obj.put("data", data);
        obj.saveEventually(new SaveCallback() {
                    @Override
                    public void done(ParseException e) {
                        Log.i(MyClass.logName," is it everything ok boy? "+e);
                    }
                });
    } catch (IOException e) {
        e.printStackTrace();
    }

原来如此!总结一下:ashokgujju的酷解决方法加上我的afterSave功能会将所有parseFile保存在离线模式下,只要文件本身不是那么大。

答案 2 :(得分:0)

我找到了这个问题的解决方案

ckeckout此代码

File file = new File(imagePath);
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(file);
                    byte data[] = new byte[(int) file.length()];
                    fis.read(data);

                    final ParseFile f=new ParseFile("img", data);

                    f.saveInBackground(new SaveCallback() {

                        @Override
                        public void done(ParseException arg0) {
                            //if (arg0.equals(null)) {
                                 ParseObject oImg=new ParseObject("Image");
                                 oImg.put("img", f);
                                 oImg.put("name", edtUN.getText().toString());

                                 oImg.saveEventually(new SaveCallback() {

                                    @Override
                                    public void done(ParseException arg1) {

                                        System.out
                                        .println("img save...");

                                    }
                                });
                            //}
                        }
                    }, new ProgressCallback() {

                        @Override
                        public void done(Integer arg0) {
                            //display img upload progress

                        }
                    });

然后当net打开并打开时,然后写入第一个活动的onResume()方法

ParseQuery<ParseObject> queryImg = ParseQuery.getQuery("Image");
            queryImg.fromPin(ApplicationParse.TODO_GROUP_NAME);
            queryImg.whereEqualTo("isDraft", true);
            queryImg.findInBackground(new FindCallback<ParseObject>() {

                @Override
                public void done(List<ParseObject> todos, ParseException e) {
                    if (e == null) {
                        for (final ParseObject todo : todos) {
                            // Set is draft flag to false before syncing to Parse
                            // todo.setDraft(false);
                            todo.saveInBackground(new SaveCallback() {

                                @Override
                                public void done(ParseException e) {
                                    //if (e == null) {
                                        // Let adapter know to update view
                                        if (!isFinishing()) {
                                            //refresh list data

                                            System.out.println("Image DATA is saved ..... ");

                                        }

                                }

                            });

                        }
                    } else {
                        Log.i("MainActivity","syncTodosToParse: Error finding pinned todos: "+ e.getMessage() );
                        e.printStackTrace();
                    }
                }

            });