strongloop-community/loopback-sdk-android

Add to Model class another save method to return the response of the object being added

serjooo opened this issue · 1 comments

The way currently the save in Model is implemented is:

public void save(final VoidCallback callback) {
        invokeMethod(id == null ? "create" : "save", toMap(),
                new Adapter.JsonObjectCallback() {

            @Override
            public void onError(Throwable t) {
                callback.onError(t);
            }

            @Override
            public void onSuccess(JSONObject response) {
                Object id = response.opt("id");
                if (id != null) {
                    setId(id);
                }
                callback.onSuccess();
            }
        });
    }

Sometimes after saving something to the database you care about getting the JsonResponseObject, like maybe getting the ID for the object saved from the ResponseObject. So I was thinking that we have another save method in the Model class that actually returns a JSONResponseObject like this

public void save(final JsonObjectCallback callback) {
        invokeMethod(id == null ? "create" : "save", toMap(),
                new Adapter.JsonObjectCallback() {

            @Override
            public void onError(Throwable t) {
                callback.onError(t);
            }

            @Override
            public void onSuccess(JSONObject response) {
                Object id = response.opt("id");
                if (id != null) {
                    setId(id);
                }
                callback.onSuccess(response);
            }
        });
    }

I found a work around to this. What you can do is in your repository implement a method and make it accept an ObjectCallback and then when calling save you would actually create a new VoidCallback and implement its methods and then you would be able to call your ObjectCallback appropriately according to the VoidCallback and return the object. Here is an example to clarify what has been added:

public void createObject(String firstName, String lastName final ObjectCallback objectCallback) {
        HashMap<String, Object> params = new HashMap<>();

        params.put("firstName", firstName);
        params.put("lastName", lastName);

        final Object theObject = repository.createObject(params);
        theObject .setFirstName(employeeId);
        theObject .setLastName(valetTeamId);

        theObject.save(new VoidCallback() {
            @Override
            public void onSuccess() {
                objectCallback.onSuccess(theObject);
            }

            @Override
            public void onError(Throwable t) {
                objectCallback.onError(t);
            }
        });

    }