Java 当我按下微调器按钮时,数据库引用变为空

Java 当我按下微调器按钮时,数据库引用变为空,java,android,illegalstateexception,Java,Android,Illegalstateexception,在我的主要活动(A)中,我打开一个调用特定类的数据库(SQLite),并存储指向变量的“db指针”。它可以工作:我可以从数据库加载/保存数据 对于某些工作,我必须开始另一个活动(B)。这将打开数据库以对数据库执行一些操作(尤其是在其中创建新记录) 当我关闭(B)时,Android将重新启动并恢复主要活动。我检查“db指针”,它不为空 在主活动中有一个微调器按钮。如果我按下它,并选择一个不同的值,“db指针”变为空。“onItemSelected()”必须调用数据库以查找数据。 为什么“db指针”

在我的主要活动(A)中,我打开一个调用特定类的数据库(SQLite),并存储指向变量的“db指针”。它可以工作:我可以从数据库加载/保存数据

对于某些工作,我必须开始另一个活动(B)。这将打开数据库以对数据库执行一些操作(尤其是在其中创建新记录)

当我关闭(B)时,Android将重新启动并恢复主要活动。我检查“db指针”,它不为空

在主活动中有一个微调器按钮。如果我按下它,并选择一个不同的值,“db指针”变为空。“onItemSelected()”必须调用数据库以查找数据。 为什么“db指针”变为空?

打开数据库并创建“db指针”的代码:

错误日志:

02-22 23:11:25.560: E/AndroidRuntime(15442): FATAL EXCEPTION: main
02-22 23:11:25.560: E/AndroidRuntime(15442): Process: com.example.Traffic, PID: 1544202-22 23:11:25.560: E/AndroidRuntime(15442): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.Traffic/databases/dbtrip
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1156)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at com.database.trip.DbAdapter.fetchVehiclesByCod(DbAdapter.java:240)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at com.example.Traffic.Mappa.vehicleParameters(Mappa.java:937)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at com.example.Traffic.Mappa.access$1(Mappa.java:936)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at com.example.Traffic.Mappa$1.onItemSelected(Mappa.java:717)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.widget.AdapterView.fireOnSelected(AdapterView.java:896)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.widget.AdapterView.access$200(AdapterView.java:51)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:864)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.os.Handler.handleCallback(Handler.java:733)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.os.Handler.dispatchMessage(Handler.java:95)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.os.Looper.loop(Looper.java:136)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.app.ActivityThread.main(ActivityThread.java:5336)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at java.lang.reflect.Method.invokeNative(Native Method)

问题在于此异常无法重新打开数据库。当您关闭DBHelper并重用它时,就会发生这种情况。

这不是堆栈跟踪中的
NullPointerException
。您是如何得出指针变为空的结论的?你真的看了吗?在我看来,该对象似乎仍然存在,刚刚关闭,无法继续使用。
java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase:/data/data/com.example.Traffic/databases/dbtrip
。在使用数据库之前必须(重新)打开它。@MATTI我在重新启动、恢复时签入了它。。。在我选择的例子中,它变成了“不开放”(我写了null,但实际情况是“不开放”)。我用isOpen()检查它。@BOB我添加了代码,如果数据库在onItemSelected中未打开,则重新打开该数据库,错误已得到解决,但为什么“db指针”仅在onItemSelected中变为“未打开”?在onRestart、onResume中。。。它是开着的吗?THX:)@Adamz:不要写“null”,如果你不是null的意思,那会让人困惑。
02-22 23:11:25.560: E/AndroidRuntime(15442): FATAL EXCEPTION: main
02-22 23:11:25.560: E/AndroidRuntime(15442): Process: com.example.Traffic, PID: 1544202-22 23:11:25.560: E/AndroidRuntime(15442): java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.example.Traffic/databases/dbtrip
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1156)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at com.database.trip.DbAdapter.fetchVehiclesByCod(DbAdapter.java:240)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at com.example.Traffic.Mappa.vehicleParameters(Mappa.java:937)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at com.example.Traffic.Mappa.access$1(Mappa.java:936)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at com.example.Traffic.Mappa$1.onItemSelected(Mappa.java:717)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.widget.AdapterView.fireOnSelected(AdapterView.java:896)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.widget.AdapterView.access$200(AdapterView.java:51)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:864)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.os.Handler.handleCallback(Handler.java:733)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.os.Handler.dispatchMessage(Handler.java:95)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.os.Looper.loop(Looper.java:136)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at android.app.ActivityThread.main(ActivityThread.java:5336)
02-22 23:11:25.560: E/AndroidRuntime(15442):     at java.lang.reflect.Method.invokeNative(Native Method)