delight-im / Android-DDP

[UNMAINTAINED] Meteor's Distributed Data Protocol (DDP) for clients on Android
Apache License 2.0
274 stars 54 forks source link

How to pass complex parameters to method call? #12

Closed iahvector closed 9 years ago

iahvector commented 9 years ago

Can you please provide examples on how to pass parameters to Meteor.call()? How exactly can I pass an object like

{ key1: "value1", key2: "value2"}

or multiple objects or a mix of objects and arrays?

ocram commented 9 years ago

Thanks for your question!

There's an example in this repository already: https://github.com/delight-im/Android-DDP/blob/017a82ad1cc40ff4c4e8ecc3ba6d59a2d68bf317/Examples/DDP/src/im/delight/android/ddp/examples/MainActivity.java#L84

As you can see, the equivalent to JavaScript's {} is Java's Map<String, Object>. The equivalent to [] is List<Object>, by the way.

If you really need the call(...) method, you can see how it's done in the source of this library: https://github.com/delight-im/Android-DDP/blob/017a82ad1cc40ff4c4e8ecc3ba6d59a2d68bf317/Android/Source/src/im/delight/android/ddp/Meteor.java#L606

That method expects the arguments for the Meteor call as an Object[], so you can just wrap your single parameters in such an array. But often, you can just use the insert(...), update(...) or remove(...) methods.

Regarding your specific example, you could write it like this:

JavaScript:

{ key1: "value1", key2: "value2"}

Java:

Map<String, Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");

Parameter for "call" method:

new Object[] { map }

Does that help?

iahvector commented 9 years ago

Yes, thank you very much for the quick and elaborate answer.

guoyoujin commented 9 years ago

Oh, I use the GSON parsing out, thank you for your answer

isdzulqor commented 8 years ago

@iahvector could you tell me how you solve your problem, the slash at the beginning is only needed when accessing collections in call, so how do you handle the method in server because it's started with slash and need a return data, and how do you handle the data,, can you give me some example code, please,

iahvector commented 8 years ago

Hi @isdzulqor here's an example

Map<String, Object> params = new HashMap<>();
params.put("key1", "value1");
params.put("key2", 2);

List<Object> arrayParam = new ArrayList<>();
arrayParam.add("array value 1");
arrayParam.add("array value 2");
arrayParam.add("array value 3");

params.put("arrayKey", arrayParam);

meteor.call("methodName", new Object[]{params}, new ResultListener() {
    @Override
    public void onSuccess(String s) {
        // success
    }

    @Override
    public void onError(String error, String reason, String details) {
        // fail
    }
});

This is equal to calling

Meteor.call('methodName', {
  key1: "value1",
  key2: 2,
  arrayKey: [
    "array value 1",
    "array value 2",
    "array value 3"
  ]
});
isdzulqor commented 8 years ago

@iahvector Thank you for your fast response, and now how to handle the return data when we want to implement find query,,

ocram commented 8 years ago

@iahvector Thanks for the great example!

@isdzulqor Let's discuss the return values in a separate issue again. Maybe you could also show your code example then. But as explained in the other issues, /my-collection/find cannot be called.