Android 在Kotlin中实例化房间数据库的正确方法

Android 在Kotlin中实例化房间数据库的正确方法,android,kotlin,android-room,Android,Kotlin,Android Room,我正在Kotlin编写我的第一个Android应用程序。 我想知道如何实例化Room持久性数据库,以便可以从许多不同的活动中访问它。 抱歉,如果我的问题不太明确,但我不确定哪些详细信息可能有用。请查看文档,在这里您可以找到有关设置房间的详细逐步教程 拥有DB实例的正确方法是: AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").buil

我正在Kotlin编写我的第一个Android应用程序。 我想知道如何实例化Room持久性数据库,以便可以从许多不同的活动中访问它。
抱歉,如果我的问题不太明确,但我不确定哪些详细信息可能有用。

请查看文档,在这里您可以找到有关设置房间的详细逐步教程

拥有DB实例的正确方法是:

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

查看中的文档,在这里您可以找到有关设置房间的详细的分步教程

拥有DB实例的正确方法是:

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

您可以像这样使用
伴生对象创建实例

@Database(entities = arrayOf(UserEntity::class), version = 1)
abstract class UserDb : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {
        private var INSTANCE: UserDb? = null

        fun getInstance(context: Context): UserDb? {
            if (INSTANCE == null) {
                synchronized(UserDb::class) {
                    INSTANCE = Room.databaseBuilder(context.applicationContext, UserDb::class.java, "user.db").build()
                }
            }
            return INSTANCE
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }
}
您可以像这样在活动中获取db实例

@Database(entities = arrayOf(UserEntity::class), version = 1)
abstract class UserDb : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {
        private var INSTANCE: UserDb? = null

        fun getInstance(context: Context): UserDb? {
            if (INSTANCE == null) {
                synchronized(UserDb::class) {
                    INSTANCE = Room.databaseBuilder(context.applicationContext, UserDb::class.java, "user.db").build()
                }
            }
            return INSTANCE
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }
}
UserDb.getInstance(this)


或者,您也可以使用依赖项注入库,如

您可以使用
伴生对象创建实例,如下所示:

@Database(entities = arrayOf(UserEntity::class), version = 1)
abstract class UserDb : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {
        private var INSTANCE: UserDb? = null

        fun getInstance(context: Context): UserDb? {
            if (INSTANCE == null) {
                synchronized(UserDb::class) {
                    INSTANCE = Room.databaseBuilder(context.applicationContext, UserDb::class.java, "user.db").build()
                }
            }
            return INSTANCE
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }
}
您可以像这样在活动中获取db实例

@Database(entities = arrayOf(UserEntity::class), version = 1)
abstract class UserDb : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {
        private var INSTANCE: UserDb? = null

        fun getInstance(context: Context): UserDb? {
            if (INSTANCE == null) {
                synchronized(UserDb::class) {
                    INSTANCE = Room.databaseBuilder(context.applicationContext, UserDb::class.java, "user.db").build()
                }
            }
            return INSTANCE
        }

        fun destroyInstance() {
            INSTANCE = null
        }
    }
}
UserDb.getInstance(this)

或者,您也可以使用依赖项注入库,如。。 为数据库创建创建应用程序级活动,如下所示

class AppActivity:Application() {
companion object {
    var db: AppDatabase? = null
    fun getDatabase(): AppDatabase? {
        return db
    }

}
override fun onCreate() {
    super.onCreate()
    db= Room.databaseBuilder(applicationContext, AppDatabase::class.java,"DB").allowMainThreadQueries().build()
}

}
之后,此活动将在应用程序标记的清单中定义

        android:name=".app.AppActivity"
在那之后,做道课

