我正在使用 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
您问题所附的图片解释了您所面临的行为。我们可以看到 User 类上的 ACL 列仅允许与记录关联的用户读写。
您有两种选择来解决此问题:
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 内置方法从客户端调用函数。