2011-01-11 3 views
0

나는 첫 번째 안드로이드 응용 프로그램을 만들고 SQLite 데이터베이스를 설정하고 작업하고 있습니다. 커서를 사용하여 일부 데이터를 검색하고 SimpleCursorAdapter를 사용하여 데이터를 목록으로 표시했습니다.단일 필드의 데이터를 SQLite 데이터베이스의 변수로 가져 오는 방법은 무엇입니까?

이제 을 찾고의 결과를 float 변수에 넣으십시오. 그러나 내가 온라인으로 찾은 모든 예제는 여러 행/열을 가진 대규모 검색을 처리 할 것으로 기대되는 것으로 보이며 모두 목록이나 배열에 적용되었습니다. 나는 하나의 필드의 내용을 변수로 가져 오는 방법을 알 수 없다.

내가 올바른 줄을 따라 있다고 생각하는 myVariable = cursor.getFloat(0)을 사용해 보았지만 그 중 하나라도 작동하지 못했습니다.

난 내 응용 프로그램을 실행할 때마다 null pointer exception 오류가 발생하지만, 나는 try catch 블록을 시도했지만 일반적으로이 모든 것을 처음 접했고 문제 해결에 성공하지 못했습니다. 그것은 쿼리 오타 (query typo)와 같은 간단한 것일 수 있습니다.

아래에 포함 된 약간의 코드를 포함 시키겠습니다. 그러나 일반적인 제안이나 특정 제안은 환영합니다. 시간을내어 주셔서 감사합니다.

public void Main(){ 

    //gets the rowId we put with the intent from Budget.java, sets a default value of -1 'incase. 
    selectedRowId = getIntent().getLongExtra("rowId", -1); 
    Cursor costCursor= FindBudgetForId(selectedRowId); 
    MyText(costCursor, selectedRowId); 

} 

public Cursor FindBudgetForId(long selectedRowId){ 

    SQLiteDatabase db = budgetData.getWritableDatabase(); 
    String rowBudgetQuery = "SELECT BUDGET_AMOUNT FROM CAT_BUD_TAB WHERE _ID="+ selectedRowId; 
    Cursor c = db.rawQuery(rowBudgetQuery,null); 
    startManagingCursor(c); 
    return c; 


} 

public void MyText(Cursor costCursor, long selectedRowId){  
    TextView whatDoText=(TextView)this.findViewById(R.id.keypad_text); 
    whatDoText.setText("row: " +(String.valueOf(selectedRowId))); 
    //set the current budget amount in the edit text box 
    retrievedAmount = costCursor.getFloat(3); 
    EditText inputHint=(EditText)this.findViewById(R.id.cost_input); 
    inputHint.setText((String.valueOf(retrievedAmount))); 

} 
+0

같은 데이터를 얻을 수 있습니다. 당신은 cursor.getFloat (0) –

+0

@king_nak를 사용해야합니다 : 물론 그 점을 지적 해 주셔서 감사합니다, 아직도 위선적 인 말로 표현할 수는 있지만 그다지 실수하지 마세요! – Holly

답변

4

나는 SqliteDatabase#rawQuery가 커서를 반환 할 때, 그것은 처음 첫 번째 결과 전에 위치되어 있다고 생각합니다. 따라서 실제로 결과 값을 읽으려면 (NullPointerExceptionExplosionDeath를 사용하지 않고) float을 얻기 전에 cursor.moveToFirst()으로 호출하십시오. 나는 전에 그것에 물렸다.

+0

오, 감사하지만 생각하기 전에 당신이 말하기 전에? 어떤 테이블을 다루고 싶은지를 말하지 않고 커서를 첫 번째 위치로 어떻게 움직일 수 있습니까? 어쨌든 조언을 주셔서 감사합니다, 전과 후에 그것을 해봤지만, 행운을 그래서 나는 문제가 어딘가에 있어야한다고 생각합니다. 어쨌든 고마워요. 당신이 말한 것을 계속 지킬 것입니다! – Holly

+0

아, 미안하지만 명확하지 않은 경우. 데이터베이스 ('rawQuery')에 대한 쿼리 후, 리턴 된 Cursor는 아무 것도 가리키지 않습니다 (첫 번째 결과 앞의 위치 - 예를 들어 -1 인덱스와 같습니다). 따라서'getFloat'를 호출하기 전에'moveToFirst()'를 호출 할 때 *를 사용합니다. 그게 도움이 되니? –

+0

안녕하세요, 그냥이 사실은 내 문제가 아니었다는 것을 언급해야한다고 생각했습니다. (내 sqliteopenhelper 클래스에 컨텍스트를 제대로 전달하지 못했지만 일단 그렇게했을 때 ...) 매우 유용하다고 밝혀졌습니다. 나는 커서를 뒤따라 오는 경계선 밖에서 처리하는 방법을 정확히 알고 있었기 때문에 감사합니다 !! – Holly

1

당신은 당신의 쿼리는 1 개 필드를 선택하고, 그래서 인덱스 (3) 범위를 벗어났습니다

Cursor c =//Query; 
    int numRows = c.getCount(); 
if (numRows > 0) 
    { 
    c.moveToFirst(); 
    While(numRows>0) // or for loop 
    { 
      String strName = c.getString(0); 
       Int i = c.getInt(1); 
       numRows--; 
    }  
    } 
관련 문제