【问题标题】:SQLite database in combination with fragmentsSQLite 数据库结合片段
【发布时间】:2013-05-17 13:37:42
【问题描述】:

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

感谢您提前提供帮助。

【问题讨论】:

    标签: android android-fragments android-sqlite


    【解决方案1】:

    修复

    替换此行

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

    有了这个

    private DBAdapter db;
    

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

    db = new DBAdapter(getActivity());
    

    发生了什么

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

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

    【讨论】:

    • 谢谢,这对我很有帮助。
    • 这是对这个问题的一个很好的解释。谢谢!
    【解决方案2】:

    是否有任何挂起的连接,通常在给定Context 中打开数据库时发生。

    检查此Fragment 中是否存在任何未关闭的连接。

    【讨论】:

    • 这只是我启动片段的时候,所以没有打开的连接。它第一次到达 db.open() 方法是崩溃并给出了我展示的 logcat。
    猜你喜欢
    • 2019-08-15
    • 2014-06-02
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    相关资源
    最近更新 更多