SaveAllInBackground无法在所需的deleteAllInBackground内部工作。

我正在尝试使用全部保存在后台保存parseobjects的列表。为了避免表中出现重复,我在查询已经存在的行并将其删除(如果有的话),然后保存新副本。因此,我在deleteAllInBackground的回调中调用saveAllInBackground。

问题是这样的:

例如:如果要删除的列表包含[a,b,c,d],而要上传的列表只有[a,b,c,d,e,f],则仅[e,f]可以解析。我正在将[a,b,c,d,e,f]传递到saveAllInBackground,但是只有[e,f]被保留。

  • 我缺少什么吗?如何解决呢?
  • 我可以使用其他方法吗?
  • 是否有更好的方法来避免重复?我不想添加一个
    beforeSave钩子(Hook)。调用saveAll的整个目的是减少API调用的次数。我想如果我使用beforeSave,无论如何我将不得不在云代码中运行一些查询。

  • 这是我的代码
                ParseQuery query = new ParseQuery("PostChoice");
    
                query.fromPin();
                query.findInBackground(new FindCallback<ParseObject>() {
                    @Override
                    public void done(final List<ParseObject> localList, ParseException e) {
                        if (localList != null && !localList.isEmpty()) {
                            List<ParseObject> postList = new ArrayList<ParseObject>();
                            for (ParseObject object : localList) {
    
                                postList.add(object.getParseObject("post"));
                            }
                            ParseQuery query = new ParseQuery("PostChoice");
                            query.whereContainedIn("post", postList);
                            query.whereEqualTo("user", ParseUser.getCurrentUser());
                            query.findInBackground(new FindCallback<ParseObject>() {
                                @Override
                                public void done(List<ParseObject> parseCloudList, ParseException e) {
    
                                    if (parseCloudList != null && !parseCloudList.isEmpty()) {
                                        ParseObject.deleteAllInBackground(parseCloudList, new DeleteCallback() {
                                            @Override
                                            public void done(ParseException e) {
                   // this gets executed and rows are accordingly deleted
                                                ParseObject.saveAllInBackground(localList, new SaveCallback() {
                                                    @Override
                                                    public void done(ParseException e) {
    // this gets executed but the rows are not uploaded.
    //the locallist is not empty. it contains the right data.
                                                        editor.putLong(Four.LAST_CHOICE_SYNC_TIME, System.currentTimeMillis());
                                                        editor.commit();
                                                        Log.i("SyncChoiceService", "Synced Choices");
                                                    }
                                                });
                                            }
                                        });
                                    }
                                    else{
                                        ParseObject.saveAllInBackground(localList, new SaveCallback() {
                                            @Override
                                            public void done(ParseException e) {
                                                Log.i("SyncChoiceService", "Synced Choices");
                                                editor.putLong(Four.LAST_CHOICE_SYNC_TIME,System.currentTimeMillis());
                                                editor.commit();
                                            }
                                        });
                                    }
                                }
                            });
    
    
                        }
                    }
                });
    

    最佳答案

    我已经提出了这样的解决方案。符合我的要求我使用updatedValue并删除旧的,其余的作为一个整体进行更新。

    ParseQuery query = new ParseQuery("PostChoice");
    
                query.fromPin();
                query.findInBackground(new FindCallback<ParseObject>() {
                    @Override
                    public void done(final List<ParseObject> localList, ParseException e) {
                        if (localList != null && !localList.isEmpty()) {
    
                            List<ParseObject> postList = new ArrayList<ParseObject>();
                            for (ParseObject object : localList) {
    
                                postList.add(object.getParseObject("post"));
                            }
                            ParseQuery query = new ParseQuery("PostChoice");
                            query.whereContainedIn("post", postList);
                            query.whereLessThan("updatedAt",System.currentTimeMillis());
                            query.whereEqualTo("user", ParseUser.getCurrentUser());
                            query.findInBackground(new FindCallback<ParseObject>() {
                                @Override
                                public void done(final List<ParseObject> parseCloudList, ParseException e) {
                                    if (parseCloudList != null && !parseCloudList.isEmpty()) {
                                        ParseObject.deleteAllInBackground(parseCloudList, new DeleteCallback() {
                                            @Override
                                            public void done(ParseException e) {
                                                Log.i("SyncChoiceService", "Deleted old  Choices");
    
                                            }
                                        });
                                    }
    
    
                                        }
                                    });
    
    
    ParseObject.saveAllInBackground(localList, new SaveCallback() {
            @Override
            public void done(ParseException e) {
                Log.i("SyncChoiceService", "Synced Choices");
            }
        });
    
                        }
                    }
                });
    

    08-05 18:39