在Kotlin中实例化Room数据库的正确方法

问题描述 投票:-3回答:4

我正在Kotlin写我的第一个Android应用程序。我想知道如何实例化Room Persistence数据库,以便我可以从许多不同的活动中访问它。对不起,如果我的问题是愚蠢而不是太具体,但我不确定哪些细节可能有用。

android kotlin android-room
4个回答
1
投票

您可以使用companion objectlike创建实例,

@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的实例,

UserDb.getInstance(this)

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


1
投票

试试这种方式..为数据库创建制作如下所示的app级活动。

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()
}

}

之后,此活动在应用程序标记的manifest中定义..

        android:name=".app.AppActivity"

在那之后做dao课..

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

}

make数据库类访问所有dao类..

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

制作todo的桌子..

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

1
投票

请记住,你必须为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"

0
投票

查看this link中的文档,您将在此处找到有关设置Room的详细分步教程。

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

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "database-name").build();
© www.soinside.com 2019 - 2024. All rights reserved.