Android - Cursor

Android 2016.01.15 23:26 posted by TechNote.kr


Database cursor


우선 cursor의 의미를 명확히할 필요가 있다. 우리가 흔히 아는 cursor는 컴퓨터 화면에 깜빡거리는 막대기가 아니던가.


영어사전에 cursor를 찾아 보아도 그냥 한글로 커서라고만 나온다. 그래서 dictionary.com에 찾아보니 정의가 아래와 같다.


noun

1.

Computers. a movable, sometimes blinking, symbol that indicates the position on a CRT or other type of display where the next character entered from the keyboard will appear, or where user action is needed, as in the correction of an erroneous character already displayed.


대충 해석해 보면 화면상에 위치를 나타내는 symbol 정도로 정리할 수 있겠다.


그렇다면 Database cursor는 database상에서 위치를 나타내는 symbol정도로 생각하면 되겠다.


wikipedia에 보면 다음과 같이 database cursor에 대해 정의가 되어 있다. 


데이터베이스 커서는 일련의 데이터에 순차적으로 액세스할 때 검색 및 "현재 위치"를 포함하는 데이터 요소이다.


실제 코드 구현을 보면 다음과 같다.


db = this.getReadableDatabase();

Cusur c = db.query("memo", new String[] {"_id","title","body","done"}, null, null, null, null, null);

이런식으로 db.query를 날려서 결과를 받아오면 Cursor 객체로 return이 되는데 이 Cursor 객체가 결과물을 가리키고 있다.


여기서 중요한 부분이 가리키고 있다는 것인데, 결과물을 저장하고 있는게 아니라 가리키고 있다는 것이다.

developer.android.com에 정의된 android.database.Cursor를 보아도 비슷한 설명이다.


This interface provides random read-write access to the result set returned by a database query.


query 결과물에 임의로 접근할 수 있는 interface를 제공한다.



SQLiteOpenHelper.close()와 Cursor.close()


Garbage Collector의 경우 보통 사용하지 않는 객체들을 정리하지만 Cursor의 경우는 정리하지 않는다고 한다. 이에 close로 잘 닫아주어야 한다.


SQLiteOpenHelper의 경우도 close해 주어야 사용하던 database를 close할 수 있는데, 

여기서 주의해야 할 점이 Cursor의 동작이 마무리되지 않은 상태에서 SQLiteOpenHelper.close를 통해 닫아 버리면 Exception이 발생해 버린다.


database close에 대해서 좀 찾아봤는데, Cursor만 잘 close해주면 되고, database는 close안해줘도 자동으로 close된다는 글이 보이기도 하고 database close에 대해서는 아직 명확하지 않다.

그리고, Cursor를 관리하기 위해 startManagingCursor, CursorLoader를 사용하기도 한다는데 다음에 알아보자.