我正在将我的应用程序从Activity更改为Fragments,它很棒,但我有一个错误,不允许我打开我的数据库。这是错误(来自logcat):
05-17 15:28:38.704 13025-13025/com.MJV.werktijden E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at com.MJV.werktijden.DBAdapter.open(DBAdapter.java:71)
at com.MJV.werktijden.OverviewFragment.onActivityCreated(OverviewFragment.java:38)
at android.app.Fragment.performActivityCreated(Fragment.java:1703)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:903)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
at android.app.BackStackRecord.run(BackStackRecord.java:682)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
我试图自己解决,但我找不到问题。只是因为当我将它与Activity一起使用时,这个数据库确实有效。 我用这种方法打开数据库:
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
从我的片段中调用该方法:
private final DBAdapter db = new DBAdapter(getActivity());
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.overview_layout, container, false);
return rootView;
}
public void onActivityCreated (Bundle savedInstanceState){
listView = (ListView) getView().findViewById(R.id.listView1);
db.open();
感谢您提前帮助。
答案 0 :(得分:15)
替换此行
private final DBAdapter db = new DBAdapter(getActivity());
用这个
private DBAdapter db;
在onActivityCreated()
方法中,添加以下行
db = new DBAdapter(getActivity());
在private final DBAdapter db = new DBAdapter(getActivity());
的{{1}}行中,您在创建活动之前调用Fragment
。因此,当getActivity()
尝试使用SQLiteOpenHelper
(您的活动)时,它会发现它为空。
简单的解决方法是仅在创建Context
后调用getActivity()
(从而打开数据库)。在Activity
创建后调用onActivityCreated()
方法,因此新代码将能够通过Activity
获取Activity
的引用,而不会抛出任何null异常。
答案 1 :(得分:0)
是否有任何挂起的连接,通常在给定的Context
中打开数据库时发生。
检查此Fragment
中是否存在未关闭的连接。