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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:25:34