SQLiteDatabase.query 메서드


121

SQLiteDatabase의 쿼리 메서드를 사용하고 있습니다. 쿼리 방법은 어떻게 사용합니까?

나는 이것을 시도했다 :

Cursor cursor = sqLiteDatabase.query(
    tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);

tableColumns- 열 매개 변수는 다음과 같이 구성됩니다.

String[] columns = new String[]{KEY_ID, KEY_CONTENT};

모든 필드를 가져와야하는 경우 열 매개 변수를 어떻게 구성해야합니다. 모든 필드 이름을 문자열 배열에 포함해야합니까?

쿼리 방법을 올바르게 사용하려면 어떻게해야합니까?


1
같은 간단한 방법보십시오
이므 란라나

나는 그 방법을 알고있다. 하지만 rawQuery 대신 쿼리 메서드를 구현하는 방법을 배우려고합니다.
sree_iphonedev

답변:


244

tableColumns

  • null 모든 열에 대해 SELECT * FROM ...
  • new String[] { "column1", "column2", ... }특정 컬럼에 대해 같이 SELECT column1, column2 FROM ...- 당신은 또한 여기에 복잡한 식을 넣을 수 있습니다 :
    new String[] { "(SELECT max(column1) FROM table1) AS max" }당신의 이름 열 줄 것 max의 최대 값을 들고column1

whereClause

  • WHERE그 키워드없이 뒤에 넣은 부분 , 예 :"column1 > 5"
  • ?동적 인 것을 포함해야합니다 . 예 : "column1=?"-> 참조whereArgs

whereArgs

  • 각을 채우는 내용 지정 ?whereClause나타나는 순서를

다른 사람

  • 단지 같은 whereClause키워드 후 또는 문 null당신이 그것을 사용하지 않는 경우.

String[] tableColumns = new String[] {
    "column1",
    "(SELECT max(column1) FROM table2) AS max"
};
String whereClause = "column1 = ? OR column1 = ?";
String[] whereArgs = new String[] {
    "value1",
    "value2"
};
String orderBy = "column1";
Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs,
        null, null, orderBy);

// since we have a named column we can do
int idx = c.getColumnIndex("max");

다음 원시 쿼리와 동일합니다.

String queryString =
    "SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
    "WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);

Where / Bind -Args 버전을 사용하면 자동으로 이스케이프 된 값을 얻고 입력 데이터에 '.

안전하지 않음 : String whereClause = "column1='" + value + "'";
안전 :String whereClause = "column1=?";

값에 '문이 포함되어 있으면 문이 중단되고 예외가 발생하거나 의도하지 않은 일이 발생하기 때문입니다. 예를 들어 value = "XYZ'; DROP TABLE table1;--"문이 두 문과 주석이되기 때문에 테이블을 삭제할 수도 있습니다.

SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'

args 버전을 사용하면 XYZ'; DROP TABLE table1;--로 이스케이프되고 'XYZ''; DROP TABLE table1;--'값으로 만 처리됩니다. 을해도 '나쁜 일을하는 것은 아니다 아직도 사람들이 자신의 이름에 그것을 가지고 또는 텍스트에 사용하는 것이 매우 일반적이며, 파일 이름, 암호 등 그래서 항상 인수 버전을 사용합니다. ( 그래도 int직접 빌드 및 기타 프리미티브 는 괜찮습니다 whereClause)


제한 / 오프셋은이 그룹에서 어디에 속합니까? 데? 주문?
Lion789 2014 년

3
이 여러 버전이 @ Lion789있는 limit매개 변수, 예를 들어 developer.android.com/reference/android/database/sqlite/... 당신은 예를 결국 모든 단순한 텍스트 연결을 넣을 수 있습니다, 그래서 "some_column LIMIT 10"으로 orderBy그리고 작업 여전히 것
zapl

2 개의 테이블을 결합 할 수있는 옵션이 있습니까?
비제이 Kumbhoje

2
@VijayKumbhoje 예 table1 CROSS JOIN table2를 들어 테이블 이름으로 넣을 수 있어야합니다 . 하지만 rawquery를 살펴볼 지점이 있습니다. stackoverflow.com/q/10598137/995891
zapl

