php - 从远程数据库获取异常下载 JSON
问题描述
我正在使用以下代码从远程 MySQL 数据库获取数据:
private void getComprasFromDB(int id) {
Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR: ");
compras.clear();
AsyncTask<Integer, Void, Void> asyncTask = new AsyncTask<Integer, Void, Void>() {
@Override
protected Void doInBackground(Integer... addressesIds) {
Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR: "+id_usuario);
OkHttpClient client = new OkHttpClient();
okhttp3.Request request = new okhttp3.Request.Builder()
.url("https://.../mis_compras.php?id="+id_usuario)
.build();
try {
okhttp3.Response response = client.newCall(request).execute();
JSONArray array = new JSONArray(response.body().string());
for (int i = 0; i < array.length(); i++) {
JSONObject object = array.getJSONObject(i);
Log.d("HOLA PERFIL", "mis compras response: " + response.body().string());
Compras compra = new Compras(
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas"),
object.getString("id_ventas")
);
compras.add(compra);
}
} catch (IOException e) {
Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR:IO "+e);
e.printStackTrace();
} catch (JSONException e) {
Log.d("HOLA ADDRESSES", "DIRECCION LEIDA SIN BUSCAR:json "+e);
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
adapter.notifyDataSetChanged();
if (compras.size() == 0){
txtNohaytickets.setVisibility(View.VISIBLE);
}
else
{
txtNohaytickets.setVisibility(View.GONE);
}
}
};
asyncTask.execute(id);
}
它工作正常。我的问题是当我用另一个更改数据库表时。在 PHP 文件中,工作表 tb_tickets_reparacion 的代码如下:
$con->set_charset("utf8");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
/*Get the id of the last visible item in the RecyclerView from the request and store it in a variable. For the first request id will be zero.*/
$id = mysqli_real_escape_string($con,$_GET["id"]);
$sql= "Select tr.*,tc.nombre as nombre_categoria,tm.nombre as nombre_marca,
modelos.nombre as nombre_modelo
from tb_tickets_reparacion tr
LEFT JOIN tb_categorias tc ON tc.id = tr.categoria
LEFT JOIN tb_marcas tm ON tm.id = tr.marca
LEFT JOIN tb_modelos modelos ON modelos.id = tr.modelo
WHERE id_cliente = '".$id."' ";
$result = mysqli_query($con ,$sql);
while ($row = mysqli_fetch_assoc($result)) {
$array[] = $row;
}
header('Content-Type:Application/json');
echo json_encode($array);
mysqli_free_result($result);
mysqli_close($con);
如果我使用相同的应用程序代码但更改 PHP 文件以从另一个表中获取数据,仅用于测试,如下所示:
$sql= "Select tr.* from tb_ventas tr ";
然后我得到以下异常:
2019-10-09 12:12:13.448 27800-27875/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
Process: com.mpidesarrollo.jogua, PID: 27800
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:353)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.IllegalStateException: closed
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:408)
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:402)
at okhttp3.internal.Util.bomAwareCharset(Util.java:432)
at okhttp3.ResponseBody.string(ResponseBody.java:174)
at com.mpidesarrollo.jogua.activity.MisComprasFragment$4.doInBackground(MisComprasFragment.java:271)
at com.mpidesarrollo.jogua.activity.MisComprasFragment$4.doInBackground(MisComprasFragment.java:251)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
我究竟做错了什么?
编辑
查询的浏览器输出:
给定查询的 PHPMyAdmind 输出:
解决方案
推荐阅读
- php - Laravel 使用电话或电子邮件和密码进行身份验证
- android - 在虚拟主机上使用解析
- r - bookdown - 使用 word_document2 时如何获取图上方的图标题和图下方的图注
- xamarin - Xamarin Forms XAML HotReload 在 Mac 上不起作用
- amazon-web-services - 在子解析器 AWS AppSync 中获取父对象
- javascript - 我的代码有什么问题?我的 React Native App 在没有任何日志的情况下调用 firestore 时崩溃
- c# - Graph API 查询 - 如何结合展开和选择
- ios - 调整 UISlider 拇指图像
- html - 自定义输入名称的自动完成
- javascript - 在 JavaScript 中,取 2 个值并添加它们并在 Powershell 脚本上运行它