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

安卓向数据库增

安卓向数据库增数据可通过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

关键注意事项

问题 解决方案
主线程操作数据库 使用AsyncTaskCoroutine在子线程执行IO操作
数据类型匹配 确保字段类型与数据库表定义一致(如int对应INTEGER
重复数据冲突 使用INSERT OR REPLACEON CONFLICT策略处理主键冲突
性能优化 批量插入时使用事务(beginTransaction/setTransactionSuccessful

相关问题与解答

问题1:如何批量插入数据并保证效率?

解答

  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();
    }
  2. 在Room中直接调用insertUsers(list),底层自动优化。

问题2:插入数据时如何防止SQL注入?

解答

  1. 避免直接拼接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();
  2. 使用Room:Room默认生成参数化SQL,天然防注入
0