2016-03-19 4 views
1

複数のフラグメントを持つアプリがあります。 1つのフラグメントでは、ユーザーはSQLテーブルに格納される情報を入力します。別のフラグメントでは、そのテーブルからデータが読み込まれます(現在、テスト目的でコンソールにログを記録するだけです)。 dbへの保存は正常に動作しますが、データを読み込もうとするとエラーが発生します。Android sqlの複数のフラグメントエラー

マイDBHelperクラスは、これらのインサート/読み込みのメソッドがあります。私は新しいDBHelperを作成し、私のユーザー作成の断片で

public class DBHelper extends SQLiteOpenHelper { 

    public boolean insertSubject(Integer id, String date, String RA, Integer condition, Integer age, String sex) 
    { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(SUBJECTS_ID, id); 
     contentValues.put(SUBJECTS_DATE, date); 
     contentValues.put(SUBJECTS_RA, RA); 
     contentValues.put(SUBJECTS_CONDITION, condition); 
     contentValues.put(SUBJECTS_AGE, age); 
     contentValues.put(SUBJECTS_SEX, sex); 
     db.insertOrThrow(SUBJECTS_TABLE_NAME, null, contentValues); 
     db.close(); 
     return true; 
    } 

    public boolean getSubject(Short subNum){ 
     SQLiteDatabase db = this.getReadableDatabase(); 
     String query = "SELECT * FROM subjects WHERE " + SUBJECTS_ID + "=" + subNum; 

     Cursor c = db.rawQuery(query, null); 

     while (c.moveToNext()) { 
      String result_0=c.getString(0); 
      String result_1=c.getString(1); 

      Log.d("query", result_0); 
      Log.d("query", result_1); 
     } 
     c.close(); 
     db.close(); 

     return true; 
    } 
} 

を:

@Override 
public void onActivityCreated(Bundle savedInstanceState){ 
    super.onActivityCreated(savedInstanceState); 
    db = new DBHelper(getActivity()); 
} 

そして、ビューが作成されます。

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     coordinatorLayout = (CoordinatorLayout) getActivity().findViewById(R.id.coordinator_layout); 
     View view = inflater.inflate(R.layout.fragment_new, container, false); 

     mainActivity = (MainActivity) getActivity(); 

     //Listener for create button 
     createButton = (Button) view.findViewById(R.id.input_submit); 
     createButton.setOnClickListener(this); 

     // Inflate the layout for this fragment 
     return view; 
    } 

作成ボタンには、onClickリスナーがあります。

@Override 
public void onClick(View v) { 

    //Some form validation things go here 

     //write to database 
     try { 
      db.insertSubject(
        Integer.parseInt(subNum), 
        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), 
        ra, 
        Integer.parseInt(condition), 
        Integer.parseInt(age), 
        sex); 

      //Store subject number for use throughout 
      mainActivity.subNum = Short.parseShort(subNum); 
      mainActivity.subCreated = true; 

     } catch (SQLiteConstraintException e){ 
      Snackbar.make(coordinatorLayout, "Subject number already exists", Snackbar.LENGTH_SHORT).show(); 
      subNumWrapper.requestFocus(); 
     } 
} 

これにより、DBは正常に保存されます。サブ番号はメインアクティビティに保存されるので、後でデータベースにクエリするときに使用できます。

ただし、dbから読み込もうとすると問題が発生します。そのフラグメントでは、私のonActivityCreatedメソッドは文字通り上記のフラグメントと同じです。そしてonCreateView、DBHelperメソッドを呼び出すのに加え以上が、と基本的に同じで:私はそれがないことを意味だと思う

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean come.example.test.DBHelper.getSubject(java.lang.Short)' on a null object reference 

db.getSubject(mainActivity.subNum); 

私は次のエラーを取得していますdbの存在を認識していますか?

なぜ私は両方のフラグメントクラスで全く同じ方法(onActivityCreated)でdbを定義しましたか?これは主題の作成断片では機能しますが、質問の断片では機能しません。

+0

参照http://stackoverflow.com/a/32656807/369 OnActivityCreated()はonCreateView()の後に呼び出されます。 挿入フラグメントでは、挿入時にイベント駆動型のクリックが発生し、onActivityCreated()が実行されます。 dbから読み込み中、これは当てはまりません。 – chiragjn

答えて

0

あなたが探している答えはここにある、元

をそれを維持するには:あなたの挿入断片でhttps://stackoverflow.com/a/32656807/3697191

、呼び出しはこの

onCreateView() //db still null 
onActivityCreated() //db instantiated 
onClick() //User clicked, db is not null 

あなたの読書にいる間のような順序何かに起こりますdbフラグメント由来

onCreateView() //db still null 
//Uh oh, we tried to read from db, NullPointerException 
onActivityCreated() //db instantiated 
+0

これは、ほとんどの/すべてのdb読み取り/書き込みコード(一般的に)が 'onActivityCreated()'に存在するはずですか? – Simon

+0

ビューにデータを表示する必要がある場合は、onCreateView()でdb作業(インスタンス化とフェッチ)を行います。 しかし、データフェッチに時間がかかり、UIスレッドで完了すると、アプリが応答しなくなる可能性があるため、バックグラウンドスレッドでdb作業を行い、データを取得するとすぐにビューを更新することを検討してください – chiragjn

関連する問題