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

安卓创建数据库的运用

在Android中创建数据库通常使用SQLite,通过继承SQLiteOpenHelper类实现,需重写onCreate()建表、onUpgrade()处理升级,借助SQLiteDatabase执行CRUD操作,配合ContentValues简化数据插入,支持本地数据持久化

Android数据库类型选择

数据库类型 特点 适用场景
SQLite 轻量级嵌入式数据库,支持SQL语法 本地数据存储,简单结构数据管理
Room 基于SQLite的ORM框架,提供抽象层 复杂数据关系,避免直接操作SQL

SQLite数据库创建与使用

  1. 创建数据库帮助类
    继承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) {
            // 数据库升级逻辑
        }
    }
  2. 执行增删改查操作

    • 插入数据
      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数据库创建与使用

  1. 定义实体类

    安卓创建数据库的运用  第1张

    @Entity(tableName = "user")
    public class User {
        @PrimaryKey(autoGenerate = true)
        public int id;
        @ColumnInfo(name = "name")
        public String name;
    }
  2. 创建DAO接口

    @Dao
    public interface UserDao {
        @Insert
        void insertUser(User user);
        @Query("SELECT  FROM user WHERE id = :userId")
        User getUserById(int userId);
    }
  3. 配置数据库

    @Database(entities = {User.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract UserDao userDao();
    }
  4. 使用数据库

    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()
多线程冲突 并发写入导致数据不一致 使用ContentProvidersynchronized加锁
数据加密需求 明文存储敏感信息 集成SQLCipher或自定义加密逻辑

相关问题与解答

Q1:如何实现SQLite数据库的版本迁移?
A1

  1. onUpgrade()方法中通过SQLiteDatabaseexecSQL()执行ALTER TABLE语句;
  2. 若涉及复杂结构变更,需创建临时表迁移数据:
    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

  1. 编译时校验:通过注解生成代码,避免运行时SQL错误;
  2. 抽象数据层:DAO接口自动生成实现,减少样板代码;
  3. LiveData支持:天然集成观察者模式,方便实时数据监听;
  4. 线程安全:默认提供异步操作(如insert()返回ListenableFuture)。
0