# Archivos y "preferencias"

> La persistencia ligera fue eliminada — qué usar en su lugar (SQLite kv o archivo en homeFolder).

Source: https://crossfly.dev/es/docs/data-and-services/files-and-preferences — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Archivos y "preferencias"

Esta página es **honesta sobre una eliminación**. Si buscas `SharedPreferences`/`UserDefaults`, detente:
en CrossFly ese mecanismo **no existe**.

## ⚠️ La persistencia ligera fue eliminada
`Settings.appSettings`, `appSecretKey`, `refresh()` y las antiguas "preferencias" **ya no existen** — y
**no hay grabación automática al salir**. Tú grabas **explícitamente**, en el momento adecuado.

## Qué usar en su lugar
| ¿Necesitas guardar… | Usa |
|---|---|
| flags, tema, último login (clave→valor) | **tabla clave/valor en SQLite** ([guía](/docs/data-and-services/storage-sqlite)) |
| blobs / archivos | un **archivo** en `Device.homeFolder` |

### Clave/valor en SQLite (recomendado para configuraciones)
```java
try (SqliteDb db = SqliteDb.open("app.db")) {
   db.exec("CREATE TABLE IF NOT EXISTS kv(k TEXT PRIMARY KEY, v TEXT)");
   db.execute("INSERT OR REPLACE INTO kv(k, v) VALUES(?, ?)", "tema", "escuro");
   String tema = db.queryString("SELECT v FROM kv WHERE k=?", "tema");   // null si ausente
}
```

### Archivo simple en `Device.homeFolder`
`Device.homeFolder` es el directorio base de la app (varía según la plataforma):
| Plataforma | `homeFolder` |
|---|---|
| Desktop | directorio de trabajo (cwd) |
| Android | almacenamiento privado de la app |
| iOS | carpeta *documents* |

```java
String path = Device.homeFolder + "config.json";

byte[] bytes = Utils.readBytes(path);   // ⚠️ null si el archivo no existe
if (bytes != null) {
   String json = new String(bytes);
   // … parse …
}
// FileHandle (libGDX) para casos que necesitan más control:
FileHandle fh = Utils.loadFile(path);   // null si no se encuentra
```

## Buenas prácticas
- **Graba explícitamente** en los puntos adecuados (al guardar una config, al salir de una pantalla) — nada se
  persiste solo.
- Prefiere **SQLite kv** antes que un archivo suelto para configuraciones (transaccional, consultable).
- **Comprueba siempre `null`** de `Utils.readBytes`/`loadFile` (el archivo puede no existir).

## Errores comunes
- Buscar `Settings.appSettings`/`SharedPreferences` — fue eliminado; no vuelve.
- Asumir grabación automática al cerrar — no la hay; graba tú mismo.
- No tratar `null` al leer un archivo inexistente.

## Véase también
- [Persistencia con SQLite](/docs/data-and-services/storage-sqlite)
