安卓往数据库中添加数据
- 行业动态
- 2025-04-22
- 2
使用 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 如何选择?
解答:
- 优先选 Room:提供编译时校验、减少 SQL 编写错误、内置支持 LiveData/RxJava/协程。
- 选择 SQLite:仅当项目非常简单(如单一表操作)或需极致精简依赖时。
问题2:Room 如何实现多线程安全插入?
解答:
- 调用
allowMainThreadQueries()
(仅限调试,生产环境禁用):AppDatabase db = Room.databaseBuilder(context, AppDatabase.class, "app.db") .allowMainThreadQueries() // ️ 仅调试使用 .build();
- 推荐方案:使用
ExecutorService
或WorkManager
在后台线程执行:Executors.newSingleThreadExecutor().execute(() -> { db.userDao().insertUser(user); });