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
相关产品推荐
相关产品推荐

