جلسه ی هفتم دریافت داده از وب سرویس در اندروید : قسمت دوم
وارد بحث گرفتن داده ها از وب سرویس ایجاد شده میشویم .
یکی از دوستان بپرسیده بود که من زمانی که در دیتابیسم از فارسی استفاده میکنم به شکل ؟؟؟ نشون داده میشود .
خب در اینجا میخواهیم یکی از فنون آخر بروسلی رو به شما بگم برای رفع این مشکل کافی است بعد از connection تون به صورت زیر عمل کنید
<?php
$con = mysqli_connect("localhost","root","","teldb");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
mysqli_set_charset($con,"UTF8");
عبارت mysqli_set_charset داده های دیتابیس را به untf8 تبدیل میکند .
اگر خروجی شما به شکل unicode در آمد مشکلی وجود ندارد چرا که مفسر آن را به این شکل تبدیل کرده است و در اندروید خواهی دید . که داده ها به صورت درست ظاهر میشود .
تا اینجا دیدم که چحوری توانستیم به وب سرویسمان وصل بشیم .و توسط status code برابر با 200 متوجه شدیم که ارتباط موفقیت آمیز بوده است .
حال داده هایی را که در دیتابیس ذخیره کردیم میخواهیم مثلاً در یک textview نمایش دهیم .
پس از قبل داشتیم :
int code = response.getStatusLine().getStatusCode();
Log.i("Status Code", code + "");
در این قسمت ما نیاز به توابعی از HttpResponse با نام getEntity() که در واقع دسترسی به محتوای سایت را برای ما امکان میسازد چیزی شبیه getintent خودمان است و برای اینکه محتویات سایت را ببینیم بایستی متد getcontent که از جنس inputstream هست را فرا بخوانیم .
پس به زبان کدی داریم
int code = response.getStatusLine().getStatusCode();
if (code == 200) {
response.getEntity().getContent();
}
برای آنکه آن این محتوی را داخل ui بیاوریم طبیعتاً بایستی آن را به string تبدیل کنیم . مقدار getcontent(); از جنس inputstream است و تبدیل کردن آن به string نیازمند کار با فایل در جاواست که همگی در آن استادند .اگرم کسی بلد نبود میتونه بصورت کلیشه ای از متد زیر استفاده کنه :
String StreamToString(InputStream in)
{
BufferedReader r = new BufferedReader(new InputStreamReader(in));
StringBuilder total = new StringBuilder();
String line;
try
{
while ((line = r.readLine()) != null) {
total.append(line);
}
return total.toString();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
}
پس در نهایت داریم :
private String result;
//=============def class=======
if (code == 200) {
result = StreamToString(response.getEntity().getContent());
Log.d("GetText", result);
}
الان همینو در textview مربوطه settext کنید چه میبینید ؟ خروجی ما چاپ می شود .اگه برنامه کرش کرد یا permission ندادید یا اینکه باید کدهای net را تو thread بذارید . حال میخواهیم داده ها را به تفکیک بگیریم .
داده ای که ما داریم به اندروید میفرستیم . به شکل
[{"id":"1","name":"ehsan","family":"harani","tel ":" 09123456789","address":"Address1"},{"id":"2","name ":"Site","family":"BarenameNevis","tel":"09197 8345 67","address":"mir mojtahedi"}]
می باشد .
که ما آن را گرفتیم و در یک string result نمایش دادیم .
این داده ابتدا با [ و در پایان با ] نشان داده شده است .و هر عضو آن با , جدا شده به این نوع داده JSONArray میگویند . هر عضو داده با } شروع و با { تمام میشود و هر عضو به صورت key-value پر میشود و با , از هم جدا میشود به این نوع داده که بصورت {"key1":"value1","key2":"value2"} نمایش داده میشود JSONObject میگوند . پس JSONArray آرایه ای است که هر عضو آن یک JSONObject است که مابین [] قرار میگیرد .
اگر پردازش و ظاهر این خروجی json برای شما گیج کننده است میتوانید تو گوگل سرچ کنید json viewer آنگاه هزاران سایت برای شما باز میشود با انتخاب هر کدام شما وارد سایتی میشوید که میتوانید این text ناخوانا را بصورت گرافیکی و خوانا مشاهده نمایید .در اینجا خواهی دید که کاراکترهایی که بصورت unicode در پنجره برازر شما بوده به شکل فارسی رویت میشود .
حالا که با json آشنا شدیم برای تفکیک داده ی string result از آن استفاده میکنیم .
خود من میخواهم تمام داده ها را در یک string بریزم شما میتونید آن را در دیتابیس بریزید یا هرجوری که میخواین آن را ذخیره کنید .
من برای اینکار از متد زیر استفاده میکنم .
public String getData() {
final StringBuilder sb = new StringBuilder();
try {
JSONArray array = new JSONArray(result);
for (int i = 0 ; i < array.length() ; i++){
JSONObject object = array.getJSONObject(i);
sb.append(object.getLong("person_id"));
sb.append(object.getString("person_name"));
sb.append(object.getString("person_family"));
sb.append(object.getString("person_tel"));
sb.append(object.getString("address"));
}
return sb.toString();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
حالا من اینو متد را در یک کنترل تکست ویو settext میکنم . بازم میگم دیگه این قسمت سلیقه ای هر جوری که خواستید میتونید رفتار کنید میتونید برای زیباتر شدن یک structure بسازید و داده ها رو تو دیتابیس بریزید . و مثلاً هر قسمت رو تو یک cell در لیست ویو لود کنید .
بحث گرفتن داده رو گفتیم فقط میمونه که بحثه ارسال آن نیز را بگیم .