Как работать с MySQL в Android

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Как работать с MySQL в Android

Сообщение trew » 17 окт 2013, 22:00

Учусь на примере http://devcolibri.com/1548
Сделал свою страничку http://android24.pusku.com/get_all_products.php
Таблица имеет кодировку utf8_general_ci, какую кодировку имеет база не знаю.
Вспомогательная информация http://android24.pusku.com/info.php

Код парсера
[syntax=java]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

final String TAG ="mylog";

// конструктор
public JSONParser() {

}

/**
* Получить ответ по ссылке в формате json
*
* @param url
* запрашиваемая страница
* @param method
* GET or POST
* @param params
* параметры, которые необходимо передать
* @return
*/
public JSONObject makeHttpRequest(String url, String method,
List<NameValuePair> params) {

// создаём HTTP запрос
try {

if (method == "POST") {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));

HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();

} else if (method == "GET") {
Log.d(TAG,"-----------------1---GET-----------");
DefaultHttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(params, "utf-8"); // utf-8 windows-1251
url += "?" + paramString;
HttpGet httpGet = new HttpGet(url);

HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}

} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

try {
Log.d(TAG,"-----------------1---try-----------");
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "iso-8859-1"), 8); // iso-8859-1
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
}

// пробуем распарсит JSON объект
try {
Log.d(TAG,"-----------------1---try---parsing--begin------");
jObj = new JSONObject(json);
Log.d(TAG,"-----------------1---try---parsing--end------");
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}

return jObj;

}
}
[/syntax]

Код для получения всех продуктов
[syntax=java]
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class AllProductsActivity extends ListActivity {

final String TAG ="mylog";

private ProgressDialog pDialog;

// Создаем JSON парсер
JSONParser jParser = new JSONParser();

ArrayList<HashMap<String, String>> productsList;

// url получения списка всех продуктов
private static String url_all_products = "http://android24.pusku.com/get_all_products.php";

// JSON Node names
private static final String TAG_SUCCESS = "success";
private static final String TAG_PRODUCTS = "products";
private static final String TAG_PID = "pid";
private static final String TAG_NAME = "name";

// тут будет хранится список продуктов
JSONArray products = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.all_products);

// Hashmap for ListView
productsList = new ArrayList<HashMap<String, String>>();

// Загружаем продукты в фоновом потоке
new LoadAllProducts().execute();

// получаем ListView
ListView lv = getListView();

// на выбор одного продукта
// запускается Edit Product Screen
lv.setOnItemClickListener(new OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String pid = ((TextView) view.findViewById(R.id.pid)).getText()
.toString();

// Запускаем новый intent который покажет нам Activity
Intent in = new Intent(getApplicationContext(), EditProductActivity.class);
// отправляем pid в следующий activity
in.putExtra(TAG_PID, pid);

// запуская новый Activity ожидаем ответ обратно
startActivityForResult(in, 100);
}
});

}

// Ответ из Edit Product Activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// если результующий код равен 100
if (resultCode == 100) {
// если полученный код результата равен 100
// значит пользователь редактирует или удалил продукт
// тогда мы перезагружаем этот экран
Intent intent = getIntent();
finish();
startActivity(intent);
}

}

/**
* Фоновый Async Task для загрузки всех продуктов по HTTP запросу
* */
class LoadAllProducts extends AsyncTask<String, String, String> {

/**
* Перед началом фонового потока Show Progress Dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(AllProductsActivity.this);
pDialog.setMessage("Загрузка продуктов. Подождите...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(false);
pDialog.show();
}

/**
* Получаем все продукт из url
* */
protected String doInBackground(String... args) {
// Будет хранить параметры
List<NameValuePair> params = new ArrayList<NameValuePair>();
// получаем JSON строк с URL

JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", params);

Log.d(TAG,"-----------------1--------------");
Log.d(TAG, json.toString());
Log.d(TAG,"-----------------2--------------");

Log.d("All Products: ", json.toString());

try {
// Получаем SUCCESS тег для проверки статуса ответа сервера
int success = json.getInt(TAG_SUCCESS);

if (success == 1) {
// продукт найден
// Получаем масив из Продуктов
products = json.getJSONArray(TAG_PRODUCTS);

// перебор всех продуктов
for (int i = 0; i < products.length(); i++) {
JSONObject c = products.getJSONObject(i);

// Сохраняем каждый json елемент в переменную
String id = c.getString(TAG_PID);
String name = c.getString(TAG_NAME);

// Создаем новый HashMap
HashMap<String, String> map = new HashMap<String, String>();

// добавляем каждый елемент в HashMap ключ => значение
map.put(TAG_PID, id);
map.put(TAG_NAME, name);

// добавляем HashList в ArrayList
productsList.add(map);
}
} else {
// продукт не найден
// Запускаем Add New Product Activity
/*
Intent i = new Intent(getApplicationContext(),
NewProductActivity.class);
// Закрытие всех предыдущие activities
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

*/
}
} catch (JSONException e) {
e.printStackTrace();
}

return null;
}

/**
* После завершения фоновой задачи закрываем прогрес диалог
* **/
protected void onPostExecute(String file_url) {
// закрываем прогресс диалог после получение все продуктов
pDialog.dismiss();
// обновляем UI форму в фоновом потоке
runOnUiThread(new Runnable() {
public void run() {
/**
* Обновляем распарсенные JSON данные в ListView
* */
ListAdapter adapter = new SimpleAdapter(
AllProductsActivity.this, productsList,
R.layout.list_item, new String[] { TAG_PID,
TAG_NAME},
new int[] { R.id.pid, R.id.name });
// обновляем listview
setListAdapter(adapter);
}
});

}

}

}
[/syntax]

