我是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>();
问题3:这是关键&#34;更新年份&#34;并指定一个值(年)?为什么呢?
feedback.put("updated year", new SMInt(Long.parseLong(year)));
问题4:如果之前使用update.add更新了对象...下面的代码是做什么的?
result = ds.updateObject("car", new SMString(carID), update);
问题5:下面的代码是做什么的?
feedback.put("updated object", result);
答案 0 :(得分:3)
Q1:他们从获取的JSON对象中读取并将字段car_ID和year的值存储在两个具有相同名称的局部变量中。
Q2:是的。反馈似乎是一个将以JSON
的形式发送回客户端的地图问题3:它将读取的值存储在新创建的hashmap'feedback'中的局部变量'year'中(如前所述)
问题4:不确定,我认为ds对象是某种数据库。如果是这样,它看起来需要将更新的值存储在hashmap'update'中并将其推送到数据库。
问题5:它将“result”对象存储在反馈hashmap中的“updated object”键下。
希望这会有所帮助:)
答案 1 :(得分:1)
<强> Q1 强> 不,它似乎不是设置类成员变量,而是设置execute()方法的本地变量。方法返回后,GC会清除这些本地变量。嗯,不是真的,但他们现在受制于GC,但那真的很技术性。
<强> Q2 强>
是的,您正在创建HashMap
并将其引用放入Map
。 Map
是一个接口,在Java中引用这样的东西是很好的做法。这样您就不会将代码绑定到特定实现。我相信Objective-C他们被称为Prototypes ???
<强> Q3 强>
我不确定为什么他们这样做。我假设在代码中的某处使用了feedback
Map
,并且该值被弹回。将地图视为NSDictionary
。看起来“年”是String
,因此他们使用Long.parseLong()
来转换它。不确定SMInt是什么...从名称看起来像一个代表“小int”的自定义类???
<强> Q4 强>
我不知道DataService
是什么,但我必须猜测它的某些服务读/写数据???从这个方法来看,我猜它调用服务来更新刚改变的值。
<强> Q5 强>
同样,feedback
是Map
...它将result
放在该地图的“更新对象”键中。