上一篇
安卓向数据库增
- 行业动态
- 2025-04-24
- 2
安卓向数据库增数据可通过SQLiteDatabase的insert方法,或用ContentValues封装键值后调用insert,需确保表结构匹配并处理SQLException
安卓数据库类型与选择
数据库类型 | 特点 | 适用场景 |
---|---|---|
SQLite | 轻量级嵌入式数据库,支持SQL语法,本地存储 | 本地数据持久化 |
Room | 基于SQLite的抽象层,提供编译时校验,简化开发流程 | 复杂数据操作,推荐使用 |
Firebase DB | 云数据库,实时同步,无需服务器搭建 | 实时数据同步需求 |
ContentProvider | 跨应用数据共享,适合公开数据 | 系统级数据共享 |
SQLite数据库增数据实现
创建数据库与表
// 创建或打开数据库 SQLiteOpenHelper dbHelper = new SQLiteOpenHelper(context, "app.db", null, 1) { @Override public void onCreate(SQLiteDatabase db) { // 创建表(用户表) db.execSQL("CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 更新表逻辑 } }; SQLiteDatabase db = dbHelper.getWritableDatabase();
插入单条数据(两种方式)
方式1:使用ContentValues
ContentValues values = new ContentValues(); values.put("name", "张三"); values.put("age", 25); long rowId = db.insert("user", null, values); // 返回插入行的ID
方式2:直接执行SQL语句
String sql = "INSERT INTO user (name, age) VALUES (?, ?)"; SQLiteStatement statement = db.compileStatement(sql); statement.bindString(1, "李四"); statement.bindLong(2, 30); long rowId = statement.executeInsert();
Room数据库增数据实现
定义实体类
@Entity(tableName = "user") 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); // 批量插入 }
使用DAO插入数据
UserDao userDao = AppDatabase.getInstance(context).userDao(); User user = new User(); user.name = "王五"; user.age = 28; long rowId = userDao.insert(user); // 返回插入行的ID
关键注意事项
问题 | 解决方案 |
---|---|
主线程操作数据库 | 使用AsyncTask 或Coroutine 在子线程执行IO操作 |
数据类型匹配 | 确保字段类型与数据库表定义一致(如int 对应INTEGER ) |
重复数据冲突 | 使用INSERT OR REPLACE 或ON CONFLICT 策略处理主键冲突 |
性能优化 | 批量插入时使用事务(beginTransaction /setTransactionSuccessful ) |
相关问题与解答
问题1:如何批量插入数据并保证效率?
解答:
- 使用事务包裹批量操作,减少IO次数:
db.beginTransaction(); try { for (User user : userList) { ContentValues values = new ContentValues(); values.put("name", user.name); values.put("age", user.age); db.insert("user", null, values); } db.setTransactionSuccessful(); } finally { db.endTransaction(); }
- 在Room中直接调用
insertUsers(list)
,底层自动优化。
问题2:插入数据时如何防止SQL注入?
解答:
- 避免直接拼接SQL:始终使用参数化查询(占位符)或
ContentValues
。
错误示例:String name = "张'三"; // 包含反面字符 db.execSQL("INSERT INTO user (name) VALUES('" + name + "')"); // 可能导致SQL异常
正确示例:
SQLiteStatement statement = db.compileStatement("INSERT INTO user (name) VALUES (?)"); statement.bindString(1, name); // 自动转义特殊字符 statement.executeInsert();
- 使用Room:Room默认生成参数化SQL,天然防注入