복붙노트

[SQL] 안드로이드 cursor.moveToNext ()?

SQL

안드로이드 cursor.moveToNext ()?

나는 하나 개의 긴 텍스트보기 및 / 또는 문자열로 테이블의 모든 열을 조회하려합니다. 나는이 일을하는 올바른 방법으로하지 않을 수 있습니다 알고 있지만 나는이 작업을 수행 할 수 있습니다. 만약 내가 잘못 올바른 나, 나는 움직임 다음은 행의 다음 열을 얻을 것이라는 인상했다 :

Cursor c = db.get();
if(c.moveToFirst){
do{
string = c.getString(0);
}while(c.moveToNext);

나는 이것이 첫 번째 열을 얻을 대신 내가 처음 열과 첫 번째 행을 얻을 모든 내용을 표시 할 것이라고 생각했다. 내가 뭘 잘못하고 있죠? ListView를 사용하지 않고이 정보를 얻을 수있는 더 나은 또는 실제 방법이 있나요?

해결법

  1. ==============================

    1.관심있는 I 신뢰를 다음과 같이 명확하게하기 위해 완벽한 예로들 수 있습니다. 코드 주석 우리가 본질적으로 데이터베이스 행 다음 열을 반복 바와 같이 데이터베이스에 따라 데이터의 테이블을 형성한다.

    관심있는 I 신뢰를 다음과 같이 명확하게하기 위해 완벽한 예로들 수 있습니다. 코드 주석 우리가 본질적으로 데이터베이스 행 다음 열을 반복 바와 같이 데이터베이스에 따라 데이터의 테이블을 형성한다.

        Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null,
                null);
    
        //if the cursor isnt null we will essentially iterate over rows and then columns
        //to form a table of data as per database.
        if (cursor != null) {
    
            //more to the first row
            cursor.moveToFirst();
    
            //iterate over rows
            for (int i = 0; i < cursor.getCount(); i++) {
    
                //iterate over the columns
                for(int j = 0; j < cursor.getColumnNames().length; j++){ 
    
                    //append the column value to the string builder and delimit by a pipe symbol
                    stringBuilder.append(cursor.getString(j) + "|"); 
                }
                //add a new line carriage return
                stringBuilder.append("\n");
    
                //move to the next row
                cursor.moveToNext();
            }
            //close the cursor
            cursor.close();
        }
    
  2. ==============================

    2.간단한 사용은 다음과 같습니다

    간단한 사용은 다음과 같습니다

    Cursor cursor = db.query(...);
    while (cursor.moveToNext()) {
        ...
    }
    

    당신은 당신이 이미 어떤 위치에 도달 한 후 처음부터 반복하는 시작해야 할 때 moveToFirst이 사용됩니다.

    이 필요한 경우를 제외하고 cursor.getCount ()를 사용하지 마십시오. 그리고 getCount를 통해 루프를 사용하지 않습니다 ().

    getCount 비싼 - 그것은 그들을 계산하는 많은 레코드 반복 할. 이 저장된 변수를 반환하지 않습니다. 이 두 번째 통화에 대한 몇 가지 캐싱 할 수 있지만,이 계산 될 때까지 첫 번째 호출은 답을 알고하지 않습니다.

    쿼리 1000 개 행이 일치하는 경우, 커서는 실제로 첫 번째 행이 있습니다. 각 moveToNext 검색 및 발견 다음 경기. getCount는 모두 1000 찾아야 왜으로 반복 모든 것을 당신이 10 필요하다면? 왜 반복 처리를 두 번?

    쿼리가 인덱스를 사용하지 않는 경우에도, getCount도 느려질 수 있습니다 - getCount는 쿼리가 100 왜 루프 20000 대신 10000의 일치에도 불구하고 만 개 기록을 통해 갈 수있다?

  3. ==============================

    3.이 같은 커서를 통해 내 루프를하고있는 중이 야 :

    이 같은 커서를 통해 내 루프를하고있는 중이 야 :

        cursor.moveToFirst();
        while(!cursor.isAfterLast()) {
    
                cursor.getString(cursor.getColumnIndex("column_name"));
    
            cursor.moveToNext();
        }
    

    그것은 항상 작동합니다. 이 모든 행의 열 "COLUMN_NAME"의 값을 검색합니다. 귀하의 실수는 행이 아닌 컬럼을 통해 당신이 루프입니다. 열 반복 할

    cursor.moveToFirst();    
        for(int i = 0; i < cursor.getColumnNames().length; i++){
            cursor.getString(i);
        }
    

    즉 의지의 첫 번째 행의 열 위에 루프와 각 열의 값을 검색한다.

  4. ==============================

    4.다음 행으로 커서를 이동 moveToNext. 존재하는 경우와 c.getString (0)는 항상 당신에게 첫 번째 열을 줄 것이다. 나는 당신이 당신의 루프 내에서 이와 비슷한 일을해야한다고 생각

    다음 행으로 커서를 이동 moveToNext. 존재하는 경우와 c.getString (0)는 항상 당신에게 첫 번째 열을 줄 것이다. 나는 당신이 당신의 루프 내에서 이와 비슷한 일을해야한다고 생각

    int index = c.getColumnIndex("Column_Name");
    string = c.getString(index);
    
  5. ==============================

    5.cursor.moveToFirst ()이 첫 번째 행에 커서를 이동시킨다. 당신이 6 열이 있음을 알고, 당신은 모든 열을 포함하는 하나의 문자열을 원하는 경우, 다음을 시도해보십시오.

    cursor.moveToFirst ()이 첫 번째 행에 커서를 이동시킨다. 당신이 6 열이 있음을 알고, 당신은 모든 열을 포함하는 하나의 문자열을 원하는 경우, 다음을 시도해보십시오.

    c.moveToFirst();
    StringBuilder stringBuilder = new StringBuilder();
    for(int i = 0; i < 6; i++){
       stringBuilder.append(c.getString(i));
    }
    
    // to return the string, you would do stringBuilder.toString();
    
  6. from https://stackoverflow.com/questions/10081631/android-cursor-movetonext by cc-by-sa and MIT license