Я программирую приложение для Android, которое работает с базой данных MySQL. В этой базе данных есть таблица для записи некоторых результатов.
Мое приложение может общаться с этой таблицей и делать CRUD
операции (create
, delete
, read
а также update
) с использованием PHP.
Однако сейчас я хочу создать новые таблицы в этой БД программным способом. Я использовал и тестировал следующий код PHP вручную, и он отлично работает, но выдает ошибку при выполнении запроса из моего приложения.
Ниже приведены фрагменты кода и сообщение об ошибке. Ответы или обсуждения очень приветствуются.
Вот куда я отправляю запрос на создание таблицы:
table_name = "Background_Apps_Test";
params.add(new BasicNameValuePair("table_name", table_name));
json = jsonParser.makeHttpRequest(Config.FILE_UPLOAD_URL+"create_table.php", "POST", params);
Вот мой php-файл, через который я запрашиваю создание:
<?php
if (isset($_POST['table_name']){
$table_name = $_POST['table_name'];
require_once __DIR__ . '/db_connect.php';
$db = new DB_CONNECT();
$query = "CREATE TABLE $table_name (
pid int(11) primary key auto_increment,
l_type varchar(100) not null,
l_info varchar(5000) not null,
l_ip varchar(15),
created_at timestamp default now()
)";
}
?>
Это сообщение об ошибке:
E/AndroidRuntime﹕ FATAL EXCEPTION: main
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1128)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
at libcore.io.IoBridge.connectErrno(IoBridge.java:159)
at libcore.io.IoBridge.connect(IoBridge.java:112)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
at java.net.Socket.connect(Socket.java:857)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:365)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
at mtb.saeed.com.mytestingbenchmark.JSONParser.makeHttpRequest(JSONParser.java:52)
at mtb.saeed.com.mytestingbenchmark.XmlFileCreator.Automate(XmlFileCreator.java:400)
at mtb.saeed.com.mytestingbenchmark.XmlFileCreator$12.onClick(XmlFileCreator.java:260)
at android.view.View.performClick(View.java:4211)
at android.view.View$PerformClick.run(View.java:17446)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
at dalvik.system.NativeStart.main(Native Method)
Проблема с вашим кодом Android.
Фактически, Android подразумевает, что вы запускаете весь сетевой код в потоке, отличном от основного потока. Попробуйте переместить ваш код (вызывающий сервер), например, в AsyncTask.
Отредактировано:
Вот ваша точная проблема:
Как исправить android.os.NetworkOnMainThreadException?
Других решений пока нет …