>

cursor 를 사용하여 행을 읽는 sqlite 메소드를 읽는 동안  커서에서 데이터를 검색 한 후 메모리 누수를 피하기 위해 커서를 닫아야한다는 것을 알고 있지만 cursor.getCount() 아래 코드에서 의심의 여지가 있습니다.  커서를 닫은 후 호출됩니까? 커서를 닫은 후 데이터를 검색하는 것이 잘못되지 않습니까? 누구나이 의심을 해결할 수 있습니까? 미리 감사드립니다 !!

public int getContactsCount() {
    String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    cursor.close();
    // return count
    return cursor.getCount();
}

  • 답변 # 1

    SQLiteCursor#close() 의 소스 코드는 다음과 같습니다. :

    @Override
     public void close() {
         super.close();
         synchronized (this) {
             mQuery.close();
             mDriver.cursorClosed();
         }
     }
    
    

    여기에 SQLiteCursor#getCount() 의 소스 코드가 있습니다. :

     @Override
      public int getCount() {
          if (mCount == NO_COUNT) {
              fillWindow(0);
          }
          return mCount;
    }
    
    

    보시다시피, 행 개수는 변수 mCount 에 저장된 것으로 보입니다 커서를 닫을 때이 값이 재설정되지 않습니다. 불필요하게 상태를 정리할 필요가 없기 때문에 효율성 측면에서 의미가있을 수 있습니다.

    커서를 닫은 후 카운트를 얻는 것이 효과가있는 것으로 보이지만, Javadoc은 그러한 보장을하지 않으므로이 값에 의존해서는 안되며,이 동작은 나중에 변경 될 수 있습니다.

  • 답변 # 2

    Cursor.getCount ()

    여기서 쿼리에서 getcount () 메소드가 커서의 행 수를 반환하고 커서에서 데이터를 검색하지 않기 때문에 코드가 잘못되었다고 생각합니다.

관련 자료

  • 이전 python - 이 방법으로 numpy 배열을 조작하는 방법은 무엇입니까?
  • 다음 ruby - 사용자는 레일에 오류 메시지가 있어야합니다