@Dao
interface TodoDao {
@Query("SELECT * FROM Todo")
fun getTodoData()= mutableListOf<Todo>()

@Insert
fun insertTodo(todo: Todo)

@Update
fun updateTodo(todo: Todo)

@Delete
fun deleteTodo(todo: Todo)
@Database(entities = arrayOf(User::class,Assignment::class,Todo::class,   Student::class,Event::class,Comment::class,Feedback::class ,Achivement::class,Note::class, Syllabus::class, Education::class, Mark::class, UserWork::class, Exam::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun getUser(): UserDao
abstract fun getStudent(): StudentDao
abstract fun getEducationDao(): EducationDao
abstract fun getWorkDetails(): UserWorkDao
abstract fun getExamDao(): ExamDao
abstract fun getMarkDao(): MarkDao
abstract fun getSyllabusDao(): SyllabusDao
abstract fun getNoteDao(): NoteDao
abstract fun getAchivement():AchivementDao
abstract fun getFeedbackDao():FeedbackDao
abstract fun getCommentDao():CommentDao
abstract fun getEventDao():EventDao
abstract fun getAssignDao():AssignmentDao
abstract fun getTodoDao():TodoDao
 }
为待办事项准备桌子

@Entity
class Todo {
@PrimaryKey(autoGenerate = true)
var id:Int=0
var time:String=""
var activityName:String=""
var hours:String=""
var types:String=""

}
在活动或片段中插入数据后,如下所示

  var data=Todo().apply {
                time=mSpTime?.selectedItem.toString()
                types=mSpTypes?.selectedItem.toString()
                activityName=mEtAname?.text.toString().trim()
                hours=mEtHour?.text.toString().trim()
          }
   AppActivity.getDatabase()?.getTodoDao()?.insertTodo(data)
这样试试。。 为数据库创建创建应用程序级活动,如下所示

class AppActivity:Application() {
companion object {
    var db: AppDatabase? = null
    fun getDatabase(): AppDatabase? {
        return db
    }

}
override fun onCreate() {
    super.onCreate()
    db= Room.databaseBuilder(applicationContext, AppDatabase::class.java,"DB").allowMainThreadQueries().build()
}

}
之后,此活动将在应用程序标记的清单中定义

        android:name=".app.AppActivity"
在那之后,做道课

@Dao
interface TodoDao {
@Query("SELECT * FROM Todo")
fun getTodoData()= mutableListOf<Todo>()

@Insert
fun insertTodo(todo: Todo)

@Update
fun updateTodo(todo: Todo)

@Delete
fun deleteTodo(todo: Todo)
@Database(entities = arrayOf(User::class,Assignment::class,Todo::class,   Student::class,Event::class,Comment::class,Feedback::class ,Achivement::class,Note::class, Syllabus::class, Education::class, Mark::class, UserWork::class, Exam::class), version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun getUser(): UserDao
abstract fun getStudent(): StudentDao
abstract fun getEducationDao(): EducationDao
abstract fun getWorkDetails(): UserWorkDao
abstract fun getExamDao(): ExamDao
abstract fun getMarkDao(): MarkDao
abstract fun getSyllabusDao(): SyllabusDao
abstract fun getNoteDao(): NoteDao
abstract fun getAchivement():AchivementDao
abstract fun getFeedbackDao():FeedbackDao
abstract fun getCommentDao():CommentDao
abstract fun getEventDao():EventDao
abstract fun getAssignDao():AssignmentDao
abstract fun getTodoDao():TodoDao
 }
为待办事项准备桌子

@Entity
class Todo {
@PrimaryKey(autoGenerate = true)
var id:Int=0
var time:String=""
var activityName:String=""
var hours:String=""
var types:String=""

}
在活动或片段中插入数据后,如下所示

  var data=Todo().apply {
                time=mSpTime?.selectedItem.toString()
                types=mSpTypes?.selectedItem.toString()
                activityName=mEtAname?.text.toString().trim()
                hours=mEtHour?.text.toString().trim()
          }
   AppActivity.getDatabase()?.getTodoDao()?.insertTodo(data)

请记住,您必须对kotlin和room再使用一个依赖项

// Room
implementation "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
kapt "android.arch.persistence.room:compiler:1.1.1"

apply plugin: "kotlin-android"

apply plugin: "kotlin-kapt"
apply plugin: "kotlin-android-extensions"

请记住,您必须对kotlin和room再使用一个依赖项

// Room
implementation "android.arch.persistence.room:runtime:1.1.1"
annotationProcessor "android.arch.persistence.room:compiler:1.1.1"
kapt "android.arch.persistence.room:compiler:1.1.1"

apply plugin: "kotlin-android"

apply plugin: "kotlin-kapt"
apply plugin: "kotlin-android-extensions"


如果您在java中使用它,Android studio将转换为kotlin。这个示例项目展示了kotlin中的许多jetpack内容:我不知道如何在java中实现它@ALTegani@rafid059“我会查清楚的。”哈里森不要自问自责!你要的是那样的瘀伤。只需关注细节,看看答案是什么。我会稍微调整一下你的帖子来帮你。祝你好运如果您在java中使用它,Android studio将转换为kotlin。这个示例项目展示了kotlin中的许多jetpack内容:我不知道如何在java中实现它@ALTegani@rafid059“我会查清楚的。”哈里森不要自问自责!你要的是那样的瘀伤。只需关注细节,看看答案是什么。我会稍微调整一下你的帖子来帮你。祝你好运这与问题无关,或者我遗漏了什么?这与问题无关,或者我遗漏了什么?在同伴对象中使用单例模式被否决。那太糟糕了practice@Zun你能扩展更多吗?我看到很多片段就是这样的模式。实际上我也不明白你所说的单例模式是什么意思。我也在使用这个模式,我想了解它的问题。@sprajagopal一个伴生对象已经是一个单态对象了。在单例中创建单例是无用的,也是浪费代码!现代方法实际上是通过Hilt注册房间数据库singleton,并将其注入到需要的任何地方(例如:),因为在同伴对象中使用singleton模式而被否决。那太糟糕了practice@Zun你能扩展更多吗?我看到很多片段就是这样的模式。实际上我也不明白你所说的单例模式是什么意思。我也在使用这个模式,我想了解它的问题。@sprajagopal一个伴生对象已经是一个单态对象了。在单例中创建单例是无用的,也是浪费代码!现代的方法实际上是通过Hilt注册房间数据库singleton,并将其注入到任何需要的地方(例如:)