You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:10