Android Data Layer

new-silvermoon/awesome-android-agent-skills/.github/skills/architecture/android-data-layer

作者 new-silvermoon82900eacc8dbe13de93c6310af27b9df4b2bd2f6无许可证收录于 2026年10月9日更新于 2026年10月9日

Guidance on implementing the Data Layer using Repository pattern, Room (Local), and Retrofit (Remote) with offline-first synchronization.

AI 生成的概览

指导 Android 开发者使用 Repository、Room、Retrofit 和 Hilt 构建离线优先的数据层。

功能
该技能提供指导,说明如何围绕 Repository 模式将 Android 应用的数据层组织为单一数据源。内容涵盖使用 Room 实体和返回 Flow 的 DAO 实现本地持久化、使用 Retrofit 挂起函数进行远程获取,以及针对网络异常的错误处理。它还介绍了同步策略,例如读取时的 stale-while-revalidate 和写入时的 outbox 模式,以及通过 Hilt 模块将仓库接口绑定到实现。
适用场景
适用于规划或实现需要缓存、离线支持,或在本地数据库与远程 API 之间协调的 Android 应用数据层。也适合在决定如何组织仓库、Room DAO、Retrofit 服务和依赖注入绑定时使用。
运行要求
不包含脚本或资源,仅为说明性内容。该指导假定项目使用 Kotlin、Room、Retrofit、Hilt 和 WorkManager,但阅读它不需要安装包、凭据或网络访问。

Android Data Layer & Offline-First

Instructions

The Data Layer coordinates data from multiple sources.

1. Repository Pattern

  • Role: Single Source of Truth (SSOT).
  • Logic: The repository decides whether to return cached data or fetch fresh data.
  • Implementation:
    kotlin
    class NewsRepository @Inject constructor(    private val newsDao: NewsDao,    private val newsApi: NewsApi) {    // Expose data from Local DB as the source of truth    val newsStream: Flow<List<News>> = newsDao.getAllNews()
        // Sync operation    suspend fun refreshNews() {        val remoteNews = newsApi.fetchLatest()        newsDao.insertAll(remoteNews)    }}

2. Local Persistence (Room)

  • Usage: Primary cache and offline storage.
  • Entities: Define @Entity data classes.
  • DAOs: Return Flow<T> for observable data.

3. Remote Data (Retrofit)

  • Usage: Fetching data from backend.
  • Response: Use suspend functions in interfaces.
  • Error Handling: Wrap network calls in try-catch blocks or a Result wrapper to handle exceptions (NoInternet, 404, etc.) gracefully.

4. Synchronization

  • Read: "Stale-While-Revalidate". Show local data immediately, trigger a background refresh.
  • Write: "Outbox Pattern" (Advanced). Save local change immediately, mark as "unsynced", use WorkManager to push changes to server.

5. Dependency Injection

  • Bind Repository interfaces to implementations in a Hilt Module.
    kotlin
    @Bindsabstract fun bindNewsRepository(impl: OfflineFirstNewsRepository): NewsRepository

来源与署名

来源:new-silvermoon/awesome-android-agent-skills位于.github/skills/architecture/android-data-layer提交82900ea

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架