Подтвердить что ты не робот

Android: Обновление полей для ParseUsers

Я использую ParseUser для управления пользователями. Имея имя пользователя (уникальное), я планировал запросить класс User для идентификации пользователя, а затем поместить новый счет в поле "score", точно так же, как Leaderboard. Закодировано следующим образом:

код:

public void update_user_score(String username, int original_score, int add)
{
    final int new_score = original_score + add;  
    ParseQuery<ParseUser> query = ParseUser.getQuery();
    query.whereEqualTo("username", username);
    query.setLimit(1);

    query.findInBackground(new FindCallback() 
    {
          public void done(final ParseObject object, ParseException e) 
          {
            if (e == null) 
            {
                object.saveInBackground(new SaveCallback() 
                {
                    public void done(ParseException e) 
                    {
                        object.put("score", new_score);                                 
                        object.saveInBackground();                                      
                        onBackPressed();                            
                    }
                });
            }
          }
    });
}

Ситуация: Он утверждает, что The type new FindCallback(){} must implement the inherited abstract method FindCallback.done(List, ParseException). Я пробовал это FindCallback.done и нашел его неприемлемым.

Вопрос:

Я хотел бы спросить, как обновлять другие поля пользователя с указанием имени пользователя? Спасибо!

4b9b3361

Ответ 1

В соответствии с документацией по анализу,

Класс ParseUser защищен по умолчанию. Данные, хранящиеся в ParseUser, могут быть изменены только этим пользователем. По умолчанию данные могут быть прочитаны любым клиентом. Таким образом, некоторые объекты ParseUser аутентифицируются и могут быть изменены, тогда как другие доступны только для чтения.

В частности, вы не можете вызывать любые методы типа сохранения или удаления, если только ParseUser не был получен с использованием аутентифицированного метода, такого как logIn или signUp. Это гарантирует, что только пользователь может изменить свои собственные данные.

Ниже приведена эта политика безопасности:

ParseUser user = ParseUser.logIn("my_username", "my_password");
user.setUsername("my_new_username"); // attempt to change username
user.saveInBackground(); // This succeeds, since the user was authenticated on the device

// Get the user from a non-authenticated manner
ParseQuery<ParseUser> query = ParseUser.getQuery();
query.getInBackground(user.getObjectId(), new GetCallback<ParseUser>() {
  public void done(ParseUser object, ParseException e) {
    object.setUsername("another_username");

    // This will throw an exception, since the ParseUser is not authenticated
    object.saveInBackground();
  }
});

перейдите по этой ссылке Ссылка

Ответ 2

public void update_user_score(String username, int original_score, int add)
{
  final int new_score = original_score + add;  
  ParseQuery<ParseUser> query = ParseUser.getQuery();
  query.whereEqualTo("username", username);
  query.setLimit(1);

query.findInBackground(new FindCallback() 
{
      public void done(final ParseUser object, ParseException e) 
      {
        if (e == null) 
        {   
            object.put("score", new_score);
            object.saveInBackground(new SaveCallback() 
            {
                public void done(ParseException e) 
                {

                    if(e==null)                                   
                    onBackPressed();                            
                }
            });
        }
      }
});
}

Ответ 3

Насколько я понимаю из вашего вопроса; вы хотите найти запись пользователя в таблице пользователя с помощью указанного идентификатора пользователя и обновить поле оценки. Первое предложение, а не findInBackground использовать getFirstInBackground. После этого проверяем возвращаемый объект пользователя, если он не равен нулю, при выполнении операции обновления пользователя. Затем вызовите saveInBackground. saveInBackground используется для выполнения операций при сохранении. В вашем коде я вижу, что вы пытаетесь снова сохранить объект в готовом методе. Кроме того, одно предложение - это контроль ACL.

ParseQuery<ParseUser> query = ParseUser.getQuery();
query.getFirstInBackground(someUserId, new GetCallback<ParseUser>() {
    public void done(ParseUser user, ParseException e) {
        if (e == null) {
            // No error e is null
            // check user object
            if (user == null) {
                // no user , error
            } else {
                // perfrom save operation
                //  put score field
                // call save in background
                // in done method update UI for example.
            }
        } else {
            // Something went wrong.
        }
    }
});