ParseQuery 未检索所有数据

问题描述 投票:0回答:1

我正在使用 Parse Server 制作 Android 应用程序,并且在 ParseUsers 查询中遇到了某种错误。由于某种原因,当我创建

query.find()
来获取所有数据时,只会获取一个用户,即当前登录的用户(如果以其他用户身份登录,也会发生同样的情况)。该函数如下所示:

private void addContact(String contactNickname){ // TODO Bug en la query de usuarios
        //Se hace la consulta a la base de datos:
        try {
            ParseQuery<UserBO> usuarios = ParseQuery.getQuery(UserBO.class);
            ParseQuery<ParseUser> pruebaUsers = ParseUser.getQuery();
            //ParseQuery<ContactListBO> pruebaContactos = ParseQuery.getQuery(ContactListBO.class);
            //usuarios.whereEqualTo("username", contactNickname);
            usuarios.setLimit(5);
            System.out.println("-----------------------------------------");
            System.out.println("USUARIOS ENCONTRADOS CON "+ contactNickname + ":");
            List<UserBO> resultados = new ArrayList<>();
            pruebaUsers.findInBackground(new FindCallback<ParseUser>() {
                @Override
                public void done(List<ParseUser> objects, ParseException e) {
                    if (objects != null){
                        for(int i = 0; i < objects.size(); i++){
                            System.out.println(objects.get(i).toString());
                        }
                    }
                }
            });
            //List<ContactListBO> prueba = pruebaContactos.find();
            resultados = usuarios.find();
            System.out.println(resultados.size());
            for(int i = 0; i < resultados.size(); i++){
                System.out.println(resultados.get(i).toString());
            }
            /*for(int i = 0; i < prueba.size(); i++){
                System.out.println(prueba.get(i).getObjectId());
            }*/
            System.out.println("-----------------------------------------");
//            UserBO contactoNuevo = resultados.get(0);
//
//            ContactListBO agregarContacto = new ContactListBO();
//            agregarContacto.setIdUser(currentUser.getObjectId());
//            agregarContacto.setIdContact(contactoNuevo.getObjectId());
//            agregarContacto.saveInBackground(new SaveCallback() {
//                @Override
//                public void done(ParseException e) {
//                    if (e == null){
//                        onResponse("201");
//                    }else{
//                        onResponse("400");
//                    }
//                }
//            });

        } catch (ParseException parseException) {
            parseException.printStackTrace();
        }
    }
正如你所看到的,有多个查询,主要是因为我正在做测试,但我关心的是
UserBO
查询。阅读时您会看到一个
ContactListBO
查询,该查询工作得很好,但我对
UserBO
查询做了同样的事情,我只得到了 3 个用户中的 1 个,如下所示:

UserBO{id=vluB9loAHe, UniqueUsername='prueba1', CompleteName='testUno', Password=null}

正如我所说,它只获取当前登录的用户,我需要获取所有用户。如果您需要它,这里是 UserBO.java:

package co.com.signchat.co.com.signchat.entity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import com.parse.ParseClassName;
import com.parse.ParseUser;

@ParseClassName("_User")
public class UserBO extends ParseUser {

    private static final String id = "objectId";
    private static final String completeName = "NombreCompleto";
    private static final String uniqueUsername = "username";
    private static final String password = "password";

    //FOTO DE PERFIL
    private String base64profilePicture;
    private String base64miniProfilePicture;
    private Bitmap profilePictureBitmap;

    private int user_state_id;




    //GETTERS Y SETTERS

    //id
    public String getId(){return getObjectId();}
    public void setId(int id){
        put(this.id, id);
    }

    //completeName
    public String getCompleteName(){return getString(completeName);}
    public void setCompleteName(String completeName){
        put(this.completeName, completeName);
    }

    //uniqueUsername:
    public String getUniqueUsername(){return getUsername();}
    public void setUniqueUsername(String uniqueUsername){
        put(this.uniqueUsername, uniqueUsername);
    }

    //password
    public String getPassword(){return getString(password);}
    public void setPassword(String password){
        put(this.password, password);
    }

    //base64profilePicture
    public void setBase64profilePicture(String base64profilePicture){
        this.base64profilePicture = base64profilePicture;

        byte[] byteCode = Base64.decode(base64profilePicture, Base64.DEFAULT);
        this.profilePictureBitmap = BitmapFactory.decodeByteArray(byteCode, 0, byteCode.length);
    }
    public String getBase64profilePicture(){
        return this.base64profilePicture;
    }

    public Bitmap getProfilePictureBitmap() {
        return profilePictureBitmap;
    }

    //user_state_id
    public int getUser_state_id(){return this.user_state_id;}
    public void setUser_state_id(int user_state_id){
        this.user_state_id = user_state_id;
    }

    //base64miniProfilePicture
    public String getBase64miniProfilePicture() {return base64miniProfilePicture;}
    public void setBase64miniProfilePicture(String base64miniProfilePicture) {
        this.base64miniProfilePicture = base64miniProfilePicture;
    }

    @Override
    public String toString() {
        return "UserBO{" +
                "id=" + getId() +
                ", UniqueUsername='" + getUniqueUsername() + '\'' +
                ", CompleteName='" + getCompleteName() + '\'' +
                ", Password=" + getPassword() +
                '}';
    }
}

这些是我的数据库中的所有用户,我正在使用 PostgresSQL

android parse-platform
1个回答
0
投票

您问题所附的图片解释了您所面临的行为。我们可以看到 User 类上的 ACL 列仅允许与记录关联的用户读写。

您有两种选择来解决此问题:

  1. 您可以制定逻辑,某些特定角色或用户有权读取数据库中的所有用户。在应用程序中,您应该使用此角色/用户进行身份验证,以便能够读取所有用户数据。
  2. 编写可以吸引所有用户的云代码。确保使用
    useMasterKey
    选项覆盖对象和类访问权限。
Parse.Cloud.define('fetchAllUsers', () => {
  // Create new query from user class
  const query = new Parse.Query(Parse.User)
  // Return the result of query
  return query.find({ useMasterKey: true })
})

然后可以使用 Parse SDK 内置方法从客户端调用函数。

© www.soinside.com 2019 - 2024. All rights reserved.