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显示内容

排查方向及解决方法
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
相关产品推荐
相关产品推荐

