2013-06-06 2 views
3

RSS 응용 프로그램을 열 때 기사가 내 database에 있는지 확인하고 싶습니다. 그것을 삭제 (또는 무시)하고 싶다면 db에 쓰지 않으십시오.android.database.sqlite.SQLiteException : near "...": 구문 오류 (코드 1)

내가이 같은 일을하려고되었습니다

  Cursor cursor = ourDatabase.rawQuery("select 1 from " 
        + DBHelper.DATABASE_TABLE + " where " + DBHelper.TITLE + "='" 
        + title + "'" + " AND " + DBHelper.DATE + "='" + date + "'", 
        new String[] {}); 
      if (cursor.moveToFirst()) { 
       boolean exists = (cursor.getCount() > 0); 
       cursor.close(); 
       return exists; 
      } else { 
    return false;  } 

     } 

을하지만 난이 오류를 얻을 :

06-06 16:01:11.341: E/AndroidRuntime(13867): Caused by: android.database.sqlite.SQLiteException: near "όσο": syntax error (code 1): , while compiling: select 1 from all_t where title='Ο ΦΟΒΟΣ και ο ΤΡΟΜΟΣ των διαδηλωτών!!! Αυτές οι γυναίκες είναι πιο σκληρές απ' όσο δείχνουν!' AND date='Wed, 05 Jun 2013 18:12:15' 

답변

10

이것은 selectionArgs를 사용하지 않는 전형적인 문제이며, 그것은 하나를 사용해야하는 이유 정확히 : 당신은 간단한 따옴표로 문자열을 인용하고 있지만 당신의 문자열에는 작은 따옴표가 들어 있으므로 SQLite는 실제로 끝나기 전에 문자열의 끝을 감지하고 나머지는 SQLite 키워드로 구문 분석하려고합니다.

올바른 해결책은 자신의 도피를 시도하는 것보다 selectionArgs을 사용하여 SQLite로 이스케이프를 남겨 두는 것입니다. 당신이 경우에, 그 것이다 : 당신이 당신의 쿼리에서 오히려 매번를 구성하는 것보다 일정을 만들 수 있기 때문에

Cursor cursor = ourDatabase.rawQuery("select 1 from " 
      + DBHelper.DATABASE_TABLE + " where " + DBHelper.TITLE + "=?" 
      + " AND " + DBHelper.DATE + "=?", 
      new String[] {title, date}); 

플러스, 그것은 청소기입니다.

+0

고마워요! –

+0

그래도 작동합니다, 가능하면 @WarrenFaith가 맞습니다. – njzk2

1

당신은 ' 문자를 탈출해야하거나 당신의 SQL을 나누기를.

near "όσο": syntax error (code 1): , while compiling: select 1 from all_t where title='Ο ΦΟΒΟΣ και ο ΤΡΟΜΟΣ των διαδηλωτών!!! Αυτές οι γυναίκες είναι πιο σκληρές απ' όσο δείχνουν!'

더 많은 정보 here.

아마 rawQuery에서 직접 문자열을 조작하는 대신 preparedStatement을 사용할 수 있습니까? 지금까지 주어진

How do I use prepared statements in SQlite in Android?

1

대답은 정확하지만, 당신은 매개 변수화 쿼리를 사용하여 오프 훨씬 더 좋을 것이다. 추가 작업이 필요 없습니다. 실제로 작은 따옴표를 이스케이프하는 것이 더 쉽습니다.

6

다른 선택의 여지가없는 경우 원시 쿼리를 사용하지 마십시오!

Cursor findEntry = db.query(TABLE, columns, DBHelper.TITLE + "=?", new String[] { title }, null, null, null); 

또는 여러 물건

Cursor findEntry = db.query((TABLE, columns, DBHelper.TITLE + "=? and " + DBHelper.DATE + "=?", new String[] { title, date}, null, null, null); 
+0

'select 1'은 (는) rawquery와 작동합니까? – njzk2

+0

내가 오류를 반환하는 제목없이 검사를하고 날짜 만 있으면 코드가 작동합니다 .. –

+0

그냥'select _id'를 사용하고'cursor.getCount()> 0'을 확인합니다. @menu_on_top 당신은'if (cursor! = null)'대신에'moveToFirst()'를 사용할 수 있습니다. – WarrenFaith

관련 문제