You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中使用Room创建数据库失败,Database Inspector无数据显示

Room闪卡数据库无数据排查方案

我用Room搭建了一个闪卡存储数据库,所有必要代码都已完成,但运行应用后Database Inspector里看不到任何内容,求排查原因。

实体类(Entity)

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "flashcards")
data class Flashcard(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    val question: String,
    val answer: String
)

数据访问对象(DAO)

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow

@Dao
interface FlashcardDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(flashcard: Flashcard)

    @Update
    suspend fun update(flashcard: Flashcard)

    @Delete
    suspend fun delete(flashcard: Flashcard)

    @Query("SELECT * FROM flashcards WHERE id = :id")
    fun getFlashcard(id: Int): Flow<Flashcard>

    @Query("SELECT * FROM flashcards")
    fun getAllFlashcards(): Flow<List<Flashcard>>
}

数据库类(Database Class)

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(
    entities = [Flashcard::class],
    version = 1,
    exportSchema = false
)
abstract class FlashcardDatabase: RoomDatabase() {
    abstract fun flashcardDao(): FlashcardDao

    companion object {
        @Volatile
        private var Instance: FlashcardDatabase? = null
        fun getDatabase(context: Context): FlashcardDatabase {
            return Instance ?: synchronized(this) {
                Room.databaseBuilder(context, FlashcardDatabase::class.java, "flashcard_database")
                    .fallbackToDestructiveMigration()
                    .build()
                    .also { Instance = it }
            }
        }
    }
}

仓库接口(Repository Interface)

interface FlashCardsRepository {
    fun getAllFlashcardsStream(): Flow<List<Flashcard>>
    fun getFlashcardStream(id: Int): Flow<Flashcard?>
    suspend fun insertFlashcard(flashcard: Flashcard)
    suspend fun deleteFlashcard(flashcard: Flashcard)
    suspend fun updateFlashcard(flashcard: Flashcard)
}

仓库实现类(Repository implementation class)

import kotlinx.coroutines.flow.Flow

class OfflineFlashcardsRepository(private val flashcardDao: FlashcardDao) : FlashCardsRepository {
    override fun getAllFlashcardsStream(): Flow<List<Flashcard>> = flashcardDao.getAllFlashcards()
    override fun getFlashcardStream(id: Int): Flow<Flashcard?> = flashcardDao.getFlashcard(id)
    override suspend fun insertFlashcard(flashcard: Flashcard) = flashcardDao.insert(flashcard = flashcard)
    override suspend fun updateFlashcard(flashcard: Flashcard) = flashcardDao.update(flashcard = flashcard)
    override suspend fun deleteFlashcard(flashcard: Flashcard) = flashcardDao.delete(flashcard = flashcard)
}

应用容器(依赖注入)

import android.content.Context

interface AppContainer {
    val flashCardsRepository: FlashCardsRepository
}

class AppDataContainer(private val context: Context): AppContainer {
    override val flashCardsRepository: FlashCardsRepository by lazy {
        OfflineFlashcardsRepository(FlashcardDatabase.getDatabase(context).flashcardDao())
    }
}

FlashcardApplication(已配置到清单)

import android.app.Application
import com.example.flashcardapp.data.AppContainer
import com.example.flashcardapp.data.AppDataContainer

class FlashcardApplication: Application() {
    lateinit var container: AppContainer
    override fun onCreate() {
        super.onCreate()
        container = AppDataContainer(this)
    }
}

清单文件(Manifest File)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:name=".FlashcardApplication"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.FlashcardApp"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:theme="@style/Theme.FlashcardApp">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Database Inspector显示内容

Database Inspector显示无数据


排查方向及解决方法

1. 核心问题:未执行数据插入操作

Room数据库初始化后不会自动生成测试数据,必须手动调用插入方法。比如在MainActivity中添加测试代码:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import com.example.flashcardapp.FlashcardApplication
import com.example.flashcardapp.data.Flashcard

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 添加测试闪卡
        lifecycleScope.launch {
            val repository = (application as FlashcardApplication).container.flashCardsRepository
            repository.insertFlashcard(Flashcard(question = "Android四大组件是什么?", answer = "Activity、Service、BroadcastReceiver、ContentProvider"))
        }
    }
}

2. 验证数据库实例初始化

确认在使用Repository时,正确获取了Application中的容器实例,避免出现空实例或未初始化的情况。

3. 检查Room依赖配置

确保build.gradle(Module级别)中添加了完整的Room依赖:

dependencies {
    // Room核心依赖
    implementation "androidx.room:room-runtime:2.5.0"
    kapt "androidx.room:room-compiler:2.5.0"
    // Room Kotlin扩展
    implementation "androidx.room:room-ktx:2.5.0"
}

4. 确认Database Inspector连接正确

  • 确保选中当前运行的应用进程
  • 检查数据库名称是否为flashcard_database,表名是否为flashcards
  • 若仍看不到数据,可尝试重启应用和Database Inspector

内容的提问来源于stack exchange,提问作者Allen J Mathew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 02:54:55