2009-03-15 12 views
10

NSObject'ten miras alan özel bir nesnem var. 3 üyesi var - iki yüzer ve bir NSDate.Kalıcı Özel Nesneler

Uygulamam, bu nesnelerin etrafında tek tek bir dizi içeren bir diziye sahip olacak ve koşular arasında devam etmem gerekiyor. Bunu nasıl başarabilirim?

Bir SQLite db kullanmayı düşündüm, ama şimdiye kadar yaptığım tek sorgu select * olacağından biraz fazla sıkışık olduğunu düşünüyorum.

İdeal bir dünyada bir xml plist dosyası kullanmak istiyorum. Bunu özel nesnemle yapsam bile emin değilim. Bir dizi özellik listesi nesnesi olduğunu biliyorum ve NSArray bunun altında geliyor, ancak writeToFile:atomically: yalnızca özellik listesi nesneleriyle çalışır.

Herhangi bir düşünce takdir edilecektir, teşekkürler!

cevap

21

NSCoding tam olarak ne istediğinizi yapacağız. Apple belgelerinde okumayı öneririm, ancak kullanımı oldukça kolay olduğunu düşündüm. Sınıfınız (ve herhangi bir çocuk sınıfının) NSCoding protokolünü uygulamalıdır ve nesnelerinize -encodeWithCoder: ve -initWithCoder: yöntemlerini eklemeniz gerekir. Ortak çerçeve sınıflarının çoğu zaten NSCoding uygular.

sınıfınız için kodu şöyle görünecektir: Bu önerilir

-(void) encodeWithCoder: (NSCoder*) coder { 
    [coder encodeInteger: versionValue forKey: versionKey]; 
    [coder encodeObject: myStuff forKey: myStuffKey]; 
} 

-(id) initWithCoder: (NSCoder*) coder { 
    self = [super init]; 
    if (! self) return nil; 
    myStuff = [[coder decodeObjectForKey: myStuffKey] retain]; 
    return self; 
} 

size gelecekteki sürümlerinde Arşiv formatına değişiklikleri yönetmek için esneklik sağlamak için kodlama yaparken bir sürüm numarası ekleyin. En üst düzey nesne bir olduğundan

+(MyArchive*) newFromFile: (NSString*) path 
      orWithMyStuff: (MyStuff*) myStuff 
{ 
    NSData *data = [[NSData alloc] initWithContentsOfFile: path]; 
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData: data]; 
    MyArchive *myArchive = [unarchiver decodeObjectForKey: myArchiveKey]; 
    [unarchiver finishDecoding]; 

    if (myArchive) { 
    [myArchive retain]; 
    } else { 
    myArchive = [[MyArchive alloc] initWithStuff: myStuff; 
    } 
    [unarchiver release]; 
    [data release]; 
    return myArchive; 
} 

: arşivden veya yeni bir nesne oluşturmak için

-(void) archiveToFile: (NSString*) path { 
    NSMutableData *data = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData: data]; 
    [archiver encodeObject: self forKey: myArchiveKey]; 
    [archiver finishEncoding]; 
    [archiver release]; 
    [data writeToFile: path atomically: YES]; 
    [data release]; 
} 

ve bir tane daha: Benim sınıfımda

, benim nesneyi arşivlemek için bir kolaylık yöntemi eklendi NSArray, sizin durumunuz için son iki yöntemi değiştirmeniz gerekir, ancak çoğu ortak kod aynı olacaktır.

+0

Ve bu hoş bir plist üretecek? NSData'nın yazılmasının sadece bir veri tabanı üretmeyeceği ve bir plist oluşturmayacağı izleniminin altındaydım. – Jasarien

+0

Bu, bir NSCoding arşivi oluşturur — nesnelerinizin korunmuş kopyalarını içeren bir dosya, bir nib dosyası gibi (ancak bunu düzenlemek için Interface Builder kullanamazsınız). Belgelerinizdeki "Kakao için Arşivler ve Seri Numarası Programlama Rehberi" açıklayacaktır. –

+0

Varsayılan olarak ikili bir plist'e arşivlenir, ancak isterseniz bunu bir xml plist'e dönüştürebilirsiniz. Ne yazık ki sınıf ve işaretçi meta verilerinin yanı sıra nesne verilerinizi içerdiği için gerçekten okunabilir değildir. –

0

Nesnelerin bir alt kümesini almak istiyorsanız, SQLite en iyi seçiminizdir.

Değilse, bu, plist biçimi ile NSCoding arasında bir seçimdir. plist, özel nesnelerinizi plist-friendly'e dönüştürmenizi gerektirir ve sonra plist'i nesnelerinize geri dönüştürür, ancak NSCoding kafanızı sarmak için biraz daha zordur ve elle kolayca düzenlenemez (veya incelenemez) .

+0

Alt kümeleri kullanmıyorum. Sadece tam listeye ihtiyacım var. Bir nesneyi plist dostu yapmak nasıl dönüştürür? Bir dizi özellik listesi nesnesi olduğu benim anlayışımdı. Nesnem uygun olmayan bir şeyden yapılmış değil ... – Jasarien