我正在尝试删除存储在解析中的数组的一个对象(例如[user1],[user2],[user3],我要更改为[user1],[user3])。我有一个模块类,用于存储模块上的不同学生,当用户删除模块时,我想从存储在学生解析数组中的数组中删除他们的userID。
如果那是不可能的,我如何将整个数组检索到本地arraylist,编辑它,然后把它放回去?
我尝试了一些事情,但到目前为止还没有。这是我当前的代码,删除整行而不仅仅是数组:
moduleDeleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final View temp = v;
ParseQuery<ParseObject> query = new ParseQuery<ParseObject>("Module");
query.whereEqualTo("moduleCode", getItem(position).getModuleCode());
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> module, ParseException e) {
if (e == null) {
for (ParseObject delete : module) {
delete.remove(currentUser.getObjectId());
delete.deleteInBackground();
}
Toast.makeText(temp.getContext(), "Deleted", Toast.LENGTH_LONG).show();
} else {
Log.e("Error", e.getMessage());
Toast.makeText(temp.getContext(), "Error deleting", Toast.LENGTH_LONG).show();
}
}
});
}
});
感谢您的帮助!
答案 0 :(得分:1)
我找到了一种方法,它接受数组并将其存储在本地,更改它,然后将其发送回解析。不是最好看的方式,但它有效!
moduleDeleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
students = new ArrayList<String>();
final View temp = v;
ParseQuery<ParseObject> query = ParseQuery.getQuery("Module");
query.whereEqualTo("moduleCode",getItem(position).getModuleCode());
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> list, ParseException e) {
if (e==null) {
if (list.size()>0) {
ParseObject s = list.get(0);
if (s.getList("students")!=null)
{
students = s.getList("students");
}
else
{
students = null;
}
if (students!=null) {
if (students.contains(currentUser.getObjectId())) {
students.remove(currentUser.getObjectId());
s.put("students",students);
s.saveInBackground(new SaveCallback() {
@Override
public void done(ParseException arg0) {
Toast.makeText(temp.getContext(), "Deleted", Toast.LENGTH_LONG).show();
}
});
}
}
}
}
}
});
}
});
答案 1 :(得分:1)
我遇到了同样的问题,使用removeAll(...)解决了一点问题。 在我的情况下,我需要删除一个ParseObject,然后从另一个ParseObject内的数组中删除 - 让我们称之为容器。
final ParseObject toBeDeleted = ParseObject.createWithoutData(OBJ_TYPE, ITEM_ID);
final ArrayList<ParseObject> removeArr = new ArrayList<>();
removeArr.add(toBeDeleted);
ParseQuery<ParseObject> query = ParseQuery.getQuery(CONTAINER_OBJ);
query.include(THE_ARRAY);
query.getInBackground(protestID, new GetCallback<ParseObject>() {
public void done(ParseObject object, ParseException e) {
if (e == null) {
object.removeAll(THE_ARRAY, removeArr);
object.saveInBackground();
} else {
// something went wrong
}
}
});
toBeDeleted.deleteInBackground(new DeleteCallback() {
@Override
public void done(ParseException e) {
if (e == null) {
Log.v(TAG, "deleted " + parseType + " successfully");
}
}
});
我希望这能帮助其他需要它的人。