Xamarin.Android 如何通过循环将MySQL查询的日期添加到Spinner
代码问题排查
核心问题列表
- 创建
ArrayAdapter后未绑定到Spinner控件,下拉框自然无法展示数据 DateStrings方法存在严重逻辑错误:- 数据库操作顺序颠倒,
MySqlDataAdapter.Fill()会自动打开连接,你在Fill之后再调用openConnection()完全多余且逻辑错误 - 循环内直接返回结果,最多只能拿到第一条数据,且
ExecuteScalar()返回的是单个字符串值,强制转换为string[]会直接抛出类型转换异常 - 无需循环多次查询数据库,第一次查询已经把所有符合条件的数据加载到
SCTable中,直接遍历行取字段即可 Blank数组未初始化,无数据返回时会抛出空引用异常- 数据库连接使用后未释放,容易导致连接池溢出
- 数据库操作顺序颠倒,
修复后代码
OnCreate 方法修改
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); SetContentView(Resource.Layout.Score); Spinner cmbSDate = FindViewById<Spinner>(Resource.Id.cmbSDate); Email = Intent.GetStringExtra("Email"); string SC = ""; // 这里加using自动释放连接资源 using (DB SCDB = new DB()) { MySqlCommand SCCommand = new MySqlCommand("SELECT `Squad Code` from Accounts where Email = @Email", SCDB.getConnection()); SCCommand.Parameters.Add("@Email", MySqlDbType.VarChar).Value = Email; SCDB.openConnection(); var SCResult = SCCommand.ExecuteScalar(); if (SCResult != null) { SC = Convert.ToString(SCResult); } } // 生成日期数组 var dateList = DateStrings(SC); // 绑定适配器到Spinner ArrayAdapter<string> adapter = new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleSpinnerItem, dateList); adapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem); cmbSDate.Adapter = adapter; }
DateStrings 方法重写
private List<string> DateStrings(string squadCode) { List<string> dateList = new List<string>(); // 直接一次查询拿到所有符合条件的日期 using (DB SCDB = new DB()) { MySqlCommand SCCommand = new MySqlCommand("SELECT `Date` from `ComboBox` WHERE `Squad Code` = @SC", SCDB.getConnection()); SCCommand.Parameters.Add("@SC", MySqlDbType.VarChar).Value = squadCode; SCDB.openConnection(); using (MySqlDataReader reader = SCCommand.ExecuteReader()) { while (reader.Read()) { if (!reader.IsDBNull(0)) { dateList.Add(reader.GetString(0)); } } } } return dateList; }
额外优化建议
- 不要把数据库查询放在UI主线程执行,数据量大的时候会导致ANR,建议用
Task.Run放到后台线程查询,查询完成后再回到主线程绑定适配器 - 静态变量
Email、SC尽量不要用,避免内存泄漏和跨页面数据混乱,改成方法参数传递更安全
内容的提问来源于stack exchange,提问作者Marissa
相关产品推荐
相关产品推荐

