Android C#:跨Activity实现SQLite数据添加与编辑功能咨询
在C# Android的SecondActivity中读取并展示SQLite数据(附编辑功能)
嘿,我来帮你搞定SecondActivity里的数据库读取、展示和编辑功能!咱们一步步来,确保每一步都清晰易懂:
第一步:给Class1补充数据库查询/更新方法
首先得让你的公共类Class1具备数据读写能力,毕竟它是连接两个Activity的核心。假设你已经有了数据库连接,现在新增几个关键方法:
public class Class1 { private SQLiteConnection _dbConn; // 初始化数据库连接(你应该已经实现了这部分) public Class1() { string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "UserInputs.db"); _dbConn = new SQLiteConnection(dbPath); _dbConn.CreateTable<UserInput>(); // 创建用户输入表 } // 获取所有已保存的用户输入 public List<UserInput> GetAllUserInputs() { return _dbConn.Table<UserInput>().ToList(); } // 根据ID获取单条输入(用于编辑) public UserInput GetInputById(int inputId) { return _dbConn.Table<UserInput>().FirstOrDefault(x => x.Id == inputId); } // 更新用户输入(编辑后保存) public int UpdateUserInput(UserInput updatedInput) { return _dbConn.Update(updatedInput); } // 原有新增方法(你已经实现的) public int AddUserInput(UserInput newInput) { return _dbConn.Insert(newInput); } } // 用户输入实体类,记得用SQLite-net的特性标记 public class UserInput { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string InputContent { get; set; } // 可以根据需求添加其他字段,比如创建时间等 }
第二步:在SecondActivity中读取并展示数据
接下来在SecondActivity里,咱们把数据库里的内容取出来,展示到UI上。这里分两种常见场景:
场景1:展示单条最新输入
如果你的应用是每次保存一条,然后展示最新的内容:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.second_activity); // 初始化数据库助手类 var dbHelper = new Class1(); // 获取最新的一条用户输入 var latestInput = dbHelper.GetAllUserInputs().LastOrDefault(); if (latestInput != null) { // 绑定数据到TextView var contentTv = FindViewById<TextView>(Resource.Id.tv_input_content); contentTv.Text = latestInput.InputContent; // 给编辑按钮添加点击事件 var editBtn = FindViewById<Button>(Resource.Id.btn_edit); editBtn.Click += (s, e) => { // 跳回MainActivity,携带当前输入的ID和内容用于编辑 var editIntent = new Intent(this, typeof(MainActivity)); editIntent.PutExtra("InputId", latestInput.Id); editIntent.PutExtra("InputContent", latestInput.InputContent); StartActivity(editIntent); Finish(); // 关闭当前页面,避免返回栈混乱 }; } }
场景2:用RecyclerView展示多条输入
如果你的应用支持保存多条内容,用RecyclerView展示更合适:
首先创建RecyclerView的适配器:
public class InputAdapter : RecyclerView.Adapter { private List<UserInput> _inputList; private Context _context; private Class1 _dbHelper; public InputAdapter(List<UserInput> inputs, Context context, Class1 dbHelper) { _inputList = inputs; _context = context; _dbHelper = dbHelper; } public override RecyclerView.ViewHolder OnCreateViewHolder(ViewGroup parent, int viewType) { var itemView = LayoutInflater.From(parent.Context).Inflate(Resource.Layout.item_input, parent, false); return new InputViewHolder(itemView); } public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) { var input = _inputList[position]; var viewHolder = holder as InputViewHolder; // 绑定内容到条目控件 viewHolder.ContentTv.Text = input.InputContent; // 编辑按钮点击事件 viewHolder.EditBtn.Click += (s, e) => { var editIntent = new Intent(_context, typeof(MainActivity)); editIntent.PutExtra("InputId", input.Id); editIntent.PutExtra("InputContent", input.InputContent); _context.StartActivity(editIntent); }; } public override int ItemCount => _inputList.Count; // 条目视图持有者 private class InputViewHolder : RecyclerView.ViewHolder { public TextView ContentTv { get; set; } public Button EditBtn { get; set; } public InputViewHolder(View itemView) : base(itemView) { ContentTv = itemView.FindViewById<TextView>(Resource.Id.tv_item_content); EditBtn = itemView.FindViewById<Button>(Resource.Id.btn_item_edit); } } }
然后在SecondActivity中初始化RecyclerView:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.second_activity); var dbHelper = new Class1(); var allInputs = dbHelper.GetAllUserInputs(); // 初始化RecyclerView var rvInputs = FindViewById<RecyclerView>(Resource.Id.rv_inputs); rvInputs.SetLayoutManager(new LinearLayoutManager(this)); rvInputs.SetAdapter(new InputAdapter(allInputs, this, dbHelper)); }
第三步:在MainActivity中处理编辑逻辑
最后,当从SecondActivity跳回来编辑时,MainActivity需要识别是新增还是编辑操作:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.main_activity); var inputEt = FindViewById<EditText>(Resource.Id.et_user_input); var saveBtn = FindViewById<Button>(Resource.Id.btn_save); // 判断是否是编辑模式 if (Intent.HasExtra("InputId")) { // 获取传递过来的编辑数据 int inputId = Intent.GetIntExtra("InputId", -1); string inputContent = Intent.GetStringExtra("InputContent"); // 填充原有内容到输入框 inputEt.Text = inputContent; // 修改按钮文本为"更新" saveBtn.Text = "更新"; // 更新逻辑 saveBtn.Click += (s, e) => { string updatedContent = inputEt.Text.Trim(); if (!string.IsNullOrEmpty(updatedContent)) { var dbHelper = new Class1(); var updatedInput = new UserInput { Id = inputId, InputContent = updatedContent }; dbHelper.UpdateUserInput(updatedInput); // 更新完成后跳回SecondActivity StartActivity(new Intent(this, typeof(SecondActivity))); Finish(); } }; } else { // 原有新增逻辑(你已经实现的) saveBtn.Click += (s, e) => { string newContent = inputEt.Text.Trim(); if (!string.IsNullOrEmpty(newContent)) { var dbHelper = new Class1(); var newInput = new UserInput { InputContent = newContent }; dbHelper.AddUserInput(newInput); StartActivity(new Intent(this, typeof(SecondActivity))); Finish(); } }; } }
几个小提醒
- 数据库操作尽量放在异步线程里,避免UI卡顿,比如用
Task.Run包裹查询/更新代码 - 确保SQLiteConnection的生命周期管理,避免内存泄漏
- 实体类的字段要和数据库表的列对应,SQLite-net会自动帮你映射
内容的提问来源于stack exchange,提问作者Wassim01
相关产品推荐
相关产品推荐

