마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

DB쿼리를 입력받아서 SimpleCursorAdapter로 출력도중 에러.

0 추천
ase 2: // SELECT * 일때
	
	adapt = new SimpleCursorAdapter(
	this,
	android.R.layout.simple_list_item_2,
	c,
	new String[] {"name","age"},
	new int[] {android.R.id.text1,android.R.id.text2}
	);
	setListAdapter(adapt);
	if (db != null) {
		db.close();
	}
	break;
case 3:		//SELECT 가 하나일때
	adapt = new SimpleCursorAdapter(
	this,
	android.R.layout.simple_list_item_1,
	c,
	new String[] {"name"},
	new int[] {android.R.id.text1}
	);
	setListAdapter(adapt);
	if (db != null) {
		db.close();
	}
	break;

쿼리를 입력받아서 출력해주는 코드를 짜고있는데요.

DB필드는 _id , name ,age 가 있어요.

case2 (SELECT * ) 로 출력을하면 잘되거든요? 

Ex) SELECT * FROM people

그런데 case3 (SELECT name)을 이용해서 출력을 하면 바로 오류가 발생하네요.  

Ex) SELECT name FROM people

10-21 21:41:28.542: E/AndroidRuntime(722): FATAL EXCEPTION: main
10-21 21:41:28.542: E/AndroidRuntime(722): java.lang.IllegalStateException: Could not execute method of the activity
10-21 21:41:28.542: E/AndroidRuntime(722): at android.view.View$1.onClick(View.java:2072)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.view.View.performClick(View.java:2408)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.view.View$PerformClick.run(View.java:8816)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.os.Handler.handleCallback(Handler.java:587)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.os.Handler.dispatchMessage(Handler.java:92)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.os.Looper.loop(Looper.java:123)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.app.ActivityThread.main(ActivityThread.java:4627)
10-21 21:41:28.542: E/AndroidRuntime(722): at java.lang.reflect.Method.invokeNative(Native Method)
10-21 21:41:28.542: E/AndroidRuntime(722): at java.lang.reflect.Method.invoke(Method.java:521)
10-21 21:41:28.542: E/AndroidRuntime(722): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-21 21:41:28.542: E/AndroidRuntime(722): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-21 21:41:28.542: E/AndroidRuntime(722): at dalvik.system.NativeStart.main(Native Method)
10-21 21:41:28.542: E/AndroidRuntime(722): Caused by: java.lang.reflect.InvocationTargetException
10-21 21:41:28.542: E/AndroidRuntime(722): at vr.ex4.db.SqlAct.onClickButton(SqlAct.java:117)
10-21 21:41:28.542: E/AndroidRuntime(722): at java.lang.reflect.Method.invokeNative(Native Method)
10-21 21:41:28.542: E/AndroidRuntime(722): at java.lang.reflect.Method.invoke(Method.java:521)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.view.View$1.onClick(View.java:2067)
10-21 21:41:28.542: E/AndroidRuntime(722): ... 11 more
10-21 21:41:28.542: E/AndroidRuntime(722): Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
10-21 21:41:28.542: E/AndroidRuntime(722): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.support.v4.widget.CursorAdapter.init(CursorAdapter.java:174)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.support.v4.widget.CursorAdapter.<init>(CursorAdapter.java:122)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.support.v4.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:54)
10-21 21:41:28.542: E/AndroidRuntime(722): at android.support.v4.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:63)
10-21 21:41:28.542: E/AndroidRuntime(722): ... 15 more
 
이렇게 나오는데요.
 
오류 내용중에 하나를 보니  _id가 없다고 하더라구요. 데이터베이스에는 (_id ,name ,age 가 있음)
 
도대체 어떻게 고쳐야될지 감이 안잡히네요 ㅠㅠ 혹시 도움좀 주실수 있으신분 계신가요?
grrukun (120 포인트) 님이 2013년 10월 22일 질문
혹시 커서 쿼리할 때 projection 에 null이 아닌 name, age만 넣어주신건 아닌가요?
Cursor c = db.rawQuery(tx.getText().toString()+";", null);
이게 커서쿼리부분인데 이거말씀하시는건가요 ㅠ
로우쿼리는 쿼리문이 세미콜론으로 끝나면 안됩니다.
http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html 참조

아마도 이때문에 커서가 정상적으로 만들어지지 않은거 같네요.
tx.getText().toString() 이게 근데 sql 구문 맞나요?
네네 위에 글적은것처럼 sql문을 받아서 바로 tostring시켜요.
그런데 세미콜론으로끝나면 안된다고 하셨는데
edittext에 SELECT * FROM people만 입력하고 바로 tostring +세미콜론으로 똑같이 들어가는데 그건 출력이 잘되더라구요 ㅠ
일단 세미콜론이 들어가면 안된다라는건 해당 메소드 레퍼런스 문서상의 내용이기 때문에 준수하셔야 할거 같고요. 위에 쿼리가 성공했다고 모든 경우에 다 성공한다고 보장은 못할거 같네요. 혹시 해당 오류가 발생할 때 입력한 쿼리문도 올려 주실 수 있나요?
SELECT name FROM people 이렇게 입력을했구요 그걸
Cursor c = db.rawQuery(tx.getText().toString()+";", null);
tx.getText().toString()<--이걸로 스트링화 시켜서 넣어요.
세미콜론 말씀하셔서 빼고 넣어봤는데도 계속 오류가 나오네요 ㅠ
소스코드도 올려드릴가요 다?
select name from people 로 쿼리하시면 _id는 커서에 포함되지 않습니다. 따라서 _id가 없다는 에러가 발생하는 거고요.
select _id, name from people로 쿼리해보시기 바랍니다.

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...