操作类型 | 适用场景 | 实现方式 |
---|---|---|
删除单条记录 | 根据主键精确删除 | SQLiteDatabase.delete() 或 DELETE SQL语句 |
删除多条记录 | 根据条件批量删除 | DELETE FROM table WHERE condition |
清空表数据 | 删除全表数据 | DELETE FROM table 或 TRUNCATE TABLE (需谨慎) |
// 获取可写数据库 SQLiteDatabase db = dbHelper.getWritableDatabase();
// 删除单条记录(需指定where条件)
int rowsAffected = db.delete(
“table_name”, // 表名
“id = ?”, // 条件
new String[]{“123”} // 条件参数
);
// 批量删除(带条件)
db.execSQL(“DELETE FROM table_name WHERE age > ?”, new Object[]{30});
// 清空表(慎用!无法回滚)
db.execSQL(“DELETE FROM table_name”); // 或 TRUNCATE TABLE(需API 28+)
2. 通过ContentProvider操作
```java
// 构造删除URI
Uri uri = ContentUris.withAppendedId(TableMetaData.CONTENT_URI, 123);
// 删除单条记录
int deleted = getContentResolver().delete(uri, null, null);
// 批量删除(带条件)
int deleted = getContentResolver().delete(
TableMetaData.CONTENT_URI,
"age > ?",
new String[]{"30"}
);
事务处理
批量删除必须包裹在事务中:
db.beginTransaction(); try { db.delete("table_name", "condition", null); db.setTransactionSuccessful(); } finally { db.endTransaction(); }
外键约束处理
删除前需检查外键依赖关系,建议先删除子表数据:
PRAGMA foreign_keys = ON; -开启外键检查 DELETE FROM child_table WHERE parent_id = ?; DELETE FROM parent_table WHERE id = ?;
异步执行
数据库操作需在子线程执行,推荐使用:
AsyncTask
(已过时,建议用以下方案)ExecutorService
LiveData
+ ViewModel
(现代架构)问题现象 | 解决方案 |
---|---|
删除失败无响应 | 检查where条件是否正确,确保传递了参数数组 |
外键约束冲突 | 先删除关联子表数据,或设置FOREIGN KEY 约束为ON DELETE CASCADE |
事务未提交 | 确保调用setTransactionSuccessful() 并在finally块结束事务 |
权限不足 | 检查Manifest是否声明android.permission.WRITE_EXTERNAL_STORAGE (仅限外部存储数据库) |
Q1:如何备份数据库后再执行删除?
A:可通过复制数据库文件到外部存储实现备份:
// 备份数据库 File backupFile = new File(context.getExternalFilesDir(null), "backup.db"); InputStream is = new FileInputStream(context.getDatabasePath("database.db").getPath()); OutputStream os = new FileOutputStream(backupFile); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } is.close(); os.close(); // 执行删除操作...
Q2:如何监听数据库删除操作?
A:可通过以下两种方式实现:
getContentResolver().registerContentObserver( Uri.parse("content://com.example.app/table"), true, // 递归监听 new ContentObserver(Handler) { @Override public void onChange(boolean selfChange) { // 处理删除事件 } } );
@Dao public interface MyDao { @Delete void deleteRecord(Entity entity); }
// 在Repository层监听LiveData变化