2014-03-27 37 views
0

我想更新的片段列表数据并显示,该数据已经传递到数据库,但它得到了NullPointerException异常时使用getWritableDatabase()来更新,NullPointerException异常时使用DatabaseHelper第二次

现在我知道它可以再次调用getWritableDatabase()和getReadableDatabase(),并且不需要关闭数据库。

我应该怎么做才能完成它?

计算器

public class CalcFragment extends Fragment { 

    OnEqualSelectedListener mCallback; 

    public interface OnEqualSelectedListener { 

     public void updateResult(); 
    } 
    ... 
    private void getEqualResult() { 

     textview_result.setText(mResult + sum); 

     mDbHelper = new DB(getActivity()); 
     mDbHelper.open(); 
     mDbHelper.create(mResult + sum); 
     mDbHelper.close(); 

     mCallback.updateResult(); 
... 
} 

MainActivity.class

public class MainActivity extends FragmentActivity implements CalcFragment.OnEqualSelectedListener { 

    View view; 
    ... 
    @Override 
    public void updateResult() { 
     NoteFragment fragmentResult = new NoteFragment(); 
     fragmentResult.updateView(); 
     if(Debug.log){ Log.d("MainActivity", "updateResult");} 
    } 

DB.class

private static class DatabaseHelper extends SQLiteOpenHelper { 

    ... 

    public DB(Context context) { 
    this.mContext = context; 

    if (Debug.log) { 
     Log.d("DB", "DB"); 
    } 

} 

public DB open() throws SQLException { 

     dbHelper = new DatabaseHelper(mContext); 
     db = dbHelper.getWritableDatabase(); 

    if (Debug.log) {Log.d("DB", "SQLException"); 
    } 
    return this; 
} 

public void close() { 

    dbHelper.close(); 
    if (Debug.log) { 
     Log.d("DB", "close"); 
    } 

} 

public Cursor getAll() { 
    mCursor = db.rawQuery("SELECT * FROM history ORDER BY created DESC", 
      null); 

    return mCursor; 
} 

单注

public class NoteFragment extends ListFragment { 


private DB mDbHelper; 
private Cursor mCursor; 
private SimpleCursorAdapter adapter; 

    ... 

public void setAdapter(){ 

    mDbHelper = new DB(getActivity()); 
    mDbHelper.open(); 
    mCursor = mDbHelper.getAll(); 
    getActivity().startManagingCursor(mCursor); 

    String[] from_column = new String[]{DB.KEY_ITEM, DB.KEY_CREATED}; 
    int[] to_layout = new int[]{android.R.id.text1, android.R.id.text2}; 

    adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2, 
      mCursor, from_column, to_layout); 

    setListAdapter(adapter); 

    if(Debug.log){ Log.d("NoteFragment", "setAdapter");} 

} 

public void updateView(){ 

    mDbHelper = new DB(getActivity()); 
    mDbHelper.open(); 
    mCursor = mDbHelper.getAll(); 
    getActivity().startManagingCursor(mCursor); 

    String[] from_column = new String[]{DB.KEY_ITEM, DB.KEY_CREATED}; 
    int[] to_layout = new int[]{android.R.id.text1, android.R.id.text2}; 

    adapter = new SimpleCursorAdapter(getActivity(), android.R.layout.simple_list_item_2, 
      mCursor, from_column, to_layout); 

    adapter.changeCursor(mCursor); 
    adapter.notifyDataSetChanged(); 

    if(Debug.log){ Log.d("NoteFragment", "updateView");} 
} 

日志

03-27 06:09:05.550: E/AndroidRuntime(2652): FATAL EXCEPTION: main 
03-27 06:09:05.550: E/AndroidRuntime(2652): java.lang.NullPointerException 
03-27 06:09:05.550: E/AndroidRuntime(2652):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 
03-27 06:09:05.550: E/AndroidRuntime(2652):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
03-27 06:09:05.550: E/AndroidRuntime(2652):  at com.example.mycalc.DB.open(DB.java:85) 
03-27 06:09:05.550: E/AndroidRuntime(2652):  at com.example.mycalc.NoteFragment.updateView(NoteFragment.java:85) 
03-27 06:09:05.550: E/AndroidRuntime(2652):  at com.example.mycalc.MainActivity.updateResult(MainActivity.java:34) 
03-27 06:09:05.550: E/AndroidRuntime(2652):  at com.example.mycalc.CalcFragment.getEqualResult(CalcFragment.java:258) 
03-27 06:09:05.550: E/AndroidRuntime(2652):  at com.example.mycalc.CalcFragment.access$1(CalcFragment.java:239) 
03-27 06:09:05.550: E/AndroidRuntime(2652):  at com.example.mycalc.CalcFragment$1.onClick(CalcFragment.java:171) 

回答

0

getActivity()Context传递给SQLite的帮手是null。这是因为您刚刚在updateResult()中创建了new的片段,并且它尚未附加到任何活动。

通常,您不应该像这样直接在片段上调用方法,例如updateView()。相反,请等待框架调用片段生命周期回调,如onCreateView()

+0

谢谢!有用!我使用FragmentTransaction来替换片段。 – Sarah0050

0

在致电fragmentResult.updateView();之前,请在活动中添加/替换您的片段。

只有将片段附加到活动后,您才可以从getActivity()的片段中获得上下文。

相关问题