0

我是 JAVA 新手,但我知道 Objective-C。我必须编写一个服务器端自定义代码,但下面的代码有问题:

/**
 * This example will show a user how to write a custom code method
 * with two parameters that updates the specified object in their schema
 * when given a unique ID and a `year` field on which to update.
 */

public class UpdateObject implements CustomCodeMethod {

  @Override
  public String getMethodName() {
    return "CRUD_Update";
  }

  @Override
  public List<String> getParams() {
    return Arrays.asList("car_ID","year");
  }

  @Override
  public ResponseToProcess execute(ProcessedAPIRequest request, SDKServiceProvider serviceProvider) {
    String carID = "";
    String year  = "";

    LoggerService logger = serviceProvider.getLoggerService(UpdateObject.class);
    logger.debug(request.getBody());
    Map<String, String> errMap = new HashMap<String, String>();

    /* The following try/catch block shows how to properly fetch parameters for PUT/POST operations
     * from the JSON request body
     */

    JSONParser parser = new JSONParser();
    try {
      Object obj = parser.parse(request.getBody());
      JSONObject jsonObject = (JSONObject) obj;

      // Fetch the values passed in by the user from the body of JSON
      carID = (String) jsonObject.get("car_ID");
      year = (String) jsonObject.get("year");
      //Q1:  This is assigning the values to  fields in the fetched Object?

    } catch (ParseException pe) {
      logger.error(pe.getMessage(), pe);
      return Util.badRequestResponse(errMap, pe.getMessage());
    }

    if (Util.hasNulls(year, carID)){
      return Util.badRequestResponse(errMap);
    }

    //Q2:  Is this creating a new HashMap?  If so, why is there a need?
    Map<String, SMValue> feedback = new HashMap<String, SMValue>();
    //Q3:  This is taking the key "updated year" and assigning a value (year)?  Why?
    feedback.put("updated year", new SMInt(Long.parseLong(year)));

    DataService ds = serviceProvider.getDataService();
    List<SMUpdate> update = new ArrayList<SMUpdate>();

    /* Create the changes in the form of an Update that you'd like to apply to the object
     * In this case I want to make changes to year by overriding existing values with user input
     */
    update.add(new SMSet("year", new SMInt(Long.parseLong(year))));

    SMObject result;
    try {
      // Remember that the primary key in this car schema is `car_id`

      //Q4: If the Object is updated earlier with update.add... What is the code below doing?
      result = ds.updateObject("car", new SMString(carID), update);

      //Q5: What's the need for the code below?
      feedback.put("updated object", result);

    } catch (InvalidSchemaException ise) {
      return Util.internalErrorResponse("invalid_schema", ise, errMap);  // http 500 - internal server error
    } catch (DatastoreException dse) {
      return Util.internalErrorResponse("datastore_exception", dse, errMap);  // http 500 - internal server error
    }

    return new ResponseToProcess(HttpURLConnection.HTTP_OK, feedback);
  }

}

Q1:下面的代码是将值分配给获取的对象中的字段?

carID = (String) jsonObject.get("car_ID");
year = (String) jsonObject.get("year");

Q2:这是在创建一个新的HashMap吗?如果是这样,为什么需要?

Map<String, SMValue> feedback = new HashMap<String, SMValue>();

Q3:这是取键“更新年份”并赋值(年份)?为什么?

feedback.put("updated year", new SMInt(Long.parseLong(year)));

Q4:如果 Object 之前用 update.add 更新过……下面的代码是做什么的?

result = ds.updateObject("car", new SMString(carID), update);

Q5:下面的代码是做什么的?

feedback.put("updated object", result);

原始代码

短信集

SMINT

4

2 回答 2

3

Q1:他们从获取的 JSON 对象中读取数据,并将字段 car_ID 和 year 的值存储在两个同名的局部变量中。

Q2:是的。反馈似乎是一张地图,将作为 JSON 发送回客户端

Q3:它将读取的值存储到新创建的哈希映射“反馈”中的局部变量“年份”(如前所述)中

Q4:不确定,我假设 ds 对象是某种数据库。如果是这样,它看起来像是获取存储在哈希映射“更新”中的更新值并将其推送到数据库。

Q5:它将“结果”对象存储在反馈哈希图中的键“更新对象”下。

希望这可以帮助 :)

于 2013-09-17T20:13:45.270 回答
1

Q1 不,它似乎不是在设置类成员变量,而是在 execute() 方法的本地变量。一旦方法返回,这些本地变量就会被 GC 清理掉。好吧,不是真的,但它们现在受制于 GC,但这确实是技术性的。

Q2 是的,您正在创建 aHashMap并将其引用放入 aMap中。 Map是一个接口,在 Java 中引用这样的东西是一种很好的做法。这样,您就不会将代码绑定到特定的实现。我相信 Objective-C 他们被称为原型???

Q3 我不确定他们为什么要这样做。我假设在代码中的某个地方feedback Map使用了该值,并且该值被提取了出来。将地图视为NSDictionary. 看起来 "year" 是 a String,所以他们用Long.parseLong()它来转换它。不确定 SMInt 是什么……从名字上看,它看起来像是一个代表“小 int”的自定义类???

Q4 我不知道是什么DataService,但我必须猜测它的某种服务读/写数据???从该方法中,我猜它调用服务来更新您刚刚更改的值。

Q5 再次,feedback是一个Map......它正在放入result该地图的“更新对象”键。

于 2013-09-17T20:16:39.697 回答