Лог

Код: Выделить всё

10-17 16:14:17.036: D/mylog(16715): -----------------1---GET-----------
10-17 16:14:18.705: D/mylog(16715): -----------------1---try-----------
10-17 16:14:18.737: D/mylog(16715): -----------------1---try---parsing--begin------
10-17 16:14:18.737: E/JSON Parser(16715): Error parsing data org.json.JSONException: Value ?»??»??»? of type java.lang.String cannot be converted to JSONObject
10-17 16:14:18.745: D/mylog(16715): -----------------1--------------
10-17 16:14:18.745: W/dalvikvm(16715): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
10-17 16:14:18.755: E/AndroidRuntime(16715): FATAL EXCEPTION: AsyncTask #1
10-17 16:14:18.755: E/AndroidRuntime(16715): java.lang.RuntimeException: An error occured while executing doInBackground()
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at android.os.AsyncTask$3.done(AsyncTask.java:200)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at java.lang.Thread.run(Thread.java:1096)
10-17 16:14:18.755: E/AndroidRuntime(16715): Caused by: java.lang.NullPointerException
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at com.example.prg_json_car.AllProductsActivity$LoadAllProducts.doInBackground(AllProductsActivity.java:131)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at com.example.prg_json_car.AllProductsActivity$LoadAllProducts.doInBackground(AllProductsActivity.java:1)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-17 16:14:18.755: E/AndroidRuntime(16715): 	... 4 more
10-17 16:14:18.876: D/dalvikvm(16715): GC_FOR_MALLOC freed 2784 objects / 192976 bytes in 124ms
10-17 16:14:19.505: E/WindowManager(16715): Activity com.example.prg_json_car.AllProductsActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e51740 that was originally added here
10-17 16:14:19.505: E/WindowManager(16715): android.view.WindowLeaked: Activity com.example.prg_json_car.AllProductsActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e51740 that was originally added here
10-17 16:14:19.505: E/WindowManager(16715): 	at android.view.ViewRoot.<init>(ViewRoot.java:247)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.view.Window$LocalWindowManager.addView(Window.java:424)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.app.Dialog.show(Dialog.java:241)
10-17 16:14:19.505: E/WindowManager(16715): 	at com.example.prg_json_car.AllProductsActivity$LoadAllProducts.onPreExecute(AllProductsActivity.java:117)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.os.AsyncTask.execute(AsyncTask.java:391)
10-17 16:14:19.505: E/WindowManager(16715): 	at com.example.prg_json_car.AllProductsActivity.onCreate(AllProductsActivity.java:58)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.os.Handler.dispatchMessage(Handler.java:99)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.os.Looper.loop(Looper.java:123)
10-17 16:14:19.505: E/WindowManager(16715): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
10-17 16:14:19.505: E/WindowManager(16715): 	at java.lang.reflect.Method.invokeNative(Native Method)
10-17 16:14:19.505: E/WindowManager(16715): 	at java.lang.reflect.Method.invoke(Method.java:521)
10-17 16:14:19.505: E/WindowManager(16715): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-17 16:14:19.505: E/WindowManager(16715): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-17 16:14:19.505: E/WindowManager(16715): 	at dalvik.system.NativeStart.main(Native Method)
10-17 16:19:18.930: I/Process(16715): Sending signal. PID: 16715 SIG: 9
Подозреваю, что проблема с кодировкой. Нужна Ваша помощь.
Последний раз редактировалось trew 17 окт 2013, 23:45, всего редактировалось 1 раз.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Как работать с MySQL в Android

Сообщение rezak90 » 17 окт 2013, 23:03

причём здесь MySQL? если работа идёт с json'ом?
R.id.team
Политика на форуме запрещена

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

Re: Как работать с MySQL в Android

Сообщение trew » 17 окт 2013, 23:38

Тему назвал как в статье, которую разбираю.

Разобрался, загружалась строка =???{json запрос}
Сделал replace и всё заработало.
Откуда эти знаки вопроса взялись, разбираюсь.
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

Аватара пользователя
mozilalvfg
Сообщения: 85
Зарегистрирован: 10 авг 2013, 18:46

Re: Как работать с MySQL в Android

Сообщение mozilalvfg » 18 окт 2013, 00:20

trew писал(а): Откуда эти знаки вопроса взялись, разбираюсь.
при несовместимости кодировок - на сервере и на клиенте. К примеру на сервере UTF-8 на клиенте CP1251. Или на сервере MySql UTF-8 а PHP (apache) CP1251. Таблица базы MySql UTF-8 а текстовое поле CP1251 или база MySql UTF-8 а таблица CP1251. В общем проблема в разных кодировках.
Из средств, расширяющих сознание, я признаю только книги и немного пива!
____________________________________________________________________
IntelliJ IDEA 12. Win 7 x64 sp1
KSWEB: сервер + PHP + MySQL FREE
Изображение

Ответить