Content Provider:如何利用ContentValues数组更新SQLite所有行与列
嘿,看起来你现在是想把一组ContentValues批量存入SQLite数据库,之前的做法是循环三次单行插入对吧?其实有更高效的批量处理方式,我给你梳理两种常用方案:
方案1:手动事务包裹循环插入(直接操作SQLiteDatabase)
这种方式最直接,而且能大幅提升批量插入的性能——因为默认情况下每次insert都会自动开启并提交事务,批量操作时手动控制事务可以减少频繁的IO开销。
步骤示例:
- 先准备好你的
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;
- 用事务批量插入:
// 获取可写的数据库实例 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
相关产品推荐
相关产品推荐

