2011-10-06 4 views
0

사용자 지정 목록 어댑터를 사용하여 listview에 전달되기 전에 응용 프로그램에서 데이터베이스를 정렬하려고합니다. 알아 냈다고 생각했지만, 매번 실행할 때마다 FC가 생겼습니다. 에서 onCreate의 코드는 다음과 같습니다 :SQLite 데이터베이스 onCreate 및 onResume을 sharedpreference를 기준으로 정렬하는 방법은 무엇입니까?

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    debtlist = (ListView)findViewById(R.id.debtlist); 
    registerForContextMenu(debtlist); 

    //Retrieve the users sort order 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    String sortorder = sp.getString("sortPref","id"); 
    db=new DatabaseHelper(this); 
//  constantsCursor=db.getReadableDatabase().rawQuery("SELECT _ID, Debt, StartingAmount, CurrentAmount, InterestRate, DueDate, MinimumPayment "+ 
//    "FROM tblDebts ORDER BY _ID", null); 
    if (sortorder == "intrate") 
    { 
     constantsCursor=db.getReadableDatabase().rawQuery("SELECT _ID, Debt, StartingAmount, CurrentAmount, InterestRate, DueDate, MinimumPayment "+ 
        "FROM tblDebts ORDER BY InterestRate DESC", null); 
    } 
    else if (sortorder == "balance") 
    { 
     constantsCursor=db.getReadableDatabase().rawQuery("SELECT _ID, Debt, StartingAmount, CurrentAmount, InterestRate, DueDate, MinimumPayment "+ 
        "FROM tblDebts ORDER BY CurrentAmount DESC", null); 
    } 
    else if (sortorder == "id") 
    { 
     constantsCursor=db.getReadableDatabase().rawQuery("SELECT _ID, Debt, StartingAmount, CurrentAmount, InterestRate, DueDate, MinimumPayment "+ 
        "FROM tblDebts ORDER BY _ID", null); 
    } 

    adapter1=new ImgCursorAdapter(this, 
      R.layout.debt_row, constantsCursor, 
      new String[] {DbAdapter.KEY_DEBT, 
      DbAdapter.KEY_STARTINGAMOUNT}, 
      new int[] {R.id.toptext, R.id.bottomtext}); 
    debtlist.setAdapter(adapter1); 
    DbAdapter debtDbAdapter = new DbAdapter(this); 
    debtDbAdapter.open(); 
    updateTotalProgress(); 
    Cursor cursor = debtDbAdapter.queueAll(); 
    startManagingCursor(cursor); 

}

내 응용 프로그램을 실행하면, 나는 내 onResume 코드에 130 줄을 가리키는 nullpointer 예외를 참조 DDMS를 찾고 FC를 얻을 :

@Override 
    public void onResume() { 
    super.onResume(); 
    ((BaseAdapter) adapter1).notifyDataSetChanged(); 
    constantsCursor.requery(); 
    debtlist.setAdapter(adapter1); 
    updateTotalProgress(); 
    } 

해당 라인은 constanstCursor.requery()입니다. 하나. 내 기본 설정 xml에서 "id"로 기본값을 설정했지만 그게 문제라고 생각하지 않습니다. 또한 onResume 코드에서 constanstCursor를 설정하기 위해 동일한 코드를 넣으려고했지만 기본적으로 강제로 어댑터를 다시 만들고 목록에 할당하려고했지만 동일한 NullPointer 오류가 발생했습니다.

환경 설정에 따라 정렬 순서를 선택하는 방법에 뭔가 빠졌습니까?

<string-array name="sortArray"> 
    <item>Highest Interest Rate</item> 
    <item>Highest Balance</item> 
    <item>No Sort</item> 
</string-array> 
<string-array name="sortValues"> 
    <item>intrate</item> 
    <item>balance</item> 
    <item>id</item> 
</string-array> 
+0

어쨌든 FC 란 무엇입니까? –

+0

강제 닫기 : 버그로 인해 종료됩니다. –

답변

1

이러한 if-condition 중 어느 것도 만족하지 않으므로 constantsCursor는 결코 초기화되지 않습니다. 문자열은 객체이므로이 방법으로 == 연산자와 비교할 수 없으므로 (토론 in this post 참조) 모든 조건이 거짓으로 평가됩니다. 대신 동등성을 테스트하려면 Object.equals(other_object)을 사용하십시오 (예 : else if (sortorder.equals("id"))).

또한 Cursor.requery()은 더 이상 사용되지 않습니다. 커서를 닫은 후에 close()를 호출하고 나중에 다른 커서를 얻는 것이 더 좋습니다. 어쩌면 커서를 반환하는 전용 메서드로 데이터베이스 코드를 이동하십시오. 필요한 경우 onCreate() 및 onResume()에서 private 메서드를 호출합니다.

+0

굉장합니다. 나는 이것을 시도 할 것이다. 나는 어떤 조건과도 매칭되지 않는다는 느낌이 들었지 만, 항상 ==는 "equals"와 동일했습니다. 다시 감사합니다. –

+0

고마워요. –

관련 문제