2.8 KiB
Архитектура Balance Android
Слои
Jetpack Compose
│
▼
MainViewModel
│
├──────────────► FinanceMath
│
▼
FinanceDao ────────► Room / SQLite
│
└──────────────► SyncRepository
│
┌─────────┴─────────┐
▼ ▼
ServerApi SecureSessionStore
│ │
▼ ▼
BalanceServer Android Keystore
Application
BalanceApplication создаёт singleton-зависимости:
AppDatabaseServerPreferencesSecureSessionStoreSyncRepository
Также регистрирует уникальный WorkManager job balance-periodic-sync.
UI
MainActivity запускает Compose root.
BalanceRoot содержит навигацию между:
- Обзор;
- Аналитика;
- Операции;
- Бюджеты;
- Настройки;
- Категории;
- Сервер и синхронизация.
MainViewModel объединяет Room flows, sync status/session и настройки в FinanceUiState.
Data
Room database называется balance-android.db.
Entities:
TransactionEntityCategoryEntityBudgetEntityDeletionEntity
FinanceDao предоставляет Flow для UI и suspend-операции для записи/sync.
Sync
Sync двухфазный:
local changes → push
server changes → pull
Push идёт пакетами до 100 изменений. Большой JSON (> 1.5 MB) рекурсивно разбивается.
Pull использует server cursor и hasMore.
Remote changes применяются атомарно через Room transaction.
Conflict resolution
Стратегия — timestamp-based last-write-wins:
remote.updatedAt > local.updatedAt
Если локальная запись новее или равна, remote payload не заменяет её.
Background sync
WorkManager запускается с:
- периодом 15 минут;
NetworkType.CONNECTED.
Worker ничего не делает без server session/server URL.
Ограничения Android могут отложить фактический запуск; 15 минут — минимальный период WorkManager, а не гарантия точного времени запуска.
Платформа
Android-клиент не использует CloudKit. Локальное хранение всегда Room; синхронизация с другими клиентами выполняется через BalanceServer.