android-studio - 如何在 Kotlin 中将 SQLiteOpenHelper 与片段一起使用
问题描述
我正在尝试通过使用片段而不是活动将待办事项列表应用程序实现到我的应用程序中。我遇到了一些我能够解决的问题,但现在活动无法开始。
任务数据库助手
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)
}
}
我在帮助程序中将参数从 更改context:
为fragments:
和fragment.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)
当有人启动我的应用程序时,Home Fragment 是他们应该看到的第一个,但它立即崩溃。
这是 Home Fragment,但只有导致异常的行
class HomeFragment : Fragment() {
private var recyclerView: RecyclerView? = null
private var mHelper: TaskDbHelper = TaskDbHelper(this)
private val adapter = MyAdapter(this, mHelper)
private val TAG: String = "HomeFragment"
解决方案
您在homefragment.requireContext()
Fragment 正确初始化之前调用。请参阅片段生命周期
您可以通过制作 mHelper alateinit var
并将其填充到适当的回调中来解决此问题,例如
override fun onAttach(context: Context) {
super.onAttach(context)
mHelper = TaskDbHelper(this)
}
...但那是一个快速而肮脏的解决方案。就个人而言,我很可能会研究依赖注入......
推荐阅读
- javascript - Webpack 提供的依赖使我的应用程序陷入循环依赖
- python - 库从python中的方程生成一组坐标点?
- sed - 替换字符串,但仅当它是该字符串在特定行之前的最后一次出现时
- ocaml - Z3 OCaml API:mk_solver_s、mk_solver 和 mk_simple_solver 之间的区别
- python - Python:适用于 Windows,不适用于 WSL(ubuntu):AttributeError:“LogFile”对象没有属性“fileno”-LogFile 不是我的变量
- amazon-web-services - ACM SSL 证书是绑定到托管区域还是仅绑定到域?
- kubernetes - Kubernetes 死节点感知
- android - Google Play 结算库的奇怪行为
- c# - 如何在 asp.net core razor 中显示来自数据库文件路径的图像
- reactjs - 操作上下文数据以将输入传递给组件