2011-11-21 11 views
7

मैं ORMLite उपयोग कर रहा हूँ, टेबल RecentSearch साथ:ORMLite क्वेरी, एंड्रॉयड

@DatabaseTable(tableName = LocalStorageConfig.SQL_RECENTS_TABLE_NAME) 
public class RecentSearch { 

    @DatabaseField 
    public String search_text; 
    public static String SQL_SEARCH_FIELD = "search_text"; 

    @DatabaseField 
    public String location_text; 
    public static String SQL_LOCATION_FIELD = "location_text"; 

    @DatabaseField 
    public Date creation_date = new Date(); 
    public static String SQL_CREATION_DATE_FIELD = "creation_date"; 

यह लगभग हर समय काम कर रहा है, लेकिन जब मैं युक्त एक स्ट्रिंग के साथ मामला की खोज एक 'है, तो ऐसा लगता है एक समस्या होने के लिए। क्या आप जानते हैं कि इसे कैसे हल करें? मैं जो खोज रहा था उसे नहीं मिला।

यहाँ से हटाने के लिए मेरी समारोह है हाल ही में एक

public boolean deleteRecent(RecentSearch search) { 
    try { 
     Dao<RecentSearch, Integer> recentsDao = recentsSqlManager.getRecentsDao(); 
     DeleteBuilder<RecentSearch, Integer> deleteBuilder = recentsDao.deleteBuilder(); 

     deleteBuilder.where().eq(RecentSearch.SQL_SEARCH_FIELD, search.getSearch_text()).and().eq(RecentSearch.SQL_LOCATION_FIELD, search.location_text); 
     recentsDao.delete(deleteBuilder.prepare()); 
     return true; 
    } catch (Exception e) { 
     Log.e(TAG, "Database exception", e); 
     return false; 
    } 
} 

यहाँ है अपवाद मैं मिलता है:

java.sql.SQLException: Problems executing Android statement: DELETE FROM `recent_searches` WHERE (`search_text` = '' AND `location_text` = 'Villefranche-d'Allier, Allier') 
    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) 
    at com.j256.ormlite.android.AndroidCompiledStatement.runUpdate(AndroidCompiledStatement.java:66) 
    at com.j256.ormlite.stmt.StatementExecutor.delete(StatementExecutor.java:425) 
    at com.j256.ormlite.dao.BaseDaoImpl.delete(BaseDaoImpl.java:347) 
... 
Caused by: android.database.sqlite.SQLiteException: near "Allier": syntax error: , while compiling: DELETE FROM `recent_searches` WHERE (`search_text` = '' AND `location_text` = 'Villefranche-d'Allier, Allier') 
    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
    at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 
    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) 
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41) 
    at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149) 
+0

http://stackoverflow.com/questions/5280227/sql-exception-preparing-query-with-ormlite और http://stackoverflow.com/questions/6400782/ormlite-escape-string-method – Gray

उत्तर

20

ORMLite में, जब आप उद्धरण के साथ एक क्वेरी बनाने के लिए कोशिश कर रहे हैं, तो आप का उपयोग करना चाहिए SelectArg सुविधा जो SQL के साथ एक क्वेरी उत्पन्न करेगी? तर्क और फिर स्ट्रिंग को सीधे तैयार कथन में पास करें। यह विशेष पात्रों से बचने के साथ-साथ एसक्यूएल इंजेक्शन सुरक्षा मुद्दों से आपकी सुरक्षा के साथ किसी भी समस्या के आसपास हो जाता है। documentation on SelectArg देखें। के रूप में यह किसी भी उद्धरण से बच तो वे अवैध एसक्यूएल उत्पन्न नहीं है जब आपकी क्वेरी के लिए बाध्य

DeleteBuilder<RecentSearch, Integer> deleteBuilder = recentsDao.deleteBuilder(); 

// create our argument which uses a SQL ? 
SelectArg locationArg = new SelectArg(search.location_text); 
deleteBuilder.where().eq(RecentSearch.SQL_SEARCH_FIELD, search.getSearch_text()) 
    .and().eq(RecentSearch.SQL_LOCATION_FIELD, locationArg); 
recentsDao.delete(deleteBuilder.prepare()); 
... 
+0

पहले से संबंधित , आपकी स्पष्टीकरण के लिए धन्यवाद, हर बार मुझे ORMLite से संबंधित संदेह है, आपने पहले ही यहां जवाब दिया है। मैं सोच रहा था, क्या recentsDao.delete (deleteBuilder.prepare()) के बीच कोई अंतर है; और deleteBuilder.delete(); ? – AlvaroSantisteban

+1

कोई अलग @AlvaroSantisteban नहीं। .delete() बस इसे आसान बनाने के लिए एक कॉल है। यह javadocs में ऐसा कहता है: http://ormlite.com/javadoc/ormlite-core/com/j256/ormlite/stmt/DeleteBuilder.html#delete() – Gray

1

आप SelectArg वस्तु का उपयोग कर सकते हैं:

SelectArg साथ

, आप की तरह कुछ करना चाहते हैं।