2016-08-05 2 views
0

데이터베이스에서 레코드를 삭제하려고 할 때이 오류가 발생합니다. 여기에 로그를 보면 전체android.database.sqlite.SQLiteException : 근처 ";": 구문 오류 (코드 1) :

FATAL EXCEPTION: main 
                       Process: itp231.dba.nyp.com.bloommain, PID: 12274 
                       android.database.sqlite.SQLiteException: near ";": syntax error (code 1): , while compiling: DELETE FROM events WHERE id= ; 
                        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
                        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887) 
                        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498) 
                        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
                        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
                        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
                        at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674) 
                        at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1605) 
                        at itp231.dba.nyp.com.bloommain.EventInformationPage$1.onClick(EventInformationPage.java:135) 
                        at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:163) 
                        at android.os.Handler.dispatchMessage(Handler.java:102) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5417) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

에 오류가, 그것은 코드 (내 deleteRecord() 메소드의 라인에 저를 지시 - 당신이 사용할 수있는

private void deleteRecord() { 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 
    alertDialogBuilder.setMessage("Are you sure you want delete this person?"); 

    alertDialogBuilder.setPositiveButton("Yes", 
      new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        String id = editTextId.getText().toString().trim(); 

        String sql = "DELETE FROM events WHERE id= " + id + ";"; 
        db.execSQL(sql); 
        Toast.makeText(getApplicationContext(), "Record Deleted", Toast.LENGTH_LONG).show(); 
        c = db.rawQuery(SELECT_SQL,null); 
       } 
      }); 
+3

,있는 당신의 스택 추적을 참조하십시오. 'String id'는 비어 있습니다. 이것은'EditText'가 비어 있거나 공백을 가지고 있음을 의미합니다. –

+0

데이터베이스의 ID 유형은 무엇이며 또한 – Aditi

+0

값을 전달할 때 확실하지 않지만 Android Studio를 사용하는 경우 Instant Run 기능의 문제 일 수 있습니다. – ninjaxelite

답변

3

- 귀하의 ID는 빈 문자열이므로 SQL 명령에서 구문 분석 할 수 없습니다.
- 사용자 ID 필드가 TEXT (???) 인 경우 작은 따옴표로 묶어야합니다. 3
- SQL 명령의 경우, execSQL() 대신 rawQuery() 사용 - rawQuery()에만 작동 ... 쿼리 (SELECT)
4 - 그리고 ... 준비된 명령문 (또는 바인딩 매개 변수) 더 나은 선택입니다. 자리 표시 자 (?)는 순서에 따라 자동으로 바뀌며 따옴표는 더 이상 문제가되지 않습니다 (Android에서 처리합니다!).

+0

잘 정교합니다. –

+1

@IntelliJAmiya 감사합니다. –

+2

이 외에도 SQL 코드는 절대 작성하지 마십시오. 당신은 SQL 주입 공격에 대해 광범위하게 개방되어 있습니다. * 항상 바인드 변수를 사용하십시오.연결된 매개 변수로 쿼리를 작성하는 것은 무서운 실수입니다. –

1

prepared statements

SQLiteStatement stmt = db.compileStatement("DELETE FROM events WHERE id = ?"); 
stmt.bindString(1, id); 
stmt.execute(); 
+1

아무도 SQL 인젝션에 대해 들어 본 적이 없으며이 코드가 완전히 결함이있는 이유를 알고 있습니까? 너가 나가서 공부하지 않으면. 당신이 가지고 있다면, 왜 그에게 올바른 방법을 가르쳐주지 않는 거지? –

-1

SQL 구문 분석 또는 실행 중 오류가 발생했음을 나타내는 SQLite 예외.

너 대신에 " WHERE id= '" + id +"'";을 추가하십시오. + id +에는 값이 있고 은 여분의 공간이 없도록하십시오..

다음 깨끗한 다시 작성하고 기존 응용 프로그램을 제거하고 다시을 실행하십시오.

+3

또는 더 나은 아직 -이 같은 코드를 작성하지 마십시오. 바인드 변수를 사용하십시오. 이런 식으로 매개 변수를 설정하면 발생하기를 기다리는 SQL 삽입입니다. –

+1

@GabeSechan. 네, 사실입니다. 하지만 로컬 앱에서 해커 공격에 관심이 있습니까? 내 말은, 앱이 서버에서 실행되지 않는다면 (어쨌든 큰 데이터 용으로 SQLite를 사용하는 것은 매우 의심 스럽다.) 그러나 기기에서만 기회가 아무도 없지만 사용할 수는 있습니다. ;) –

-1

또한 Sugar ORM 라이브러리를 사용하여 DB 작업을 쉽게 수행 할 수 있습니다.

0

이 시도 ..

db.delete("events","id=?",new String[]{Integer.toString(id)}); 

first paramater -> will be table name from where the deletion of data need to de done. 
Second parameter -> Selection field in table.based on which field we are going to perform the deletion 
Third parameter -> specifies the value,to be compare it with second paramters field if it is matched,then the particular column will be deleted. 
관련 문제