کلاس دستورات
این کلاس درواقع یک ظرف برای نگهداری یکسری متد استاتیک هست که از کلاس اتصال به سرور که در مرحلهی قبلی نوشتیم کمک میگیره و پارامترها رو براش میفرسته و جوابها رو در قالبی که مدنظر ماست برمیگردونه:
public class Commands {
public static boolean insert(StructPerson person) {
boolean result = false;
HashMap<String, String> params = new HashMap<>();
params.put("action", "insert");
params.put("name", person.name);
params.put("phone", person.phone);
String json = Webservice.read(params);
if (json != null) {
try {
JSONObject obj = new JSONObject(json);
int code = obj.getInt("code");
result = (code == 1);
} catch (JSONException | NullPointerException e) {
e.printStackTrace();
}
}
return result;
}
public static ArrayList<StructPerson> search(String name) {
ArrayList<StructPerson> result = new ArrayList<>();
HashMap<String, String> params = new HashMap<>();
params.put("action", "search");
params.put("name", name);
String json = Webservice.read(params);
if (json != null) {
try {
JSONObject obj = new JSONObject(json);
int code = obj.getInt("code");
if (code == 1) {
JSONArray data = obj.getJSONArray("data");
int len = data.length();
for (int i = 0; i < len; i++) {
JSONObject item = data.getJSONObject(i);
StructPerson person = new StructPerson();
person.id = item.getInt("id");
person.name = item.getString("name");
person.phone = item.getString("phone");
result.add(person);
}
}
} catch (JSONException | NullPointerException e) {
e.printStackTrace();
}
}
return result;
}
}
همونطور که میبینید، این کلاس دو متد داره (insert و search) یعنی همون اکشنهای ما توی وبسرویس. اولی یه شئ از کلاس StructPerson میگیره و اون رو با کمک کلاس WebService درج میکنه و چک میکنه که آیا در جواب، کد 1 برگردونده میشه یا نه و نتیجه رو بصورت یه عبارت منطقی true/false برمیگردونه.
متد دوم یعنی search نیاز به توضیح بیشتری داره. این متد یه پارامتر String یعنی همون نام رو میگیره و جستجو رو انجام میده و خروجی JSON دریافتی رو تبدیل به آرایهای از اشیاء StructPerson میکنه و برمیگردونه. اما چطور این تبدیل انجام میشه؟ بیایم با همدیگه یه نگاه دقیقتر به یکی از مثالهایی که قبلاً برای صدازدن وبسرویس نوشتیم بندازیم:
ncis.ir/ws/index.php?action=search&name=a
// Result: {code:1,data:[{id:1,name:"ali",phone:"12345"},{id:2,name:"reza",phone:"67890"}]}
اگه خروجی رو یکم خواناتر کنیم و از تورفتگی استفاده کنیم، به این نتیجه میرسیم:
{
code:1,
data:
[
{
id:1,
name:"ali",
phone:"12345"
},
{
id:2,
name:"reza",
phone:"67890"
}
]
}
توی ساختار JSON هرجا { } دیدین یعنی JSONObject و هرجایی که [ ] مشاهده کردین بهمعنای JSONArray هست. بقیهی مقادیر یا بصورت متنی هستن که با کوتیشن در بخش مقدار از ساختار key/value مشخص میشن و یا بصورت عددی و منطقی و... هستن که از روی نوع مقدارشون میشه تشخیص داد که چه شیئی (مثل int و...) رو باید براشون بکار برد.
خوب حالا ببینیم ما این نتیجه رو چطور تبدیل به یک آرایه از اشیاء StructPerson میکنیم. ابتدا چک کردیم که کد 1 برگردونده بشه یعنی براساس name ارسالشده به وبسرویس، اطلاعاتی توی جدول پیدا شده یا نه. حالا اگه پیدا شده بود، همونطور که مشخصه باید قسمت data رو با کمک getJSONArray بگیریم و توی یک شئ از نوع JSONArray ذخیره کنیم. بعد تعداد عناصرش رو با کمک متد length میخونیم و یه حلقه تشکیل میدیم و یکییکی آیتم موردنظر رو استخراج میکنیم که این آیتم همونطور که توی خروجی مشخصه، باز یک JSONObject هست. بعدش یک شئ StructPerson جدید میسازیم و یکییکی عناصر id و name و phone رو از داخل item استخراج میکنیم و توی فیلدهای مربوطه قرار میدیم و اون شئ StructPerson که الان اطلاعاتش با نتایج دریافتی از سرور پر شده رو به آرایهی result اضافه میکنیم. درنهایت هم همین آرایه رو برمیگردونیم.