2016-04-01 33 views
0

Özgün verilere kalıcı olması gereken NSObject numaralı özel bir nesnem var (Data).Çekirdek Verileri doğru veriyi dönmüyor bazen

@interface Transaction (CoreDataProperties) 

@property (nonatomic) BOOL m_isUploaded; 
@property (nullable, nonatomic, retain) id m_transactionData; // this is the Data class, stored under Transformable 
@property (nonatomic) int64_t m_submitDateTimeEpochMilliseconds; 
@property (nullable, nonatomic, retain) NSString *m_uuid; 

@end 

Bir bağlam oluşturulan ve ana iş parçacığı üzerinde bağlamda ilgili her şeyi yaptılar: Dolayısıyla ben, böyle bir şey Data içerdiğini bir NSManagedObject (Transaction) oluşturuldu.

Data ürününü NSCoding ve NSCopying protokollerine uygun yaptım. Ayrıca Data'da kullanılan bazı özel sınıflar da NSCoding ile uyumlu hale getirilmiştir. Ben tamamen sadece insert yoksa

@interface Data : NSObject <NSCoding, NSCopying> 

@property (strong, nonatomic, nullable) HeldItem *m_heldItem; 
@property (strong, nonatomic, nullable) NSDecimalNumber *m_discountAmount; 
@property (strong, nonatomic, nonnull) NSMutableArray<Record *> *m_records; 
@property (strong, nonatomic, nonnull) NSString *m_transactionId; 
@property (nonatomic) CLLocationCoordinate2D m_location; 
@property (strong, nonatomic, nullable) NSString *m_status; 

- (void)encodeWithCoder:(nonnull NSCoder *)aCoder; 
- (nonnull id)initWithCoder:(nonnull NSCoder *)aDecoder; 

...lots of variables/methods here... 

@end 

, hiçbir sorunları (Ben encodeWithCoder: sırasında değişkenlere bakarak teyit) vardır:

Bu Data.h kısa özüdür. Ya da sadece okuyorsam, hiçbir sorun yok. Ben yeni Transaction (ve Data) kaydı ve aramayı eklemek olsaydı

Ancak/varolan rekor okuyup (Data) değiştirmek varolan rekor kurtardı almaz ve yeni kayıt çoğunlukla olduğunu boş (yeniymiş gibi). Bu sorun, rastgele adresinde gerçekleşir. Bu durumla karşılaşmadan önce 8 kez koşabilirim.

Nerede yanlış gittiğim hakkında bir fikrim var mı? Uzun zamandır takıldım.

// Some helper function in some manager 
- (Transaction * _Nonnull)getTransactionFromCoreDataWithId:(NSString * _Nonnull)dataId 
{ 
    NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:[Transaction entityName]]; 
    request.returnsObjectsAsFaults = NO; 

    NSError *error; 
    NSArray<Transaction *> *fetchedObjects = [self.m_coreDataStore.managedObjectContext executeFetchRequest:request error:&error]; 
    NSAssert(fetchedObjects != nil, @"Failed to execute %@: %@", request, error); 

    if(fetchedObjects == nil || fetchedObjects.count == 0) 
    { 
     // error 
     return nil; 
    } 

    for(Transaction *t in fetchedObjects) 
    { 
     Data *td = t.m_kmsTransactionData; 
     if([td.m_salesRecordId isEqualToString:salesRecordId]) 
     { 
      return t; 
     } 
    } 
return nil; 
} 
+0

yine ilk program mantığı kontrol ?sınıfınız neden NSManagedObject'ün bir alt sınıfı değil? "İşlem" işlemlerini "İşlem" haline getiriyor musunuz? – Wain

+0

"Verilerim" zaten "NSObject" olarak oluşturuldu ve "Veri" yi saklamak ve "Veri" ye yaptığım şeyi takip etmek için kaydetmem gerektiğinden, bunları depolamak için "İşlem" oluşturdum . Her şeyin sonunda biriktiriyorum. Kodu düzeltmeme izin ver. – CyberMew

+0

Başlatılan Argümanlar Altında CD hata ayıklama "-com.apple.CoreData.SQLDebug 1" etkinleştirin. CD'nin otomatik olarak nesnenizi paketlemek/açmak için NSKeyedArchiver'ı kullanıp kullanmadığını merak ediyorum. – Andy

cevap

0

Ben dönüştürülebilir özelliklere sahip bir çekirdek Veri cilvesi olduğunu düşünmüş ama değildi -

// Store the existing/new data into Core Data 
    Transaction *t = [MANAGER createTransaction]; 
    Data *data = [Data new]; 
    t.m_kmsTransactionData = data; 

    // ...some assigning stuffs to other variables... 

    // ========== if this whole section is omitted the newly created record saves fine ========= 
    Transaction *old = [MANAGER getTransactionFromCoreDataWithId:someOldDataIdString]; 
    // oldData sometimes is returning a blank object (i.e. booleans are no, objects are nil etc) 
    Data *oldData = [old.m_kmsTransactionData mutableCopy]; 

    oldData.m_status = @"old"; // testing to see if the old record gets updated 

    old.m_isUploaded = NO; 
    old.m_kmsTransactionData = [oldData copy]; 

    // This doesn't work because oldData.m_transactionId is nil 
    data.m_transactionId = [MANAGER generateNewTransactionIDBasedOn:oldData.m_transactionId]; 
    //=============================================== 

    // ... more assigning code here .... 

    // Save context 
    [MANAGER saveDatabase]; 

:

Bu

o bana sorunu vermek görünüyor parçasıdır.

ben veritabanı içinde zaten var olan bir id e m_salesRecordId atanan ben

// ...some assigning stuffs to other variables... 

oldu parçası. Bu nedenle, getTransactionFromCoreDataWithId: yöntemini kullanarak arama yaparken, yeni oluşturduğum nesneyi, daha önce yaptığım m_salesRecordId'u temel alarak döndürdü.

Neden bazen çalıştığını ve bazen işe yaramamış olduğu için getirilen sorgu sonuçlarının sıralanmadığı (sonuçların döndürülme sırasının her zaman sırayla olmadığını varsayardım), dolayısıyla hangisi kaydedildiyse ilk olarak, aranan nesne (ya yeni oluşturduğum boş nesne ya da zaten içinde olan gerçek nesne olabilir) olarak döndürülmüştür.

m_salesRecordId'un vidalamadan sonra nil olsa bile, nesnedeki değişkenlerin geri kalanı kaydedilemedi. Ama her şey planlandığı gibi çalıştığı için şimdi kazanacağım.

tl; dr: nereye kaydetmekte olduğunuz

İlgili konular