上一篇
安卓创建数据库的运用
- 行业动态
- 2025-04-24
- 3582
在Android中创建数据库通常使用SQLite,通过继承SQLiteOpenHelper类实现,需重写onCreate()建表、onUpgrade()处理升级,借助SQLiteDatabase执行CRUD操作,配合ContentValues简化数据插入,支持本地数据持久化
Android数据库类型选择
数据库类型 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级嵌入式数据库,支持SQL语法 | 本地数据存储,简单结构数据管理 |
Room | 基于SQLite的ORM框架,提供抽象层 | 复杂数据关系,避免直接操作SQL |
SQLite数据库创建与使用
创建数据库帮助类
继承SQLiteOpenHelper
,重写onCreate()
和onUpgrade()
方法:public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app_data.db"; private static final int VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表 db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑 } }
执行增删改查操作
- 插入数据:
ContentValues values = new ContentValues(); values.put("name", "张三"); db.insert("user", null, values);
- 查询数据:
Cursor cursor = db.query("user", null, "id=?", new String[]{"1"}, null, null, null); if (cursor.moveToFirst()) { String name = cursor.getString(cursor.getColumnIndex("name")); }
- 插入数据:
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 user); @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(); }
使用数据库
AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app_data.db").build(); UserDao userDao = db.userDao(); userDao.insertUser(new User(0, "李四"));
数据库升级策略
场景 | 解决方案 | 示例 |
---|---|---|
新增字段 | ALTER TABLE 语句添加列 | db.execSQL("ALTER TABLE user ADD COLUMN age INTEGER") |
修改表结构 | 迁移工具或手动迁移数据 | 使用Migration 类逐步迁移 |
数据兼容 | 版本号控制+数据转换 | 在onUpgrade() 中判断旧版本并处理 |
常见问题与解决方案
问题 | 原因 | 解决方法 |
---|---|---|
数据库文件找不到 | 未正确调用getWritableDatabase() | 确保SQLiteOpenHelper 实例化后调用getReadableDatabase() |
多线程冲突 | 并发写入导致数据不一致 | 使用ContentProvider 或synchronized 加锁 |
数据加密需求 | 明文存储敏感信息 | 集成SQLCipher 或自定义加密逻辑 |
相关问题与解答
Q1:如何实现SQLite数据库的版本迁移?
A1:
- 在
onUpgrade()
方法中通过SQLiteDatabase
的execSQL()
执行ALTER TABLE
语句; - 若涉及复杂结构变更,需创建临时表迁移数据:
db.execSQL("CREATE TABLE temp_user (id INTEGER, name TEXT, age INTEGER)"); db.execSQL("INSERT INTO temp_user SELECT id, name, 0 FROM user"); // 默认年龄为0 db.execSQL("DROP TABLE user"); db.execSQL("ALTER TABLE temp_user RENAME TO user");
Q2:Room相比SQLite的优势是什么?
A2:
- 编译时校验:通过注解生成代码,避免运行时SQL错误;
- 抽象数据层:DAO接口自动生成实现,减少样板代码;
- LiveData支持:天然集成观察者模式,方便实时数据监听;
- 线程安全:默认提供异步操作(如
insert()
返回ListenableFuture
)。