2016-01-05 12 views
8

मेरे पास एक प्रोजेक्ट है जहां मुझे एक fetch अनुरोध करने की आवश्यकता है जो कोर डेटा इकाई की सबसे हाल की 'अपडेटेड' तिथि प्राप्त करे। जब मैं वास्तव में अपनी क्वेरी द्वारा दिए गए परिणामों की जांच करता हूं, हालांकि मैं कुछ अजीब व्यवहार देख रहा हूं। 'सही' परिणाम के अतिरिक्त, जिसमें तारीखों में एक खाली शब्दकोश वस्तु भी शामिल है। अंतर्निहित डेटा कैसा दिखता है इस पर ध्यान दिए बिना, यह हर बार होता है। यहां तक ​​कि अजनबी, अगर मैं एक्सकोड में एसक्यूएल लॉगिंग चालू करता हूं और SQL क्वेरी के खिलाफ लॉग क्वेरी निष्पादित करता हूं तो यह कोई अतिरिक्त प्रविष्टियों के साथ सही परिणाम उत्पन्न करता है। मुझे पूरा यकीन नहीं है कि मैं यहां क्या गलत कर रहा हूं, किसी भी मदद की सराहना की जाएगी।स्विफ्ट फ़ेच अनुरोध परिणाम में खाली आइटम लौट रहा है

समारोह है कि बनाता है और क्वेरी निष्पादित करता है:

func queryForContactDate(context:NSManagedObjectContext) -> AnyObject? 
{ 

    var expressionDescriptions = [AnyObject](); 

    let expressionDescription = NSExpressionDescription() 

    // Name the column 
    expressionDescription.name = "maxUpdated" 
    // Use an expression to specify what aggregate action we want to take and 
    // on which column. In this case max on the update_at column 
    expressionDescription.expression = NSExpression(format: "@max.updated_at") 
    // Specify the return type we expect 
    expressionDescription.expressionResultType = .DateAttributeType 
    // Append the description to our array 
    expressionDescriptions.append(expressionDescription) 

    // Build out our fetch request the usual way 
    let request = NSFetchRequest(entityName: Contact.entityName()) 

    // Specify we want dictionaries to be returned 
    request.resultType = .DictionaryResultType 

    // Hand off our expression descriptions to the propertiesToFetch field. 
    request.propertiesToFetch = expressionDescriptions 

    // Our result is going to be an array of dictionaries. 
    var results:[[String:AnyObject]]? 

    // Perform the fetch. This is using Swfit 2, so we need a do/try/catch 
    do { 
     results = try context.executeFetchRequest(request) as? [[String:AnyObject]] 
    } catch _ { 
     // If it fails, ensure the array is nil 
     results = nil 
    } 

    return results![0]; 
} 

अगर मैं अंत में एक ब्रेकपाइंट रख दिया और बाहर परिणाम यह पैदा करता प्रिंट:

Printing description of results: 
▿ Optional([[:], ["maxUpdated": 2015-12-30 20:05:31 +0000]]) 
    ▿ Some : 2 elements 
    - [0] : 0 elements 
    ▿ [1] : 1 elements 
     ▿ [0] : 2 elements 
     - .0 : "maxUpdated" 
     - .1 : 2015-12-30 20:05:31 +0000 
+0

क्या आप context.executeFetchRequest (अनुरोध) के साथ प्रिंट कर सकते हैं बिना कलाकार के? यह संभव है कि आप ऐसा कुछ कर रहे हैं जो वास्तव में नहीं है [[स्ट्रिंग: AnyObject]]। विशेष रूप से एपीआई के कोनों में जो ओबीजेसी को स्विफ्ट पर पोर्ट किया जा रहा है, वहां कुछ अजीब चीजें हैं जो शब्दकोश/सरणी – tbondwilkinson

+0

के साथ चलती हैं मुझे संदेह है कि आप सही रास्ते पर हैं लेकिन प्रिंट विशेष रूप से प्रबुद्ध नहीं था। यहां मुझे यह मिला है: [{ }, { maxUpdated = "2015-12-30 20:05:31 +0000"; }] – pbuchheit

+0

फिर मैं fetch विधि में ब्रेकपॉइंट डालूंगा और इसे वापस ढूंढूंगा और देख सकता हूं कि अनुरोध कहां उत्पन्न होता है/जब उस खाली शब्दकोश को वहां जाता है – tbondwilkinson

उत्तर

1

पारंपरिक कोर डाटा रास्ता पाने के लिए एक अधिकतम या न्यूनतम आइटम 1 की फ़्रेम सीमा से पूछताछ करना है और उस कुंजी को सॉर्ट करना है। इस ऑब्जेक्टिव-सी कोड में के रूप में:

+ (NSFetchRequest *) requestForStatusWithMaxID { 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName: kAMStatusEntity]; 

    NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey: kAMTwID ascending:NO]; 

    request.sortDescriptors = @[sd]; 
    request.fetchLimit = 1; 

    return request; 

} // +requestForStatusWithMaxID 

यह काफी अपने updated_at संपत्ति के लिए ऊपर संशोधित करने के लिए आसान होगा।

+0

हां, इस तरह से लाने के लिए संभव है, लेकिन प्रदर्शन को भुगतना होगा क्योंकि अंतर्निहित तालिका का आकार बड़ा हो जाता है। इसके अलावा, अगर मैं एसयूएम जैसे अन्य कुल कार्यों को आजमाता हूं तो मैं वही व्यवहार देख रहा हूं। बस सॉर्टिंग और पहला परिणाम लेने से उन लोगों की मदद नहीं होगी। – pbuchheit

+0

ऊपर सूचीबद्ध आपके समेत एक इंडेक्स के बिना कोई भी क्वेरी, तालिका बढ़ने के साथ-साथ समस्याओं को स्केल कर रही है। आपकी टेबल कितनी बड़ी है? 100, 1,000, 10,000, 1 एम पंक्तियां? यदि यह बड़ा है, तो आपको दोनों क्वेरी शैलियों के लिए एक अनुक्रमणिका की आवश्यकता है। – adonoho

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