上一篇
安卓开发怎么用数据库搭建
- 行业动态
- 2025-04-22
- 2
安卓数据库选型与基础概念
安卓开发中常用的本地数据库方案包括:
- SQLite:安卓内置的轻量级关系型数据库,适合结构化数据存储。
- Room:基于SQLite的ORM框架,提供编译时校验和抽象层。
- Realm:高性能对象数据库,支持实时数据同步。
SQLite数据库搭建步骤
步骤 | 操作说明 | 代码示例 |
---|---|---|
创建数据库工具类 | 继承SQLiteOpenHelper ,实现数据库创建与升级逻辑 |
java<br>public class DBHelper extends SQLiteOpenHelper {<br> public DBHelper(Context context){<br> super(context, "app.db", null, 1);<br> }<br> @Override<br> public void onCreate(SQLiteDatabase db) {<br> db.execSQL("CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT)");<br> }<br>} |
获取可写数据库 | 通过getWritableDatabase() 获取操作对象 |
java<br>DBHelper helper = new DBHelper(context);<br>SQLiteDatabase db = helper.getWritableDatabase(); |
执行增删改查 | 使用insert() /delete() /update() /query() 方法 |
java<br>// 插入数据<br>ContentValues values = new ContentValues();<br>values.put("name","张三");<br>db.insert("user",null,values);<br><br>// 查询数据<br>Cursor cursor = db.query("user",null,null,null,null,null,null); |
Room数据库高级用法
定义实体类
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; }
创建DAO接口
@Dao public interface UserDao { @Insert void insertUser(User... users); @Query("SELECT FROM user WHERE id=:userId") User getUserById(int userId); }
配置数据库
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
使用LiveData实现观察
// 在Repository中 public LiveData<List<User>> getAllUsers() { return userDao.getAllUsers(); // @Query("SELECT FROM user") }
数据库操作优化策略
优化方向 | 实施方案 |
---|---|
线程安全 | 使用AsyncTask 或ExecutorService 处理耗时操作 |
内存优化 | 及时关闭Cursor 对象,使用try-with-resources 语句 |
性能提升 | 为高频查询字段创建索引(CREATE INDEX ) |
数据迁移 | Room支持Migration 类实现版本升级 |
常见问题与解决方案
问题现象 | 解决方案 |
---|---|
主线程数据库操作崩溃 | 使用database.beginTransaction() 包裹操作,或在子线程执行 |
数据丢失问题 | 调用setTransactionSuccessful() 确保事务提交 |
版本升级异常 | 实现SQLiteOpenHelper.onUpgrade() 方法处理迁移逻辑 |
相关问题与解答
Q1:如何在Room中实现多表关联查询?
A1:通过@Relation
注解定义实体关系,
@Entity(tableName = "orders") public class Order { @PrimaryKey public int id; public int userId; } public class UserWithOrders { @Embedded public User user; @Relation(parentColumn = "id", entityColumn = "userId") public List<Order> orders; }
Q2:SQLite和Room应该如何选择?
A2:选择建议:
- 简单项目/快速原型:直接使用SQLite
- 复杂项目/团队协作:优先使用Room(提供类型安全、编译校验等优势)
- 需要实时数据同步:考虑Realm或Firebase Firestore