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

Android应用从Azure数据库SQL取数存数组问题求助(附代码)

实现从Azure SQL数据库获取数据并在Android中展示的完整方案

我来帮你完善这个从Azure SQL数据库获取数据的实现,结合你的需求,我把GetData类补全并给出主Activity的调用示例,同时附上关键注意事项,确保你的应用能正常拉取并展示数据。

完整的GetData类实现

这个类负责数据库连接、SQL查询以及数据封装,同时通过回调接口把数据传递给主Activity:

import android.os.AsyncTask;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class GetData extends AsyncTask<Void, Void, List<Map<String, String>>> {
    // 替换成你的Azure SQL数据库连接参数
    private static final String DB_URL = "jdbc:sqlserver://your-server-name.database.windows.net:1433;databaseName=your-db-name;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;";
    private static final String DB_USER = "your-db-username";
    private static final String DB_PASSWORD = "your-db-password";

    private Connection connect;
    private String connectionResult = "";
    private boolean isSuccess = false;
    // 回调接口,用于将获取到的数据回传给主Activity
    private OnDataFetchedListener listener;

    // 定义回调接口规范
    public interface OnDataFetchedListener {
        void onDataFetched(List<Map<String, String>> data);
        void onFetchFailed(String errorMessage);
    }

    public GetData(OnDataFetchedListener listener) {
        this.listener = listener;
    }

    @Override
    protected List<Map<String, String>> doInBackground(Void... voids) {
        List<Map<String, String>> dataList = new ArrayList<>();

        try {
            // 加载Azure SQL的JDBC驱动
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            // 建立数据库连接
            connect = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);

            if (connect != null) {
                connectionResult = "数据库连接成功";
                isSuccess = true;
                // 执行自定义SQL查询,这里替换成你的业务查询语句
                String query = "SELECT id, name, email FROM your-table-name";
                Statement statement = connect.createStatement();
                ResultSet resultSet = statement.executeQuery(query);

                // 遍历结果集,将每行数据封装成Map并存入List
                while (resultSet.next()) {
                    Map<String, String> rowData = new HashMap<>();
                    // 这里的key要和你的数据库字段名对应
                    rowData.put("id", resultSet.getString("id"));
                    rowData.put("name", resultSet.getString("name"));
                    rowData.put("email", resultSet.getString("email"));
                    dataList.add(rowData);
                }

                // 关闭资源,避免内存泄漏
                resultSet.close();
                statement.close();
            } else {
                connectionResult = "数据库连接失败";
            }
        } catch (ClassNotFoundException e) {
            connectionResult = "找不到JDBC驱动:" + e.getMessage();
            isSuccess = false;
        } catch (SQLException e) {
            connectionResult = "SQL执行异常:" + e.getMessage();
            isSuccess = false;
        } finally {
            // 确保数据库连接被关闭
            try {
                if (connect != null && !connect.isClosed()) {
                    connect.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return dataList;
    }

    @Override
    protected void onPostExecute(List<Map<String, String>> dataList) {
        super.onPostExecute(dataList);
        // 任务完成后通过回调通知主Activity
        if (isSuccess) {
            listener.onDataFetched(dataList);
        } else {
            listener.onFetchFailed(connectionResult);
        }
    }
}

主Activity调用示例

主Activity实现回调接口,接收数据并展示:

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements GetData.OnDataFetchedListener {

    private TextView tvDataDisplay;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvDataDisplay = findViewById(R.id.tv_data_display);
        // 启动数据获取异步任务
        new GetData(this).execute();
    }

    @Override
    public void onDataFetched(List<Map<String, String>> data) {
        // 将获取到的数据拼接成字符串展示在TextView中
        StringBuilder displayContent = new StringBuilder();
        for (Map<String, String> row : data) {
            displayContent.append("ID: ").append(row.get("id"))
                    .append(" | 姓名: ").append(row.get("name"))
                    .append(" | 邮箱: ").append(row.get("email"))
                    .append("\n\n");
        }
        tvDataDisplay.setText(displayContent.toString());
    }

    @Override
    public void onFetchFailed(String errorMessage) {
        // 数据获取失败时弹出提示
        Toast.makeText(this, "数据获取失败:" + errorMessage, Toast.LENGTH_LONG).show();
    }
}

关键注意事项

  • 网络权限配置:在AndroidManifest.xml中添加网络权限,否则无法连接远程数据库:
    <uses-permission android:name="android.permission.INTERNET" />
    
  • 添加JDBC依赖:在模块级build.gradle的dependencies中添加Azure SQL的JDBC驱动:
    implementation 'com.microsoft.sqlserver:mssql-jdbc:12.4.2.jre8'
    
  • 线程替代方案:AsyncTask已被标记为Deprecated,如果你的应用目标SDK是Android 11+,推荐使用Coroutines或者ExecutorService来执行异步任务,避免兼容性问题
  • 敏感信息安全:绝对不要把数据库的用户名、密码硬编码在代码里,建议使用BuildConfig或者Android Keystore来存储这些敏感信息
  • Azure防火墙配置:确保你的Azure SQL服务器允许应用所在的IP地址访问,在Azure门户的SQL服务器“防火墙和虚拟网络”设置中添加允许的IP范围

内容的提问来源于stack exchange,提问作者Mohammedis271

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:54:50