上一篇
安卓与mysql数据库连接
- 行业动态
- 2025-04-24
- 4352
安卓通过后端服务器(如PHP/Node.js)与MySQL交互,采用REST API或Web Service传输数据,使用Retrofit/OkHttp等库发起HTTP请求,需注意SQL注入防护及SSL加密通信
安卓与MySQL数据库连接实现方案
环境准备
MySQL数据库
- 安装MySQL服务器并创建数据库。
- 创建用户并授权远程访问(需开启权限)。
- 配置防火墙允许MySQL端口(默认3306)。
安卓开发环境
- Android Studio + JDK。
- 添加网络权限到
AndroidManifest.xml
:<uses-permission android:name="android.permission.INTERNET" />
中间层服务
推荐使用PHP/Node.js/Java等搭建Web API,避免直接暴露数据库。
关键技术点
关键步骤 | 说明 |
---|---|
网络请求库 | 使用OkHttp 或Retrofit 发送HTTP请求到中间层。 |
数据交互格式 | 中间层返回JSON数据,安卓端用Gson 解析。 |
多线程处理 | 网络操作需在子线程执行(如AsyncTask 、Thread 或RxJava )。 |
数据库连接安全性 | 禁止安卓直连MySQL,必须通过HTTPS加密通道+中间层隔离。 |
代码示例(PHP中间层 + Retrofit)
PHP脚本(api.php)
<?php $servername = "localhost"; $username = "root"; $password = "password"; $dbname = "testdb"; $conn = new mysqli($servername, $username, $password, $dbname); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT FROM users"; $result = $conn->query($sql); $data = array(); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { $data[] = $row; } } echo json_encode($data); $conn->close(); ?>
安卓端Retrofit配置
// 1. 添加依赖 // implementation 'com.squareup.retrofit2:retrofit:2.9.0' // implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 2. 定义API接口 public interface ApiService { @GET("/api.php") Call<List<User>> getUsers(); } // 3. 创建Retrofit实例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://yourserver.com/") // 替换为中间层地址 .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class); // 4. 发送请求 apiService.getUsers().enqueue(new Callback<List<User>>() { @Override public void onResponse(Call<List<User>> call, Response<List<User>> response) { if (response.isSuccessful()) { List<User> users = response.body(); // 处理数据 } } @Override public void onFailure(Call<List<User>> call, Throwable t) { t.printStackTrace(); } });
常见问题与解决方案
问题 | 解决方案 |
---|---|
连接超时或失败 | 检查MySQL远程权限、防火墙规则,确保中间层服务正常运行。 |
JSON解析异常 | 确认PHP输出格式为header('Content-Type: application/json') + json_encode 。 |
主线程网络操作导致ANR | 使用AsyncTask 、Thread 或RxJava 将网络请求放在子线程。 |
相关问题与解答
问题1:为什么不建议安卓直接连接MySQL?
解答:
- 安全性风险:直接暴露数据库IP和端口可能导致SQL注入攻击。
- 网络限制:运营商可能封锁非标准端口(如3306)。
- 性能瓶颈:移动端直接处理复杂SQL查询效率低,且难做缓存优化。
- 架构规范:违背分层架构原则,维护困难。
问题2:如何提升安卓与MySQL交互的性能?
解答:
- 中间层优化:
- 使用连接池(如HikariCP)管理数据库连接。
- 对高频请求做缓存(如Redis)。
- 安卓端优化:
- 分页加载数据,避免一次性查询大量数据。
- 使用
OkHttp
的持久连接减少TCP握手耗时。
- 数据库优化:
- 建立索引加速查询。
- 拆分大表或归档历史数据