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

