Android应用接入Azure SQL实现数据读写入门指引
方案选型先给准话
别折腾安卓端直连JDBC的方案,2025年跑新版Android 14/15的话坑多到你调一周都跑不起来:老教程里的JDBC驱动版本大多过时,连不上Azure SQL的加密链路;安卓主线程网络限制、权限配置一堆坑;最关键的是你把数据库账号密码写进APK里,反编译就能拿到,作业这么写大概率被老师扣安全分。
就选Azure Functions搭极简REST API + 安卓端OkHttp发请求的路径,全程不用自己买服务器,不用学复杂后端框架,所有组件用当前长期支持的稳定版,照着敲1个半小时就能跑通读写+展示的全流程,完全满足课程作业要求,没有多余的高阶内容。
具体实操步骤(适配2024-2025年最新稳定版,无过时内容)
第一部分:Azure侧配置(15分钟搞定)
- 先建好Azure SQL数据库,记好4个核心参数:服务器地址(格式为
xxx.database.windows.net)、数据库名、数据库登录用户名、登录密码,提前在库里建好你要存数据的业务表即可,比如简单的学生信息表带id、name、score三个字段就够测试 - 去Azure门户搜索「Function App」新建函数应用,运行时选*.NET 8 LTS(长期支持版,文档全、坑最少)*,托管计划选消费级,免费额度完全够课程作业使用
- 函数应用创建完成后,新建2个HTTP触发的函数,权限级别统一选「匿名」(作业场景不需要做复杂鉴权,减少不必要的配置),分别实现查数据、写数据两个逻辑,不用装ORM、不用搞分层架构,就用最基础的SqlClient写逻辑即可,核心参考代码如下,替换成你自己的数据库连接字符串和表名就能用:
// GET接口:查询全表数据返回JSON [FunctionName("GetData")] public static async Task<IActionResult> GetData( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req) { // 替换为你自己的Azure SQL连接字符串 string connStr = "Server=tcp:你的服务器地址.database.windows.net,1433;Initial Catalog=你的数据库名;Persist Security Info=False;User ID=你的用户名;Password=你的密码;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"; List<object> result = new List<object>(); using(SqlConnection conn = new SqlConnection(connStr)) { await conn.OpenAsync(); string sql = "SELECT id,name,score FROM 你的业务表名"; SqlCommand cmd = new SqlCommand(sql, conn); var reader = await cmd.ExecuteReaderAsync(); while(await reader.ReadAsync()) { result.Add(new { id = reader.GetInt32(0), name = reader.GetString(1), score = reader.GetInt32(2) }); } } return new OkObjectResult(result); } // POST接口:接收参数写入数据库 [FunctionName("AddData")] public static async Task<IActionResult> AddData( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)] HttpRequest req) { string connStr = "和上面完全一致的连接字符串"; string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); var param = JsonSerializer.Deserialize<AddParam>(requestBody); using(SqlConnection conn = new SqlConnection(connStr)) { await conn.OpenAsync(); // 用参数化查询避免SQL注入,别直接拼字符串 string sql = "INSERT INTO 你的业务表名(name,score) VALUES(@name,@score)"; SqlCommand cmd = new SqlCommand(sql, conn); cmd.Parameters.AddWithValue("@name", param.name); cmd.Parameters.AddWithValue("@score", param.score); await cmd.ExecuteNonQueryAsync(); } return new OkObjectResult(new {code=200,msg="写入成功"}); } public class AddParam { public string name {get;set;} public int score {get;set;} }
- 最后配置Azure SQL防火墙:把你刚创建的Function App的出站IP加到数据库的允许访问列表里就行,不用开全公网访问,配置完在浏览器里访问GetData的接口地址,能正常返回表内的JSON数据就说明Azure侧配置全部完成。
第二部分:安卓端配置(20分钟搞定,适配Android 14/AGP 8.0+)
- 新建安卓项目选「Empty Activity」模板,语言选你上课学的Kotlin/Java都可以,最低SDK版本设为API 26(Android 8.0)即可,覆盖99%以上的现役设备
- 给app模块加两个必要依赖,都是当前最新稳定版,直接复制到Module级别的build.gradle的dependencies块里:
implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'com.google.code.gson:gson:2.11.0'
- 配置网络权限:在AndroidManifest.xml的
<manifest>标签内、<application>标签外加一行权限声明,同时给<application>标签加一个属性避免网络限制:
<uses-permission android:name="android.permission.INTERNET" /> <application android:usesCleartextTraffic="true" <!-- 其他原有属性保持不变 --> >
- 写业务代码:所有网络请求必须在子线程执行,不能在主线程发请求,否则新版Android会直接崩溃,核心参考代码(Kotlin版)如下,布局里随便放两个按钮、一个文本框/RecyclerView用来展示数据即可:
// 替换为你自己在Azure Functions里拿到的两个接口地址 private const val GET_URL = "https://你的函数应用地址/api/GetData" private const val POST_URL = "https://你的函数应用地址/api/AddData" private val okHttpClient = OkHttpClient() private val gson = Gson() // 拉取数据按钮点击时调用 fun fetchData(view: View) { Thread { val request = Request.Builder().url(GET_URL).build() okHttpClient.newCall(request).execute().use { resp -> val json = resp.body?.string() val dataList = gson.fromJson(json, Array<StuInfo>::class.java).toList() // 切回主线程更新UI runOnUiThread { // 把dataList绑定到文本框或者RecyclerView展示即可 findViewById<TextView>(R.id.showTv).text = dataList.toString() } } }.start() } // 提交数据按钮点击时调用 fun submitData(view: View) { Thread { val submitParam = StuInfo(name = "测试学生", score = 95) val body = RequestBody.create( "application/json; charset=utf-8".toMediaType(), gson.toJson(submitParam) ) val request = Request.Builder().url(POST_URL).post(body).build() okHttpClient.newCall(request).execute().use { resp -> runOnUiThread { Toast.makeText(this, "数据提交成功", Toast.LENGTH_SHORT).show() } } }.start() } // 和数据库表字段对应的实体类 data class StuInfo( val id: Int = 0, val name: String = "", val score: Int = 0 )
- 直接连模拟器/真机运行即可,点拉取按钮能看到数据库里的存量数据,点提交按钮能把新数据写到Azure SQL里,去数据库里能查到新增记录就算全流程跑通。
必看避坑(老教程基本没提,踩中就卡半小时以上)
- 安卓端绝对不能在主线程(UI线程)直接发网络请求,会直接触发NetworkOnMainThreadException崩溃
- 数据库连接字符串只能写在Azure Functions的后端代码里,绝对不要放到安卓客户端代码里,这是最基础的开发规范
- 依赖版本就用上面给的固定版本号,别随便抄2022年之前老教程里的3.x版本OkHttp、老版本Gson,很多方法已经废弃,抄过去会直接报编译错误
- 安卓模拟器不需要额外配置代理,只要模拟器能正常打开网页就能请求Azure的HTTPS接口
- 如果函数接口返回500错误,优先检查Azure SQL的防火墙规则有没有加对Function的出站IP,90%的连接失败都是这个原因
内容的提问来源于stack exchange,提问作者SwisherSweet
相关产品推荐
相关产品推荐

