当前位置:首页 > 行业动态 > 正文

安卓开发创建数据库的步骤

继承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) {
            // 数据库升级逻辑(如删除旧表、创建新表)
        }
    }
  • 初始化数据库
    ApplicationActivity中实例化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相关依赖:

    安卓开发创建数据库的步骤  第1张

    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提供了以下优势:

  1. 编译时验证:通过注解生成代码,避免运行时SQL错误。
  2. 抽象层级:用DAO接口和实体类替代原始SQL,代码更简洁。
  3. 线程安全:支持LiveData和RxJava,自动处理数据更新通知。
  4. 迁移支持:提供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标注关联字段

0