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

安卓往数据库中添加数据

使用 SQLite 添加数据

创建数据库帮助类

public class MyDatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "app.db";
    private static final int DATABASE_VERSION = 1;
    public MyDatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表结构
        String createTable = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)";
        db.execSQL(createTable);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 升级表结构逻辑
        db.execSQL("DROP TABLE IF EXISTS users");
        onCreate(db);
    }
}

执行插入操作

// 获取数据库实例
MyDatabaseHelper dbHelper = new MyDatabaseHelper(context);
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 准备数据
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
// 插入数据
long rowId = db.insert("users", null, values);
if (rowId == -1) {
    // 插入失败处理
} else {
    // 插入成功处理
}
// 关闭数据库
db.close();

使用 Room 持久化库添加数据

定义实体类

@Entity(tableName = "users")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    @ColumnInfo(name = "name")
    public String name;
    @ColumnInfo(name = "age")
    public int age;
}

创建 DAO 接口

@Dao
public interface UserDao {
    @Insert
    long[] insertUsers(List<User> users); // 批量插入
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insertUser(User user); // 冲突策略替换
}

配置数据库

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

执行插入操作

AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db").build();
// 单条插入
User user = new User();
user.name = "李四";
user.age = 30;
long rowId = db.userDao().insertUser(user);
// 批量插入(需在子线程执行)
List<User> users = new ArrayList<>();
users.add(new User(){{name="王五"; age=28;}});
users.add(new User(){{name="赵六"; age=22;}});
new Thread(() -> db.userDao().insertUsers(users)).start();

关键差异对比表

特性 SQLite Room
API 复杂度 需手动管理 SQLiteDatabase 面向对象,编译时校验
线程安全 需手动处理线程 默认支持 LiveData 异步通知
编译检查 语法错误在编译阶段暴露
关联关系支持 需手动编写 SQL 通过 @Relation 自动关联
最佳适用场景 简单快速原型 复杂业务、多人协作项目

常见问题与解答

问题1:SQLite 和 Room 如何选择?

解答

安卓往数据库中添加数据  第1张

  • 优先选 Room:提供编译时校验、减少 SQL 编写错误、内置支持 LiveData/RxJava/协程。
  • 选择 SQLite:仅当项目非常简单(如单一表操作)或需极致精简依赖时。

问题2:Room 如何实现多线程安全插入?

解答

  1. 调用 allowMainThreadQueries()(仅限调试,生产环境禁用):
    AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db")
        .allowMainThreadQueries() // ️ 仅调试使用
        .build();
  2. 推荐方案:使用 ExecutorServiceWorkManager 在后台线程执行:
    Executors.newSingleThreadExecutor().execute(() -> {
        db.userDao().insertUser(user);
    });
0