How to pin a ParseObject with a ParseFile to the Parse Local Datastore in OFFLINE?

后端 未结 3 1194
忘掉有多难
忘掉有多难 2020-12-10 07:35

I am using the following code to store the ParseObject with a ParseFile. I have enabled Parse local datastore in Application subclass. This code storing an instance of the P

相关标签:
3条回答
  • 2020-12-10 08:08

    I have solved this problem by simply storing the bytes of the file with ParseObject. When I want my file, I am writing those bytes back to a file.

    My requirement was to store a audio recording file with name in the parse. I followed the these steps: 1. Get the byte array of file 2. Put the byte array into ParseObject 3. Call ParseObject#saveEventually()

    Code:

        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();
        }
    
    0 讨论(0)
  • 2020-12-10 08:24

    I really liked ashokgujju's solution. In my case, I wanted to save a picture from an Android device in offline mode, so this is what happened to me:

    1.- Only by doing that (ashokgujju's solution) will not add a file into your parse table, as SAndroidD pointed out, if you want that, you might use an aftersave Parse Cloud function, something like this:

    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
             }); 
        }
    
    }
    

    That worked like a charm! but...

    2.- But only for the Thumbnail, I mean, a very small picture, once I wanted to do the same with a big picture, I faced this:

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

    It took me a while to realise that, because no errors where shown, just like SAndroidD was saying. I had to add a callback to saveEventually to see it.

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

    So! to summarize: ashokgujju's cool workaround plus my afterSave function will save any parseFile in offline mode, as long as the file itself is not that big.

    0 讨论(0)
  • 2020-12-10 08:28

    I found a solution of this problem

    ckeckout this code

    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
    
                            }
                        });
    

    and then when net is on and where open then write in onResume() method of your first activity

    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();
                        }
                    }
    
                });
    
    0 讨论(0)
提交回复
热议问题