android - SQLite 数据库结合 fragment

标签 android android-fragments android-sqlite

我正在将我的应用程序从 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;
}

从我的 fragment 中调用该方法:

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

感谢您提前提供帮助。

最佳答案

修复

替换这一行

private final DBAdapter db = new DBAdapter(getActivity());

有了这个

private DBAdapter db;

onActivityCreated()方法中,添加如下行

db = new DBAdapter(getActivity());

发生了什么

Fragment 中的 private final DBAdapter db = new DBAdapter(getActivity()); 行中,您正在调用 getActivity()在创建 Activity 之前。因此,当 SQLiteOpenHelper 尝试使用 Context(您的 Activity )时,它发现它是空的。

简单的解决方法是仅在创建Activity 后调用getActivity()(从而打开您的数据库)。 onActivityCreated() 方法在 Activity 创建后被调用,因此新代码将能够通过 获取您的Activity 的引用>getActivity() 不抛出任何 null 异常。

关于android - SQLite 数据库结合 fragment ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16610498/

相关文章:

android - 如何告诉我的自定义 FragmentPagerAdapter 停止销毁我的 Fragment?

android - 如何在运行时在 android 中更改 3D 饼图段值?

android - $ 和 Android JNI 命名之后是什么?

java - XML 布局 2 个 View 居中,1 个在顶部

java - 图像适配器无法初始化 ImageView

sqlite - 我可以在sqlite的触发器中创建变量吗?

java - 如何在android编程中获取sqlite数据库中的一行或一列的文本?

Android:如何解决点击TabWidget后响应慢的问题

android - 如何查看 GPS 接收器的当前状态?

java - 在 Android 上从 sdk 22 更新到 23 后出现 FragmentManager 错误