2010-12-28 14 views
7

का उपयोग कर जटिल कच्चे प्रश्नों करने का सुरुचिपूर्ण तरह से मैं एक ContentProvider का उपयोग अपने आवेदन के डेटाबेस के साथ बात करने के लिए और मैं एक समस्या का एक सा में चल रहा हूँ।एक ContentProvider

मेरे पास एक प्रश्न है जो थोड़ा जटिल है। यह इस तरह दिखता है:

String sql = 
    "select " + 
    " tblHistory._id _id, " + 
    " tblHistory.item item, " + 
    " tblHistory.updated_on updated_on, " + 
    " (select _id from tblList " + 
     "where tblList.item = tblHistory.item) list_id, " + 
    " 1 priority, " + 
    "from " + 
    " tblHistory " + 
    "where " + 
    " tblHistory.status <> 'STATE_DELETING' and " + selection + " " + 
    "union " + 
    "select " + 
    " tblSearch._id _id, " + 
    " tblSearch.item item, " + 
    " -1 updated_on, " + 
    " (select _id from tblList " + 
     "where tblList.item = tblSearch.product_name) list_id, " + 
    " 2 priority, " + 
    "from " + 
    " tblSearch " + 
    "where " + 
    " not exists (select * from tblHistory " + 
     "where tblHistory.item = tblSearch.product_name) " + 
    "order by " + 
    " priority, _id asc"; 

    c = mDb.rawQuery(sql, null); 

चुनाव है:

String where = "tblHistory.user_id=" 
       + Integer.toString(intUserId) 
       + " and tblHistory.item like '%" 
       + strSearch + "%'"; 

मेरे समस्या मेरी उप प्रश्नों है। मुझे एक बाधा है जो मुझे जोड़ने की ज़रूरत है, लेकिन विधि को पाइप के नीचे उस बाधा को पाने का कोई अच्छा तरीका नहीं है। मुझे उप-प्रश्नों पर सही user_id का उपयोग करने की आवश्यकता है।

इस बिंदु पर, मुझे लगता है कि मैं 2 विकल्प हैं:

1) बाहर पार्स चयन से user_id सबस्ट्रिंग।

2) विधि को "user_id = " + Integer.toString(intUserId) पारित करने के लिए एक हैक के रूप में selectionArgs का प्रयोग करें।

कोई अन्य विचार?

मुझे ध्यान रखना चाहिए कि जब मैं कुछ भी हैक-आईश नहीं कर रहा हूं, तो मैंने अपना ContentProvider निजी बनाया है क्योंकि इसका उद्देश्य केवल मेरे आवेदन द्वारा उपयोग किया जाना है; तो अगर मुझे बिल्कुल करना है, तो मैं कर सकता हूं।

+1

खुद पर एक एहसान और उपयोग '" "+ intUserId' बजाय' Integer.toString (intUserId) की 'क्या है। : पी –

+0

http://stackoverflow.com/a/6548733/633187 देखें। क्या इससे आपके सवाल का जवाब मिलता है? – jcwenger

+1

एंड्रयू, एलेक्स की टिप्पणी का विस्तार करने के लिए (यह है एक छोटा सा विषय से हटकर और अपने वास्तविक समस्या का समाधान नहीं करता है): जावा में स्ट्रिंग्स को ints परिवर्तित करने की सबसे कारगर तरीका Integer.toString उपयोग कर रहा है, लेकिन यदि आप करने जा रहे हैं एक स्ट्रिंग के साथ परिणाम को श्रेणीबद्ध, तो आप सिर्फ लिख सकते हैं: स्ट्रिंग जहां = "tblHistory.user_id =" + intUserId + "और tblHistory.item '% + strSearch +"% की तरह "'"; –

उत्तर

2

जब इस तरह जटिल प्रश्न के साथ काम कर, एक बिल्डर वर्ग काम आ सकते हैं। यह आपको स्ट्रिंग में परिवर्तित करने से बचाता है, उम्मीद है कि इससे आपकी मदद मिलती है।

public class SqlQueryBuilder { 

private static final String SELECT = "SELECT"; 

private static final String COMA = " , "; 

private static final String WHERE = " where "; 

private static final String EQUALS = " = "; 

private static final String NOT_EQUALS = " != "; 

private static final String FROM = " FROM "; 

private final StringBuilder mStrBuilder = new StringBuilder(); 

public void init() { 
    mStrBuilder.setLength(0); 
} 

public SqlQueryBuilder select(Object ...columns) { 
    mStrBuilder.append(SELECT); 
    for(Object column:columns) { 
     mStrBuilder.append(column); 
     mStrBuilder.append(COMA); 
    } 
    return this; 
} 

public SqlQueryBuilder where(Object conditionVar) { 
    mStrBuilder.append(WHERE); 
    mStrBuilder.append(conditionVar); 
    return this; 
} 


public SqlQueryBuilder equalsVal(Object equalsVal) { 
    mStrBuilder.append(EQUALS); 
    mStrBuilder.append(equalsVal); 
    return this; 
} 

public SqlQueryBuilder notEqualsVal(Object notEqualsVal) { 
    mStrBuilder.append(NOT_EQUALS); 
    mStrBuilder.append(notEqualsVal); 
    return this; 
} 

public SqlQueryBuilder from(Object from) { 
    mStrBuilder.append(FROM); 
    mStrBuilder.append(from); 
    return this; 
} 

public String build() { 
    final String sqlQuery = mStrBuilder.toString(); 
    init(); 
    return sqlQuery; 
} 

}

उपयोग जैसा नीचे

{ 

    SqlQueryBuilder sqlQueryBuilder = new SqlQueryBuilder(); 

    String innerQuery = sqlQueryBuilder.select("_id").from("tblList") 
      .where("tblList.item").equalsVal("tblHistory.item").build(); 

    String query = sqlQueryBuilder.select("tblHistory._id _id", 
      "tblHistory.item", "tblHistory.updated_on updated_on", 
      innerQuery + " list_id", "1 priority").build(); 

} 
संबंधित मुद्दे