Android 애플 리케이션의 데이터 저장 방법의 하나 "SQLite"사용 레코드 검색 편
Android 데이터베이스 "SQLite"의 사용법은?
이번에는 다음 문서의 속편입니다.
Android 애플 리케이션의 데이터 저장 방법의 하나 "SQLite"사용 SQLiteOpenHelper 편
Android 애플 리케이션의 데이터 저장 방법의 하나 "SQLite"사용 행 추가 · 갱신 · 삭제 편
지금까지 데이터베이스 열기와 레코드 추가 · 갱신 · 삭제에 대한 설명을했습니다.
이번에는 SQL에서 말하는 select 문장 레코드 검색에 대해 설명하고 있습니다.
통틀어는 말할 수 없습 니다만, 데이터베이스를 다룰에서 코드적으로 가장 구현하는 장면이 많은 것이이 select 않을까 생각합니다.
앞으로의 예제 코드는 " Android 애플 리케이션의 데이터 저장 방법의 하나 "SQLite"사용 SQLiteOpenHelper 편 에 게재하고있는 샘플 코드에서 이미 SQLiteDatabase 형식 인스턴스를 생성하는 것으로합니다.
변수 이름은 sdb합니다.
또한 테이블 정의는 테이블 이름은 "bookmarklist"에서 _id 열과 bookmark 열 2 열이 존재하는 것으로합니다.
※ _id 열에 대해서는 별기 " Android 애플 리케이션에서 사용하는 SQLite 테이블 작성시주의 사항 "을 참조하십시오.
레코드 검색을 한 후 검색 결과는 Cursor라는 인스턴스로 반환되고 있습니다.
이 Cursor 인스턴스를 얻는 방법은 크게 2 가지가 있으므로, 우선은 그 방법을 소개합니다.
SQLiteDatabase.query () 사용
우선 첫 번째의 SQLiteDatabase.query () 메소드의 사용법을 설명합니다.
final String [] columns = new String [] { "_id", "bookmark"};
String where = "bookmark like?";
String param = "% android %";
Cursor c =
sdb.query ( "bookmarklist"columns, where, new String [] {param}
null, null, "_id desc", "10");
SQLiteDatabase.query () 메서드의 첫 번째 인수는 테이블 이름입니다.
두 번째 인수는 가져올 열 이름 (컬럼 이름, 필드 이름)의 배열을 지정합니다.
제 3 인수 제 4 인수는 검색할 레코드의 조건을 지정합니다.
이번에는 bookmark 열의 문자열에 "android"라는 문구가 포함된 문자열이라는 조건으로하고 있습니다.
다섯 번째 인수는 group by 절을 지정합니다.
여섯 번째 인수는 Having 절을 지정합니다.
일곱 번째 인수는 order by 절을 지정합니다.
여덟째 인수는 limit 절 (검색할 레코드의 상한선)을 지정합니다.
사용하지 않는 경우는, null를 지정합니다.
이번 작업을 SQL 문장으로 표현하면 다음과 같습니다.
select _id, bookmark
from bookmarklist
where bookmark like '% android %'
order by _id desc
limit 10
Cursor 개체의 조작 방법은 후술합니다.
SQLiteDatabase.rawQuery () 사용
그럼 다음은 rawQuery () 메소드의 사용법을 설명합니다.
rawQuery () 메소드는 말 그대로 삶의 쿼리를 사용합니다.
String sqlstr = "select _id, bookmark"+
"from bookmarklist"+
"where bookmark like '% android %'"+
"order by _id desc"+
"limit 10";
Cursor c = sdb.rawQuery (sqlstr);
SQLiteDatabase.rawQuery () 메소드의 인수는 SQL 문장입니다.
개인적으로, 방금전의 query () 메서드보다 사용하기 쉽다고 생각 합니다만, 어떻습니까.
query () 메소드는 어떤 인자에 어떤 매개 변수를 주면 좋았 던가? 하면 일일이 확인하지 않으면 안되는 것 입니다만, rawQuery () 메소드는 명확합니다.
게다가, inner join과 left outer join 등을 사용하여 여러 테이블을 조인시키는 SQL이라면,이 rawQuery ()이 좋습니다.
좋아 좋아 할지도 모르지만, Android 애플 리케이션에서 사용되는 정도의 SQL 어렵다 고는 생각되지 않기 때문에 원시 SQL을 실행할 수 rawQuery ()이 가독도 좋은 것이 아닐까 생각합니다.
어디 까지나 개인적으로지만.
덧붙여서, rawQuery ()는 select 문장 전용입니다.
insert, update, delete 등, execSQL () 메서드를 사용합니다.
자세한 내용은 아래를 참조하십시오.
Android 애플 리케이션의 데이터 저장 방법의 하나 "SQLite"사용 행 추가 · 갱신 · 삭제 편
그럼 아래는 Cursor 인스턴스의 기본적인 사용법을 알아보겠습니다.
Cursor 인스턴스 사용
기본적으로 검색된 레코드를 처음부터 끝까지 루프로 돌려 무언가를한다는 용법이 될 것으로 생각합니다.
예를 들어 다음과 같은 예제 코드를 보라.
/ / query () 또는 rawQuery () 실행
Cursor c = - 생략 -;
if (c.moveToFirst ()) {
do {
long id = c.getLong (c.getColumnIndex ( "_id"));
String bookmark = c.getString (c.getColumnIndex ( "bookmark"));
System.out.println (id + ":"+ bookmark);
} while (c.moveToNext ());
}
단순히 취득한 모든 레코드를 표준 출력으로 출력하고있다 뿐이지만, 위에서 본 봅시다.
먼저 첫 번째 if 문에서 Cursor. moveToFirst ()를 실행하고 있군요.
이것은 검색 결과에 대한 커서를 맨 위로 이동 시킨다는 의미입니다.
성공하면 true가 반환됩니다.
그 처리는이 moveToFirst ()가 성공하면 실행한다는 것입니다.
덧붙여서, 검색된 레코드 건수가 0 건이었다하면 moveToFirst ()의 반환값은 false입니다.
다음은 후에 판정 루프 처리가되어 있네요.
Cursor. moveToNext ()는 커서를 다음 레코드로 이동 시킨다는 의미입니다.
이 moveToNext ()의 반환값은 다음 레코드가 있으면 커서를 이동시키고 true를 리턴합니다.
다음 레코드가 없으면 false를 반환합니다.
덧붙여서, 후 판정하고있는 것은 가장 첫 번째 레코드의 처리를하기 때문입니다.
레코드의 내용을 추출 프로세스는 각각의 열 유형에 따라 getLong (), getString (), getInt () 등을 사용합니다.
인수는 컬럼의 인덱스로, 요점은 무엇 번째 열에있는가? 숫자입니다.
이것은 열 이름을 인수하여 getColumnIndex ()에서 얻을 수 있습니다.
정말 장황한 사양입니다 · · ·.
왜 인수 열 이름을 지정해도 취할 수 있도록 오버로드 해주 었어? 라고 말하고 싶지만.
물론 인덱스를 알고있다면 방법을 사용하지 않고 베타 쓰고도 좋지만, 도중에 테이블 정의를 바꾸어 버리고 제대로 작동하도록, 이번과 같이 구현하여 두는 것이 좋은 것이 않을까라고 생각합니다.
JSP와 서블릿에서 DB를 사용하여 시스템의 경험이 있으면 어렵지 않게 이해할 수 있을까 생각합니다.
그러나 휴대 내장 데이터베이스를 다루는 건 지금까지 없었다는 생각 합니다만, 대략 이해할 수있었습니다까요?











