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

如何将SQLite查询的指定多行多列数据从DatabaseHelper传到MainActivity?

解决方案:从SQLite查询并传递多行多列数据到Activity

别慌,我来帮你一步步搞定这个问题,分四个核心步骤来实现:封装数据模型、编写数据库查询逻辑、在MainActivity获取数据,以及跨Activity传递多行数据。

1. 创建Parcelable数据模型类

首先,我们需要把每条交易记录封装成一个Java对象,并且实现Parcelable接口——这是Android中跨组件传递复杂对象集合的标准方式,比Serializable更高效。

public class TransactionModel implements Parcelable {
    private int tId;
    private String email;
    private String bankName;
    private String added; // 如果你的added是日期类型,可以改成Long或LocalDateTime,记得同步Parcelable的读写逻辑

    // 构造方法
    public TransactionModel(int tId, String email, String bankName, String added) {
        this.tId = tId;
        this.email = email;
        this.bankName = bankName;
        this.added = added;
    }

    // Parcelable 核心方法(可以通过Android Studio自动生成)
    protected TransactionModel(Parcel in) {
        tId = in.readInt();
        email = in.readString();
        bankName = in.readString();
        added = in.readString();
    }

    public static final Creator<TransactionModel> CREATOR = new Creator<TransactionModel>() {
        @Override
        public TransactionModel createFromParcel(Parcel in) {
            return new TransactionModel(in);
        }

        @Override
        public TransactionModel[] newArray(int size) {
            return new TransactionModel[size];
        }
    };

    // Getter方法(用于读取对象属性)
    public int gettId() { return tId; }
    public String getEmail() { return email; }
    public String getBankName() { return bankName; }
    public String getAdded() { return added; }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(tId);
        dest.writeString(email);
        dest.writeString(bankName);
        dest.writeString(added);
    }
}

2. 在DatabaseHelper中实现查询方法

接下来,在你的DatabaseHelper类里添加一个方法,专门查询email='activeuser'且added不为空的记录,并把结果封装成List<TransactionModel>返回:

public class DatabaseHelper extends SQLiteOpenHelper {
    // 定义你的数据库和表常量
    private static final String DATABASE_NAME = "your_db_name.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_TRANSACTIONS = "transactions";
    
    // 列名常量
    private static final String COLUMN_T_ID = "t_id";
    private static final String COLUMN_EMAIL = "email";
    private static final String COLUMN_BANK_NAME = "bank_name";
    private static final String COLUMN_ADDED = "added";

    // 构造方法(省略其他已有的代码,比如onCreate、onUpgrade)
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // 查询符合条件的交易记录
    public List<TransactionModel> getActiveUserValidTransactions() {
        List<TransactionModel> transactionList = new ArrayList<>();
        SQLiteDatabase db = this.getReadableDatabase();

        // 构建查询条件:email等于activeuser,且added不为空
        String selection = COLUMN_EMAIL + " = ? AND " + COLUMN_ADDED + " IS NOT NULL";
        String[] selectionArgs = {"activeuser"};

        // 执行查询,只获取需要的列(t_id、email、bank_name、added)
        Cursor cursor = db.query(
                TABLE_TRANSACTIONS,
                new String[]{COLUMN_T_ID, COLUMN_EMAIL, COLUMN_BANK_NAME, COLUMN_ADDED},
                selection,
                selectionArgs,
                null,
                null,
                null
        );

        // 遍历Cursor,把每条记录转换成TransactionModel对象
        if (cursor.moveToFirst()) {
            do {
                int tId = cursor.getInt(cursor.getColumnIndexOrThrow(COLUMN_T_ID));
                String email = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_EMAIL));
                String bankName = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_BANK_NAME));
                String added = cursor.getString(cursor.getColumnIndexOrThrow(COLUMN_ADDED));

                transactionList.add(new TransactionModel(tId, email, bankName, added));
            } while (cursor.moveToNext());
        }

        // 记得关闭Cursor和数据库,避免资源泄漏
        cursor.close();
        db.close();

        return transactionList;
    }
}

3. 在MainActivity中获取并处理数据

现在你可以在MainActivity中调用上面的方法,拿到查询结果。注意:数据库操作属于耗时操作,不要直接在主线程执行,这里用Java的AsyncTask举个例子:

public class MainActivity extends AppCompatActivity {
    private DatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dbHelper = new DatabaseHelper(this);

        // 启动AsyncTask执行数据库查询
        new FetchTransactionsTask().execute();
    }

    // 内部类:AsyncTask处理耗时查询
    private class FetchTransactionsTask extends AsyncTask<Void, Void, List<TransactionModel>> {
        @Override
        protected List<TransactionModel> doInBackground(Void... voids) {
            // 在后台线程执行查询
            return dbHelper.getActiveUserValidTransactions();
        }

        @Override
        protected void onPostExecute(List<TransactionModel> transactions) {
            super.onPostExecute(transactions);
            // 回到主线程处理数据,比如显示在RecyclerView或者打印日志
            if (transactions != null && !transactions.isEmpty()) {
                for (TransactionModel transaction : transactions) {
                    Log.d("MainActivity", String.format("t_id: %d, Bank: %s", transaction.gettId(), transaction.getBankName()));
                }
                // 这里如果要传递数据到其他Activity,就调用下面的跳转逻辑
                navigateToAnotherActivity(transactions);
            }
        }
    }

    // 跳转并传递数据到另一个Activity的方法
    private void navigateToAnotherActivity(List<TransactionModel> transactions) {
        Intent intent = new Intent(MainActivity.this, TargetActivity.class);
        // 把Parcelable集合放到Intent中
        intent.putParcelableArrayListExtra("KEY_TRANSACTIONS", new ArrayList<>(transactions));
        startActivity(intent);
    }
}

4. 在目标Activity中接收传递的数据

最后,在你要跳转的目标Activity中,取出Intent里的交易数据:

public class TargetActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_target);

        // 获取传递过来的交易列表
        ArrayList<TransactionModel> transactions = getIntent().getParcelableArrayListExtra("KEY_TRANSACTIONS");

        // 处理数据,比如显示在UI上
        if (transactions != null && !transactions.isEmpty()) {
            // 示例:遍历数据打印日志
            for (TransactionModel transaction : transactions) {
                Log.d("TargetActivity", "Added Date: " + transaction.getAdded());
            }
        }
    }
}

额外提示

  • 如果你的added字段是日期类型(比如时间戳),记得在TransactionModel中把added的类型改成Long,并同步Parcelable的readLong()和writeLong()方法。
  • 避免在主线程执行数据库操作,否则会导致ANR(应用无响应),也可以用Coroutines、WorkManager替代AsyncTask。
  • 如果数据量特别大,可以考虑用ContentProvider或者分批次加载,但大部分场景下Parcelable集合足够用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:05:02