Android studio 如何在Kotlin中将SQLiteOpenHelper与片段一起使用

Android studio 如何在Kotlin中将SQLiteOpenHelper与片段一起使用,android-studio,kotlin,android-fragments,Android Studio,Kotlin,Android Fragments,我正试图通过使用片段而不是活动,在我的应用程序中实现一个待办事项列表应用程序。我遇到了一些我能够解决的问题,但现在活动无法启动 TaskDbHelper class TaskDbHelper(fragment: HomeFragment) : SQLiteOpenHelper(fragment.requireContext(), TaskContract.DB_NAME, null, TaskContract.DB_VERSION) { override fun onCreate(db: SQ

我正试图通过使用片段而不是活动,在我的应用程序中实现一个待办事项列表应用程序。我遇到了一些我能够解决的问题,但现在活动无法启动

TaskDbHelper

class TaskDbHelper(fragment: HomeFragment) : SQLiteOpenHelper(fragment.requireContext(), TaskContract.DB_NAME, null, TaskContract.DB_VERSION) {

override fun onCreate(db: SQLiteDatabase) {
    val createTable = "CREATE TABLE " + TaskContract.TaskEntry.TABLE + " (" +
            TaskContract.TaskEntry.ID + " INTEGER, " +
            TaskContract.TaskEntry.COL_TASK_TITLE + " TEXT NOT NULL, " +
            TaskContract.TaskEntry.COL_TASK_TEXT + " TEXT NOT NULL, " +
            TaskContract.TaskEntry.COL_TASK_DATE + " TEXT NOT NULL);"

    db.execSQL(createTable)
}

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
    db.execSQL("DROP TABLE IF EXISTS " + TaskContract.TaskEntry.TABLE)
    onCreate(db)
}
}

我在助手中将参数从
上下文:
更改为
片段:
片段.requireContext()

日志上就是这么说的

  Process: com.khumomashapa.notes, PID: 15097
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.khumomashapa.notes/com.khumomashapa.notes.activities.MainActivity}: java.lang.IllegalStateException: Fragment HomeFragment{1c275a3} (14bd8ea4-7821-4630-9a9a-c93eaaa2e0d5)} not attached to a context.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3654)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3806)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2267)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:8167)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
     Caused by: java.lang.IllegalStateException: Fragment HomeFragment{1c275a3} (14bd8ea4-7821-4630-9a9a-c93eaaa2e0d5)} not attached to a context.
        at androidx.fragment.app.Fragment.requireContext(Fragment.java:805)
        at com.khumomashapa.notes.sql.TaskDbHelper.<init>(TaskDbHelper.kt:10)
        at com.khumomashapa.notes.fragments.HomeFragment.<init>(HomeFragment.kt:25)
        at com.khumomashapa.notes.activities.MainActivity.onCreate(MainActivity.kt:33)
        at android.app.Activity.performCreate(Activity.java:7963)
        at android.app.Activity.performCreate(Activity.java:7952)

在片段附加到活动之前,您正在初始化
TaskDbHelper
。您需要确保在片段生命周期的正确点访问上下文/视图相关的内容,您可以阅读更多关于这些内容的信息


通常,您应该在
onViewCreated
中执行任何与视图相关的逻辑,并且可以更早地访问上下文,最有可能的是在
onAttached
中,在片段附加到活动之前,您正在初始化
TaskDbHelper
。您需要确保在片段生命周期的正确点访问上下文/视图相关的内容,您可以阅读更多关于这些内容的信息


通常,您应该在创建的视图中执行任何与视图相关的逻辑,并且可以更早地访问上下文,最有可能的情况是在片段正确初始化之前调用
homefragment.requireContext()
。看

您可以通过使mHelper成为一个
lateinitvar
并将其填充到适当的回调中来解决这个问题,例如

override fun onAttach(context: Context) {
    super.onAttach(context)
    mHelper = TaskDbHelper(this)
}

。。。但这是一个快速而肮脏的解决方案。就我个人而言,我很可能会研究依赖注入…

在片段正确初始化之前,您正在调用
homefragment.requireContext()
。看

您可以通过使mHelper成为一个
lateinitvar
并将其填充到适当的回调中来解决这个问题,例如

override fun onAttach(context: Context) {
    super.onAttach(context)
    mHelper = TaskDbHelper(this)
}
。。。但这是一个快速而肮脏的解决方案。就我个人而言,我很可能会研究依赖注入