如何在Android中检查数据库是否存在?

7

我正在使用Room API在我的Android应用程序中实现一个数据库。似乎每次我加载我的应用程序时,它都会尝试一遍又一遍地创建数据库。有没有办法限制这个问题的发生?

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

db 是什么类型的变量? - Gastón Saillén
@GastónSaillén 是 RoomDatabase 的一个对象。 - Abx
2
可能是查询Android数据库是否存在!的重复问题。 - Hemant Parmar
@HemantParmar。这不是重复内容。我在使用Android Room API而不是SQLlite。 - Abx
你找到了解决这个问题的方法吗?如何调用现有的数据库? - loopidio
4个回答

4
您正在使用实际上是文件的db。如果存在,您可以检查此方法可能会有所帮助:
private static boolean doesDatabaseExist(Context context, String dbName) {
    File dbFile = context.getDatabasePath(dbName);
    return dbFile.exists();
}

3

当你创建数据库时,应用程序启动时会调用数据库onCreate()回调。你可以在应用程序活动中使用以下代码,并且在清单文件中的应用程序类调用该活动,如下所示:

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"

1
你可以获得数据库中实体的数量(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接口

   @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
        }
    }  

请务必添加以下代码,否则会出现 RoomDatabase_Impl 不存在的错误:implementation "android.arch.persistence.room:runtime:1.1.1" kapt "android.arch.persistence.room:compiler:1.1.1" - Vladimir Vartanyan

-1

试试这个

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接