2016-01-05 15 views
8

Bir Çekirdek Veri varlığının en son 'güncellenmiş' tarihini alan bir getirme isteği yapmam gereken bir projem var. Sorguladığım sonuçları gerçekten incelediğimde, oldukça garip davranışlar görüyorum. Tarih içeren 'doğru' sonuca ek olarak, sonuçlar ayrıca boş bir sözlük öğesi içerir. Bu, temel verilerin neye benzediğine bakmaksızın her seferinde gerçekleşir. Hatta yabancı, xcode'da sql logging'i açıp sqllite db'ye karşı kaydedilen sorguyu çalıştırırsam, ekstra giriş yapmadan doğru sonucu verir. Burada yanlış yaptığımdan emin değilim, herhangi bir yardım takdir edilecektir.Swift Fetch İsteğinde Boş Öğe Geri Döndürme Sonuçları

oluşturur ve sorguyu yürütür işlevi: almak için

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 ile baskı yapabilir misiniz (istek) cast olmadan? Aslında [[String: AnyObject]] olmayan bir şey yayınlamanız mümkündür. Özellikle, API'nin Swift'e taşınan objelerinin köşelerinde, sözlükler/dizilerle devam eden bazı garip şeyler var. – tbondwilkinson

+0

Doğru yolda olduğunuzu sanıyorum ama baskı özellikle aydınlatıcı değildi. İşte sahip olduğum şey: [{ }, { maxUpdated = "2015-12-30 20:05:31 +0000"; }] – pbuchheit

+0

O zaman getirme yöntemine bir kesme noktası koyup geri izler ve isteğin nereden kaynaklandığını/o boş sözlüğe ne zaman ulaştığını görürüm. – tbondwilkinson

cevap

1

geleneksel Çekirdek Veri yolu: Ben sonunda bir kesme noktası koymak ve ürettiği sonuçların çıktısını Eğer

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]; 
} 

Maks veya dk öğesi, 1 alma sınırıyla sorgulamak ve bu anahtarı sıralamaktır. Bu Objective-C kodunda gibi:

+ (NSFetchRequest *) requestForStatusWithMaxID { 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName: kAMStatusEntity]; 

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

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

    return request; 

} // +requestForStatusWithMaxID 

sizin updated_at özelliği için yukarıdaki değiştirmek oldukça basit olacaktır.

+0

Evet, bu şekilde getirme yapmak mümkündür, ancak alttaki tablonun boyutu büyüdükçe performans düşecektir. Ayrıca, SUM gibi diğer birleştirilmiş işlevleri denediğimde de aynı davranışı görüyorum. Sadece ilk sonucu sıralamak ve almak bunlara yardımcı olmayacaktır. – pbuchheit

+0

Yukarıda listelenenler de dahil olmak üzere, endeks içermeyen tüm sorgularda, tablo büyüdükçe ölçekleme sorunları vardır. Masan ne kadar büyük? 100, 1.000, 10.000, 1 milyon satır mı? Büyükse, her iki sorgu stili için de bir dizine ihtiyacınız vardır. – adonoho

İlgili konular