# android.database.CursorWindowAllocationException: 游标窗口分配2048kb失败。打开游标数=10（本进程打开游标数=10）

- **ID:** `android/room-cursor-window-allocation-failure`
- **领域:** android
- **类别:** runtime_error
- **验证级别:** ai_generated
- **修复率:** 92%

## 根因

打开游标过多且未正确关闭，超出每进程游标限制（通常100个）或内存限制。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| Room 2.5.0 | active | — | — |
| SQLite 3.40.0 | active | — | — |
| Android 13 (API 33) | active | — | — |

## 解决方案

1. ```
   Replace raw Cursor queries with Room's LiveData or Flow: @Query("SELECT * FROM users") fun getAllUsers(): LiveData<List<User>>. This ensures cursors are closed when lifecycle ends.
   ```
2. ```
   If using raw Cursor, call cursor.close() in finally block and use ContentResolver.query with auto-close flag: val cursor = contentResolver.query(uri, null, null, null, null)?.use { it }
   ```

## 无效尝试

- **Increasing heap size in AndroidManifest with android:largeHeap=true** — Does not address cursor leak; heap size increase delays but doesn't prevent crash. (90% 失败率)
- **Adding try-finally blocks around cursor usage without using Room's LiveData or Flow** — Manual cursor management is error-prone; Room's reactive types handle lifecycle automatically. (70% 失败率)
