2016-06-08 2 views
-1

조각에서 데이터베이스 쿼리를 호출하는 방법을 찾으려면 도움이 필요합니다.조각에서 데이터베이스 도우미 호출하기

나는 그것에 관하여 약간 화제를 읽고 getActivity()는 저를 돕지 않는 제일 해결책 인 것을 보인다.

java.lang.NullPointerException이 : '를 java.util.List를 가상 메서드를 호출하는 시도 [내 패키지 이름] .DatabaseHelper 여기

내 소스 코드

//package 


//imports 

public class CategoriesFragment extends Fragment 
{ 
    DatabaseHelper db; 

    ArrayList<String> mCategoryList; 
    DynamicListView lvCategories; 
    StableArrayAdapter stableArrayAdapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View rootView = inflater.inflate(R.layout.fragment_categories, container, false); 

     lvCategories = (DynamicListView) rootView.findViewById(R.id.lvCategories); 

     db = new DatabaseHelper(getActivity()); 

     mCategoryList = new ArrayList<>(); 

     stableArrayAdapter = new StableArrayAdapter(getActivity(), R.layout.text_view, mCategoryList); 

     return rootView; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     try { 
      super.onCreate(savedInstanceState); 

      lvCategories.setCheeseList(mCategoryList); 
      lvCategories.setAdapter(stableArrayAdapter); 
      lvCategories.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

      lvCategories.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        //not defined 
       } 
      }); 

      //If listview is empty 
      if (lvCategories.getCount() == 0) { 
       lvCategories.setVisibility(View.GONE); 
      } else { 
       lvCategories.setVisibility(View.VISIBLE); 
      } 
     }catch (Exception e) { 
      Toast.makeText(getActivity(), String.valueOf(e), Toast.LENGTH_LONG).show(); 
     } 
    } 

    public void AddCategoryItem(String word, String reportId) { 


     //get category item by name 
     Category cat = db.getCategory(word); 


     //Adding both ids to table CategoryReport 
     db.createCategoryReport(new CategoryReport(cat.getId(), Integer.parseInt(reportId))); 

    } 

    public String FormatCategory(String word) { 

     String formated = word; 

     int occurence = 1; 

     if (mCategoryList.contains(formated)) { 

      //Salon, Salon #2, Salon #3, etc. 
      while (mCategoryList.contains(formated)) { 
       occurence++; 

       //formated and word are separated to prevent 'Chambre #1 #2' output syntax 
       formated = word + " #" + String.valueOf(occurence); 
      } 
     } 

     return formated; 
    } 

    public void RefreshList(String report_id) { 

     //database 
     List<Category> categories = db.getCategoriesByReport(report_id); 

     //populate liste 
     mCategoryList.clear(); 

     for (Category c : categories) { 
      mCategoryList.add(FormatCategory(c.getName())); 
     } 

     //refresh 
     stableArrayAdapter = new StableArrayAdapter(getActivity(), R.layout.text_view, mCategoryList); 
     lvCategories.setCheeseList(mCategoryList); 
     lvCategories.setAdapter(stableArrayAdapter); 
     lvCategories.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

     if (lvCategories.getCount() == 0) { 
      lvCategories.setVisibility(View.GONE); 
     } else { 
      lvCategories.setVisibility(View.VISIBLE); 
     } 
    } 

} 

그리고 오류 메시지입니다 .getCategoriesByReport (java.lang.String) '을 null 객체 참조에 추가합니다.

이 오류는 RefreshList 방법의 첫번째 라인에서 발생된다.

나는 쿼리 오류에 관한 것이 아니라는 것을 안다. 왜냐하면 필자가 직접적으로 테스트 한 바있다. 당신의 도움에 대한

감사 :

+0

getView(). getContext(); – Sush

+0

어디에서 RefreshList 메서드를 호출하고 있습니까? – Stallion

+0

어디에서 RefreshList를 호출하나요? – dindinii

답변

1

DatabaseHelper 인스턴스가 null 일 것 같습니다. Activity에서 새로 고침 메서드를 호출하고있는 것 같습니까?

Fragment-Activity 라이프 사이클에 따라 DatabaseHelper 인스턴스가 생성되기 전에 RefreshList (String report_id)가 호출 될 수 있습니다.

당신은 당신의 DatabaseHelpergetApplicationContext() 대신 getActivity()을 초기화하기 위해 RefreshList()

+0

throw됩니다 : * NullPointerException 메서드 [...]을 (를) 호출하려고 시도했습니다.null 객체 참조에서 openOrCreateDatabase * –

+0

addCategoryItem에서도이 메서드를 호출해야합니다. 이것이 작동하지 않는다면, DatabaseHelper 클래스의 코드를 게시 할 수 있습니까? – MrJM

+0

민감한 정보 때문에 공유 할 수 없습니다. 개인 프로젝트가 아닙니다. 그러나이 클래스에서 모든 것이 잘된다는 것을 다시 한 번 반복합니다. 쿼리가 활동 작업에서 호출 되었기 때문입니다. –

1

당신이 RefreshList 메소드를 호출 할 때 DB 객체가 null이 될 수 있기 때문에 D. 시도해보십시오

public void RefreshList(String report_id) { 

     db = new DatabaseHelper(getActivity());//reinitialize your DB object 
     //database 
     List<Category> categories = db.getCategoriesByReport(report_id); 
-1

내가 당신을 제안 할 수의 시작과)이

private void initDatabaseHelper(){ 
    if(db == null){ 
     db = new DatabaseHelper(getActivity()); 
    } 
} 

호출하여에서 onCreate (이 방법 같은 것을 추가 할 수 있습니다 . 정적 참조 번호 ContextApplication에 저장됩니다.

+0

게시하십시오. getActivity() 함께 작동하지만 내가 궁금해서 당신의 솔루션을 시도했다. 불행히도, 내 조각에서 getApplicationContext를 호출 할 수 없습니다 ... –

+0

참조 정적 인 'Context' 응용 프로그램에서 – ciccioska

관련 문제