Search code examples
javaandroidbackendless

getting zero objects from BackendlessUser getProperty()


I've setup Backendless app, with User table having row name posts, which is data object relationship between User and Post tables, data relation is 1 to many. When I try to retrieve it using BackendlessUser.getProperty("key"), it returns zero objects. Once it even returned HashMap. I used the way mentioned in the the docs, but get null because the size of the Object[] is zero. I have data in that row for sure, wrote <uses-permission> for internet.

public class MainActivity extends AppCompatActivity {
    BackendlessUser user = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Backendless.initApp(this, "app_id", "android_key", "v1");

        Backendless.UserService.login("username", "password", new AsyncCallback<BackendlessUser>() {
            @Override
            public void handleResponse(BackendlessUser response) {
                user = response;
                doStuff();
            }
            @Override
            public void handleFault(BackendlessFault fault) {
                Log.e("Error logging in", "message: " + fault.getMessage());
            }
        });
    }

    //important
    private void doStuff() {
        Object[] postObjectArray = (Object[]) user.getProperty("posts");

        Post[] posts = null;

        if (postObjectArray != null && postObjectArray.length > 0)
            posts = (Post[])postObjectArray;

        if (posts == null)
        {
            Log.d("Problems", "posts is null");
        }
    }
}

Post class:

public class Post extends Object{

    private BackendlessUser user;
    private String file;
    private String message;
    private String objectId;

    public String getObjectId() {
        return objectId;
    }

    public void setObjectId(String objectId) {
        this.objectId = objectId;
    }

    public Post() {
    }

    public Post(BackendlessUser user, String file, String message) {
        this.user = user;
        this.file = file;
        this.message = message;
    }

    public BackendlessUser getUser() {
        return user;
    }

    public void setUser(BackendlessUser user) {
        this.user = user;
    }

    public String getFile() {
        return file;
    }

    public void setFile(String file) {
        this.file = file;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Solution

  • The reason was that checkbox "autoload", which loads all values of one to many relationships to which checkbox corresponds when the owning table was loaded, wasn't checked. Thus, user.getProperty("posts") was always returning null. But it should be noted that if the row is data object relationship, it returns HashMap<String, Object>, so Post needs to have constructor which accepts HashMap<String, Object>:

    public Post(HashMap hashMap)
    {
        this.hashMap = hashMap;
        property1 = (String)hashMap.get("property1");
        /*other properties*/
    }
    

    If there is no values, it will return an Object, which is not castable to any other type, so the way used in the docs must be applied in order to fix edge cases.

    EDIT:

    It's useful to map data table to class before making any calls to Backendless. That way, it is possible to eliminate all work with HashMap and directly get desired type. Despite that, if you're retrieving data through Backendless.Persistence you can specify it as argument.