Android项目中SQLite数据库查询代码的合理存放位置咨询
当然应该抽离!这是让代码更整洁、易维护的关键一步
你现在的问题其实是典型的UI层和数据逻辑耦合的问题——Activity本来应该专注于处理用户交互和UI渲染,把冗长的SQL查询写在里面不仅重复,还会让代码变得臃肿难读。下面给你两个最适合小型项目的解决方案:
1. 先搞一个Database Contract类管理数据库结构
首先,把所有和数据库相关的常量(表名、列名)集中到一个Contract类里,彻底避免硬编码。这样以后要改表结构,只需要在这一个地方改,不用在各个SQL语句里找来找去。
示例代码:
public final class DatabaseContract { // 私有构造方法,防止被实例化 private DatabaseContract() {} // 内部类对应一张表的结构 public static class DailyEntry implements BaseColumns { public static final String TABLE_NAME = "daily_data"; public static final String COLUMN_DATE = "entry_date"; public static final String COLUMN_CONTENT = "entry_content"; // 你数据库里的其他列都可以放在这里 } }
2. 把查询逻辑封装到独立的DAO类里
接下来,创建一个**数据访问对象(DAO)**类,把所有和数据库查询、操作相关的逻辑都放在这里。这样你的Activity只需要调用这个类的方法,完全不用关心底层的SQL怎么写。
比如针对你的日期查询需求,写一个DailyDataDao:
public class DailyDataDao { private SQLiteDatabase db; // 构造方法传入数据库实例 public DailyDataDao(SQLiteDatabase database) { this.db = database; } // 封装你需要的日期查询方法 public Cursor getDailyDataByDate(String targetDate) { // 用Contract里的常量拼查询条件,避免拼写错误 String selection = DatabaseContract.DailyEntry.COLUMN_DATE + " = ?"; String[] selectionArgs = { targetDate }; return db.query( DatabaseContract.DailyEntry.TABLE_NAME, null, // 返回所有列,也可以指定列数组 selection, selectionArgs, null, // 分组条件 null, // 过滤分组 null // 排序条件 ); } // 还可以封装其他常用操作,比如插入、更新数据 public long insertDailyData(ContentValues values) { return db.insert(DatabaseContract.DailyEntry.TABLE_NAME, null, values); } }
在Activity里怎么用?
现在你的Activity代码会变得非常简洁,处理日期切换时只需要调用DAO的方法就行:
// 初始化数据库和DAO MyDbHelper dbHelper = new MyDbHelper(this); SQLiteDatabase db = dbHelper.getReadableDatabase(); DailyDataDao dataDao = new DailyDataDao(db); // 用户切换日期后,直接调用查询方法 String selectedDate = "2024-05-20"; // 这里替换成用户选择的日期 Cursor cursor = dataDao.getDailyDataByDate(selectedDate); // 接下来处理cursor里的数据,更新UI就可以了
额外小建议
如果你的项目以后可能变大,推荐试试Android官方的Room Persistence Library——它是一个ORM框架,能帮你自动生成SQL代码,连DAO类的实现都不用自己写,更省心。不过对于小型项目来说,上面的手动封装方案已经完全够用了。
这样调整后,你再也不用重复写那些冗长的SQL语句,代码结构更清晰,维护起来也轻松多啦!
内容的提问来源于stack exchange,提问作者n0k
相关产品推荐
相关产品推荐

