基于SQLite实现Android应用从网络读取并展示SQL Server 2008数据表
解决Android从校园网SQL Server拉取数据并展示的方案
嘿,我来帮你搞定这个问题!你之前做过本地SQLite的ListView展示,现在要搞网络版的还不想存本地,其实核心思路是通过中间层API中转数据——直接让Android连SQL Server不仅不安全,还容易踩坑,下面给你一步步拆解:
为什么不推荐Android直接连SQL Server?
- 安全风险:把数据库账号密码硬编码在APP里,很容易被反编译泄露,哪怕是校园网环境也有隐患
- 性能问题:直接的数据库连接开销大,移动端网络不稳定时容易出现连接中断、超时问题
- 兼容性:SQL Server的JDBC驱动在Android上适配麻烦,版本兼容坑不少
最优方案:搭建中间层API
推荐你在校园网内的服务器上搭一个轻量级API服务,作为Android和SQL Server之间的桥梁:API负责查询数据库并返回JSON格式数据,Android只需要请求API拿到数据直接展示,完全不用存本地。
1. 快速搭建API(以ASP.NET Web API为例,适配SQL Server更顺手)
因为你用的是SQL Server 2008,微软技术栈对接最省心,写个简单接口示例:
using System.Data.SqlClient; using System.Web.Http; using Newtonsoft.Json; namespace CampusDataAPI.Controllers { public class DataController : ApiController { // 注意:连接字符串别硬编码,放配置文件里! private string connString = "Server=你的SQL服务器IP;Database=你的数据库名;User Id=账号;Password=密码;"; [HttpGet] public IHttpActionResult GetStudentData() { List<Student> students = new List<Student>(); using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); string query = "SELECT Id, Name, Grade FROM Students"; // 替换成你的查询语句 using (SqlCommand cmd = new SqlCommand(query, conn)) { SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { students.Add(new Student { Id = reader.GetInt32(0), Name = reader.GetString(1), Grade = reader.GetString(2) }); } } } return Ok(JsonConvert.SerializeObject(students)); } } // 和数据库表字段对应的实体类 public class Student { public int Id { get; set; } public string Name { get; set; } public string Grade { get; set; } } }
把这个API部署到校园网内的Windows服务器上,确保Android设备能通过IP+端口访问到接口(比如http://192.168.1.100:8080/api/Data/GetStudentData)。
2. Android端请求API并展示到ListView
用Retrofit做网络请求最方便,步骤如下:
第一步:添加依赖(app的build.gradle)
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
第二步:定义实体类(和API返回的JSON结构对应)
public class Student { private int id; private string name; private string grade; // 补全构造方法、getter、setter }
第三步:定义Retrofit接口
public interface CampusDataApi { @GET("api/Data/GetStudentData") Call<List<Student>> getStudentData(); }
第四步:发起请求并更新ListView
// 初始化Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://192.168.1.100:8080/") // 替换成你的API地址 .addConverterFactory(GsonConverterFactory.create()) .build(); CampusDataApi api = retrofit.create(CampusDataApi.class); Call<List<Student>> call = api.getStudentData(); call.enqueue(new Callback<List<Student>>() { @Override public void onResponse(Call<List<Student>> call, Response<List<Student>> response) { if (response.isSuccessful() && response.body() != null) { // 拿到数据直接给ListView适配器,全程在内存处理,不存本地 List<Student> studentList = response.body(); ArrayAdapter<Student> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, studentList); listView.setAdapter(adapter); } } @Override public void onFailure(Call<List<Student>> call, Throwable t) { Toast.makeText(MainActivity.this, "数据加载失败", Toast.LENGTH_SHORT).show(); } });
这样每次打开页面都会请求API拿到最新数据,直接展示,完全不用写入本地存储。
校园网环境注意事项
- 确保API服务器和Android设备在同一校园网内,能互相ping通
- 检查服务器防火墙,开放API服务的端口(比如8080)
- 如果数据量较大,记得在API里做分页查询,Android端配合分页加载,避免内存溢出
实在要直接连SQL Server的话(不推荐)
如果坚持跳过中间层,可以用jTDS驱动,先加依赖:
implementation 'net.sourceforge.jtds:jtds:1.3.1'
然后写连接代码:
// 警告:账号密码绝对不能硬编码!!! String connString = "jdbc:jtds:sqlserver://192.168.1.100:1433/你的数据库名;user=账号;password=密码;"; try { Class.forName("net.sourceforge.jtds.jdbc.Driver"); Connection conn = DriverManager.getConnection(connString); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM Students"); // 解析ResultSet到List,再绑定到ListView // ... } catch (Exception e) { e.printStackTrace(); }
但还是强烈建议用中间层API,安全又好维护!
内容的提问来源于stack exchange,提问作者Darkykitsune
相关产品推荐
相关产品推荐

