You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Content Provider:如何利用ContentValues数组更新SQLite所有行与列

嘿,看起来你现在是想把一组ContentValues批量存入SQLite数据库,之前的做法是循环三次单行插入对吧?其实有更高效的批量处理方式,我给你梳理两种常用方案:

方案1:手动事务包裹循环插入(直接操作SQLiteDatabase)

这种方式最直接,而且能大幅提升批量插入的性能——因为默认情况下每次insert都会自动开启并提交事务,批量操作时手动控制事务可以减少频繁的IO开销。

步骤示例:

  1. 先准备好你的ContentValues[]数组:
// 初始化3行数据的ContentValues数组
ContentValues[] cvArray = new ContentValues[3];

// 填充第一行数据
ContentValues cv1 = new ContentValues();
cv1.put(WeatherContract.WeatherData.COLUMN_DAY_OF_WEEK, "周一");
cv1.put(WeatherContract.WeatherData.COLUMN_HUMIDITY, 65);
cvArray[0] = cv1;

// 填充第二行数据
ContentValues cv2 = new ContentValues();
cv2.put(WeatherContract.WeatherData.COLUMN_DAY_OF_WEEK, "周二");
cv2.put(WeatherContract.WeatherData.COLUMN_HUMIDITY, 70);
cvArray[1] = cv2;

// 填充第三行数据
ContentValues cv3 = new ContentValues();
cv3.put(WeatherContract.WeatherData.COLUMN_DAY_OF_WEEK, "周三");
cv3.put(WeatherContract.WeatherData.COLUMN_HUMIDITY, 60);
cvArray[2] = cv3;
  1. 用事务批量插入:
// 获取可写的数据库实例
SQLiteDatabase db = yourDbHelper.getWritableDatabase();

try {
    // 开启事务
    db.beginTransaction();
    for (ContentValues cv : cvArray) {
        // 插入单条数据,自增ID列无需手动put,SQLite会自动生成
        db.insert(WeatherContract.WeatherData.TABLE_NAME, null, cv);
    }
    // 标记事务执行成功
    db.setTransactionSuccessful();
} finally {
    // 结束事务:如果之前标记了成功就提交,否则回滚
    db.endTransaction();
    // 记得关闭数据库(如果不需要继续操作的话)
    db.close();
}
方案2:通过ContentProvider的bulkInsert方法(如果使用了ContentProvider)

如果你的项目是通过ContentProvider封装数据库操作,那可以重写bulkInsert方法来实现批量插入,这样更符合Android的组件设计规范。

重写ContentProvider的bulkInsert:

@Override
public int bulkInsert(Uri uri, ContentValues[] values) {
    SQLiteDatabase db = yourDbHelper.getWritableDatabase();
    int insertedCount = 0;

    try {
        db.beginTransaction();
        for (ContentValues cv : values) {
            db.insert(WeatherContract.WeatherData.TABLE_NAME, null, cv);
            insertedCount++;
        }
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }

    // 通知数据变化
    getContext().getContentResolver().notifyChange(uri, null);
    return insertedCount;
}

调用bulkInsert:

// 调用ContentProvider的批量插入方法
int count = getContentResolver().bulkInsert(WeatherContract.WeatherData.CONTENT_URI, cvArray);
注意事项
  • 你的自增ID列不需要手动在ContentValues中put值,只要建表时把该列定义为INTEGER PRIMARY KEY AUTOINCREMENT,SQLite就会自动为每一行生成唯一的自增ID。
  • 批量操作一定要用事务包裹,否则数据量越大,性能差距越明显。

内容的提问来源于stack exchange,提问作者Mark F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:57:34