2011-08-23 19 views
34

में उपयोग करने के लिए ORMLite के साथ एंड्रॉइड कर्सर क्या कोई तरीका है, क्वेरी के लिए कर्सर कैसे प्राप्त करें, जिसे मैं ORMLite दाओ ऑब्जेक्ट के साथ संसाधित कर रहा हूं?कर्सर एडाप्टर

उत्तर

64

ORMLite अब next(), previous(), moveRelative(offset) ... CloseableIterator class पर तरीकों का समर्थन करता है। इससे आपको इच्छानुसार अंतर्निहित Cursor ऑब्जेक्ट को स्थानांतरित करने की अनुमति मिलनी चाहिए।

यह भी निम्नलिखित डीएओ कर्सर तरीकों का समर्थन करता है:

  • dao.mapSelectStarRow(databaseResults) वापसी select * के लिए एक क्वेरी से डेटाबेस परिणाम से नवीनतम पंक्ति। इसके साथ आप कर्सर स्थान बदल सकते हैं (उदाहरण के लिए) और फिर वर्तमान ऑब्जेक्ट प्राप्त करें।
  • dao.getSelectStarRowMapper() एक नक्शा प्रदान करता है जिसका उपयोग आप दाओ के बाहर ऑब्जेक्ट को मैप करने के लिए कर सकते हैं।

आप ORMLite के साथ अपने स्वयं क्वेरी का निर्माण कर रहे हैं, तो आप QueryBuilder वस्तु का उपयोग करें। queryBuilder.prepare() एक PreparedQuery देता है जिसका उपयोग डीएओ में विभिन्न विधियों द्वारा किया जाता है। आप dao.iterator(preparedQuery) पर कॉल कर सकते हैं जो CloseableIterator लौटाएगा जिसका उपयोग परिणामों के माध्यम से करने के लिए किया जाता है। DatabaseResults कक्षा तक पहुंच प्राप्त करने के लिए iterator.getRawResults() है। एंड्रॉइड के तहत, इसे AndroidDatabaseResults पर डाला जा सकता है जिसमें एंड्रॉइड Cursor वापस करने के लिए getCursor() विधि है।

कुछ निम्न कोड की तरह:

// build your query 
QueryBuilder<Foo, String> qb = fooDao.queryBuilder(); 
qb.where()...; 
// when you are done, prepare your query and build an iterator 
CloseableIterator<Foo> iterator = dao.iterator(qb.prepare()); 
try { 
    // get the raw results which can be cast under Android 
    AndroidDatabaseResults results = 
     (AndroidDatabaseResults)iterator.getRawResults(); 
    Cursor cursor = results.getRawCursor(); 
    ... 
} finally { 
    iterator.closeQuietly(); 
} 

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

+1

मैं डेटाबेस कनेक्शन कैसे प्राप्त कर सकता हूं? – max4ever

+0

मैंने यह जवाब दिखाने के लिए यह बदल दिया है कि डेटाबेस कनेक्शन की आवश्यकता के बिना इसे कैसे किया जा सकता है। – Gray

+0

@Gray कर्सर का उपयोग करके list_item दृश्यों को बढ़ाने का सबसे अच्छा तरीका क्या है? साथ ही, 'OrmLiteBaseListActivity' के साथ उपयोग करने के लिए सबसे अच्छी बात 'कर्सर एडाप्टर' है? – theblang

0

यदि आपका मतलब दाओ विधियों को बनाने के लिए getHelper() विधि है, तो आपको केवल OrmLiteBaseActivity<YourDBHelper> से उत्तराधिकारी होना होगा और आप इसे कॉल कर सकते हैं। यह इस तरह sth दिखेगा:

public class YourClass extends OrmLiteBaseActivity<YourDBHelper> { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    ... 
    getHelper().getDao().queryForAll(); 
    ... 
    } 
} 

आप कर्सर मतलब तो डेटाबेस कार्रवाई को संभालने के लिए: मुझे नहीं लगता कि आप इसे तक पहुँच सकते हैं है! लेकिन मुझे समझ में नहीं आता कि आपको इसकी आवश्यकता क्यों है। ORMLite कर्सर के लगभग सभी कार्यों है। तो आपको इसके लिए क्या चाहिए?

+4

मुझे इसके बारे में पता है, लेकिन मुझे कर्सर एडाप्टर में इसका उपयोग करने की आवश्यकता है। – sealskej

0

क्या आपने this पोस्ट से ग्रे की कुछ सलाह दी है? वह बताता है कि आप कॉलम को दूसरे नाम के रूप में कैसे चुन सकते हैं, जैसे आईडी को _id के रूप में चुनें।

+0

चूंकि आप अपने कॉलम को ऑर्मेलाइट में नाम दे सकते हैं, मुझे लगता है कि क्यों नहीं चुनने के बजाय उन्हें सिर्फ _id नाम दें? – AgentKnopf

+0

निश्चित रूप से, आप कर सकते हैं, लेकिन एक उदाहरण में जहां उनका नाम बदलना एक विकल्प नहीं है, आप बस "as" के एसक्यूएल सिंटैक्स का उपयोग करते हैं;) –

+0

सच है कि, आपको एक बिंदु मिला है :) – AgentKnopf

0

यदि आप एक गतिविधि में हैं और QueryBuilder के साथ गड़बड़ नहीं करना चाहते हैं तो निम्न को जाने दें, जो कि उतना ही प्रभावी है।

Cursor cursor = getHelper().getReadableDatabase().query(tableName, projection, selection, selectionArgs, groupBy, having, sortOrder) 
संबंधित मुद्दे