【问题标题】:How to check if a DB exists in Android?如何检查Android中是否存在数据库?
【发布时间】:2026-02-08 03:30:01
【问题描述】:

我正在使用 Room API 在我的 Android 应用中实现数据库。似乎每次我加载我的应用程序时,它都会一次又一次地尝试创建数据库。有什么办法可以限制吗?

 db = Room.databaseBuilder(context, AppDatabase.class, "database-name").build();

【问题讨论】:

  • db是什么类型的变量?
  • @GastónSaillén 它是 RoomDatabase 的一个对象
  • @HemantParmar 。这不是重复的。这里我使用的是 android Room API 而不是 SQLlite
  • 您找到解决此问题的方法了吗?如何调用现有数据库?

标签: java android sql database sqlite


【解决方案1】:

当您创建数据库时,它会在应用程序启动时调用他们的数据库创建。您曾经在应用程序活动中的代码下方以及应用程序类调用中清单文件中的该活动调用,如下面代码所用..

public class AppActivity extends Application {

AppDatabase db;

@Override
public void onCreate() {
    super.onCreate();
    db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
}

public AppDatabase getDatabase() {
    return db;
}

} 并添加以下行清单文件.. 在应用程序标记中添加以下行

        android:name="AppActivity"

【讨论】:

    【解决方案2】:

    您正在使用 db,实际上是一个文件。您可以检查一下,如果存在,此方法可能会有所帮助:

    private static boolean doesDatabaseExist(Context context, String dbName) {
        File dbFile = context.getDatabasePath(dbName);
        return dbFile.exists();
    }
    

    【讨论】:

      【解决方案3】:

      您可以获取数据库中的实体数量(TODO 应用程序 - 示例)。实体 > 0。

      class App: Application() {
          override fun onCreate() {
              super.onCreate()
              instance = this
              database = Room.databaseBuilder(applicationContext,
                  AppDatabase::class.java, "database").build()
          }
          companion object {
              lateinit var instance: App
              lateinit var database: AppDatabase
          }
      }
      

      //数据库类

       @Database(entities = [Task::class], version = 1, exportSchema = false)
             abstract class AppDatabase : RoomDatabase() {
             abstract fun taskDao(): TaskDao
      }
      

      //道接口

         @Dao
          interface TaskDao {
              @Query("SELECT COUNT(id) FROM tasks")
              fun getTasksCount(): Int
          }
      

      //型号

      @Entity(indices = [Index(value = ["title"], unique = true)], tableName ="tasks")
          class Task(
              var title: String = "",
              var description: String = "",
              var date: Date,
              @Embedded 
              var remind: Constants.RemindPeriod = Constants.RemindPeriod.MIN5,
              @Embedded
              var prior: Priority) : Serializable {
              @PrimaryKey(autoGenerate = true)
              var id: Long = 0}
      

      //检查数据库

       private fun checkDatabaseState() {
              doAsync {
                  val db = App.database
                  val entityCount = db.taskDao().getTasksCount().or(0)
                  isDatabaseNotEmpty = entityCount > 0
              }
          }  
      

      【讨论】:

      • 别忘了: implementation "android.arch.persistence.room:runtime:1.1.1" kapt "android.arch.persistence.room:compiler:1.1.1" 否则你将拥有 RoomDatabase_Impl不存在
      【解决方案4】:

      试试这个

      if (!db.exists()) {
          // Database does not exist so copy it from assets here
          Log.i("Database", "Not Found");
      } else {
          Log.i("Database", "Found");
      }
      

      【讨论】: