安卓开发创建数据库的步骤
- 行业动态
- 2025-04-22
- 4
继承SQLiteOpenHelper,重写onCreate()执行建表语句,onUpgrade()处理升级逻辑,调用getWritableDatabase()创建/获取数据库
安卓开发创建数据库的步骤
使用传统SQLite方式创建数据库
创建数据库帮助类
继承SQLiteOpenHelper
,重写onCreate()
和onUpgrade()
方法。public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表结构 String sql = "CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级逻辑(如删除旧表、创建新表) } }
初始化数据库
在Application
或Activity
中实例化MyDatabaseHelper
,并调用getWritableDatabase()
创建/打开数据库。MyDatabaseHelper helper = new MyDatabaseHelper(context); SQLiteDatabase db = helper.getWritableDatabase(); // 触发onCreate()
增删改查操作
通过SQLiteDatabase
对象执行SQL语句,例如插入数据:ContentValues values = new ContentValues(); values.put("name", "Alice"); db.insert("user", null, values);
使用Room持久化库创建数据库
添加依赖
在build.gradle
中添加Room相关依赖:implementation "androidx.room:room-runtime:2.5.1" kapt "androidx.room:room-compiler:2.5.1" // 如果使用Kotlin
定义实体类
使用@Entity
注解标记表结构,字段对应数据库列。@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; }
创建DAO接口
定义数据访问方法,使用@Insert
、@Query
等注解。@Dao public interface UserDao { @Insert void insert(User user); @Query("SELECT FROM user") List<User> getAllUsers(); }
配置数据库类
使用@Database
注解关联实体类,并构建实例。@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); private static AppDatabase INSTANCE; public static AppDatabase getInstance(Context context) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context, AppDatabase.class, "app.db") .build(); } return INSTANCE; } }
使用数据库
通过AppDatabase.getInstance()
获取实例,调用DAO方法。AppDatabase db = AppDatabase.getInstance(context); UserDao userDao = db.userDao(); userDao.insert(new User(0, "Bob"));
两种方式对比表格
步骤 | 传统SQLite | Room持久化库 |
---|---|---|
依赖 | 无额外依赖 | androidx.room |
表结构定义 | SQL语句手动创建 | @Entity 注解自动生成 |
数据操作安全性 | 需手动处理线程和类型安全 | 编译时检查,支持LiveData/RxJava |
升级迁移 | 需手动实现onUpgrade() |
提供迁移工具,支持.fallbacks() |
代码复杂度 | 较高(需手写SQL) | 较低(面向对象操作) |
相关问题与解答
问题1:为什么推荐使用Room而不是直接操作SQLite?
解答:
Room提供了以下优势:
- 编译时验证:通过注解生成代码,避免运行时SQL错误。
- 抽象层级:用DAO接口和实体类替代原始SQL,代码更简洁。
- 线程安全:支持LiveData和RxJava,自动处理数据更新通知。
- 迁移支持:提供
Migration
类简化数据库版本升级逻辑。
问题2:Room如何实现多表关联查询?
解答:
Room支持通过@Relation
注解定义表关联关系。
@Entity public class User { @PrimaryKey(autoGenerate = true) public int id; public String name; } @Entity(primaryKeys = {"userId", "bookId"}) public class Book { public int userId; public int bookId; public String title; } // 定义关联查询 @Transaction @Query("SELECT FROM User") public List<UserWithBooks> getUsersWithBooks(List<User> users, List<Book> books);
通过@Transaction
保证多表操作原子性,UserWithBooks
类需用@Relation
标注关联字段