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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:22:42