3
@VijayKumbhoje 당신이 더 편하게 느끼거나 결국 더 깨끗해 보입니다. query방법은 단순히 같은 몇 가지 키워드를 추가 SELECT하고 FROM인수에 (소스 참조) 다음을 rawQuery결과 쿼리 문자열. 쿼리가의 사용 가능한 인수에 잘 맞지 않으면 query쿼리 문자열을 직접 작성하십시오.
zapl

21

이것은 향후 시청자를위한 빠른 참조를위한보다 일반적인 답변입니다.

SQLiteDatabase db = helper.getReadableDatabase();

String table = "table2";
String[] columns = {"column1", "column3"};
String selection = "column3 =?";
String[] selectionArgs = {"apple"};
String groupBy = null;
String having = null;
String orderBy = "column3 DESC";
String limit = "10";

Cursor cursor = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

문서설명

  • table 문자열 : 쿼리를 컴파일 할 테이블 이름입니다.
  • columns 문자열 : 반환 할 열 목록입니다. null을 전달하면 모든 열이 반환되므로 사용하지 않을 저장소에서 데이터를 읽지 않도록하는 것이 좋습니다.
  • selection 문자열 : 반환 할 행을 선언하는 필터이며 SQL WHERE 절로 형식이 지정됩니다 (WHERE 자체 제외). null을 전달하면 주어진 테이블의 모든 행이 반환됩니다.
  • selectionArgs 문자열 : 선택 항목에? s를 포함 할 수 있습니다. 선택 항목에 나타나는 순서대로 selectionArgs의 값으로 대체됩니다. 값은 문자열로 바인딩됩니다.
  • groupBy 문자열 : 행 그룹화 방법을 선언하는 필터로, SQL GROUP BY 절로 형식이 지정됩니다 (GROUP BY 자체 제외). null을 전달하면 행이 그룹화되지 않습니다.
  • having 문자열 : 필터는 행 그룹화가 사용되는 경우 커서에 포함 할 행 그룹을 선언하며, SQL HAVING 절로 형식화됩니다 (HAVING 자체 제외). 널을 전달하면 모든 행 그룹이 포함되며 행 그룹화를 사용하지 않을 때 필요합니다.
  • orderBy 문자열 : SQL ORDER BY 절로 형식화 된 행을 정렬하는 방법 (ORDER BY 자체 제외). null을 전달하면 정렬되지 않은 기본 정렬 순서가 사용됩니다.
  • limit 문자열 : LIMIT 절로 형식이 지정된 쿼리에서 반환되는 행 수를 제한합니다. null을 전달하면 LIMIT 절이 없음을 나타냅니다.

16

Where 절과 인수는 함께 작동하여 SQL 쿼리의 WHERE 문을 형성합니다. 그러니 표현을 찾고 있다고

WHERE Column1 = 'value1' AND Column2 = 'value2'

그런 다음 whereClause 및 whereArgs는 다음과 같습니다.

String whereClause = "Column1 =? AND Column2 =?";
String[] whereArgs = new String[]{"value1", "value2"};

모든 테이블 열을 선택하려면 tableColumns에 전달 된 null 문자열로 충분하다고 생각합니다.


묶지 않는 ?에서 '의이 '필요한 경우 자동으로 추가됩니다
zapl

1

SQL 쿼리가 다음과 같으면

SELECT col-1, col-2 FROM tableName WHERE col-1=apple,col-2=mango
GROUPBY col-3 HAVING Count(col-4) > 5  ORDERBY col-2 DESC LIMIT 15;

그런 다음 query () 메서드의 경우 다음과 같이 할 수 있습니다.

String table = "tableName";
String[] columns = {"col-1", "col-2"};
String selection = "col-1 =? AND col-2=?";       
String[] selectionArgs = {"apple","mango"};
String groupBy =col-3;
String having =" COUNT(col-4) > 5";
String orderBy = "col-2 DESC";
String limit = "15";

query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy, limit);

0
db.query(
        TABLE_NAME,
        new String[] { TABLE_ROW_ID, TABLE_ROW_ONE, TABLE_ROW_TWO },
        TABLE_ROW_ID + "=" + rowID,
        null, null, null, null, null
);

TABLE_ROW_ID + "=" + rowID, 여기 =where절이 있습니다. 모든 값을 선택하려면 모든 열 이름을 제공해야합니다.

or you can use a raw query like this 
db.rawQuery("SELECT * FROM permissions_table WHERE name = 'Comics' ", null);

그리고 여기 데이터베이스에 대한 좋은 튜토리얼 이 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.