SQLite数据库与片段结合使用

Mar*_*arc 5 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)
Run Code Online (Sandbox Code Playgroud)

我试图自己解决,但我找不到问题.只是因为当我将它与Activity一起使用时,这个数据库确实有效.我用这种方法打开数据库:

    //---opens the database---
public DBAdapter open() throws SQLException
{
    db = DBHelper.getWritableDatabase();
    return this;
}
Run Code Online (Sandbox Code Playgroud)

从我的片段中调用该方法:

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();
Run Code Online (Sandbox Code Playgroud)

感谢您提前帮助.

kde*_*iry 15

修复

替换此行

private final DBAdapter db = new DBAdapter(getActivity());
Run Code Online (Sandbox Code Playgroud)

有了这个

private DBAdapter db;
Run Code Online (Sandbox Code Playgroud)

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

db = new DBAdapter(getActivity());
Run Code Online (Sandbox Code Playgroud)

怎么了

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

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