2011-07-14 16 views
11

iPhone uygulamamda, ABRecordRef numaralı bir belirli bir kişiye başvuru olarak hizmet vermek üzere Contact adlı bir sınıf var.Verileri NSUserDefaults'a Kaydetme

Bu kişilerin gruplarını NSUserDefaults'da depolamam gerekiyor, ancak Contact özel bir sınıf olduğundan işler iyi çalışmıyor.

Bu durumda ne yapılması gerektiğine dair herhangi bir fikir var mı?

cevap

29

Özel bir sınıf için NSUserDefaults kullanamazsınız. belgelerden;

NSUserDefaults sınıfı, su baskını gibi ortak türlerini erişmek için kolaylık yöntemler sağlar, tamsayılar, gibi Boolean ve URL'ler iki katına çıkar. NSData, NSString, NSNumber, NSDate, NSArray veya NSDictionary A varsayılan nesne, yani, (örneklerini bir kombinasyonu koleksiyonları ya da ) bir örneği bir özelliği listesi olmalıdır. Herhangi bir başka türde bir nesneyi saklamak istiyorsanız, NSData'un örneğini oluşturmak için genellikle arşivlemelisiniz.

NSData'u kullanmayı deneyin. Örneğin, bir diziye özel nesneleri yüklemek için, size

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"]; 
if (dataRepresentingSavedArray != nil) 
{ 
     NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray]; 
     if (oldSavedArray != nil) 
       objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray]; 
     else 
       objectArray = [[NSMutableArray alloc] init]; 
} 

verileri arşivlemek için yapabileceğiniz, kullanımı:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"savedArray"]; 

Bu bütün iş bu kadar uzun özel nesne NSCoding protokolü ile uyumludur olarak olacak :

- (void)encodeWithCoder:(NSCoder *)coder; 
{ 
    [coder encodeObject:label forKey:@"label"]; 
    [coder encodeInteger:numberID forKey:@"numberID"]; 
} 

- (id)initWithCoder:(NSCoder *)coder; 
{ 
    self = [[CustomObject alloc] init]; 
    if (self != nil) 
    { 
     label = [coder decodeObjectForKey:@"label"]; 
     numberID = [coder decodeIntegerForKey:@"numberID"]; 
    } 
    return self; 
} 

ABRecord opak C tipi, bu yüzden Objective-C anlamında bir nesne değil. Yani onu genişletemezsiniz, üzerine kategori ekleyemezsiniz, mesaj gönderemezsiniz. Yapabileceğiniz tek şey, parametre olarak ABRecord Referansı ABRecord ile açıklanan işlevleri çağırmaktır.

Arkanı ABRecord tarafından başvurulan bilgileri saklamak edebilmek için iki şey yapabilirsiniz:

  1. ABRecord s idABRecordGetRecordID() tarafından alın. ABRecordID, int32_t olarak tanımlanmıştır, böylece onu bir NSInteger'a gönderebilir ve istediğiniz yere saklayabilirsiniz. Daha sonra kaydı ABAddressBookGetPersonWithRecordID() veya ABAddressBookGetGroupWithRecordID()'dan alabilirsiniz. Bununla birlikte, kayıt, kullanıcı veya başka bir uygulama tarafından değiştirilebilir veya hatta silinebilir. Kayıttaki tüm değerleri standart bir NSObject alt sınıfına kopyalayın ve kaydetmek için yukarıda açıklandığı gibi NSCoding kullanın.Bu durumda, elbette, kullanıcının yapabileceği kayıtlara değişiklik veya eklemelerden yararlanamazsınız. ABRecordRef bir const void * olabilir, bu yüzden NSUserDefaults depolamak görünmektedir

+0

Ancak ABRecordRef'i kodlayamıyorum, çünkü bu nesne bir nesne değildir. – CodeGuy

+0

doğru, hepsini yaptım. ama ABRecordRef – CodeGuy

+0

@ reising1'i nasıl kodlarım? – PengOne

1

, sen NSData onu sarmak için vardır: NSData *d = [[NSData alloc] initWithBytes:thePointer length:sizeof(ABRecordRef)];.

+0

evet, ama bir ABRecordRef'i nasıl saklayabilirim, çünkü görünüşe göre bir nesne değil – CodeGuy

+0

En azından ne olduğunu biliyor musun? nesne, yapı, taban türü? –

2

Eh, Apple's recommendation kayıt tanımlayıcı, adı ve soyadı saklamaktır. Daha sonra, kişiyi adres defterinden tanımlayıcı ile almayı deneyebilirsiniz ve kayıt bulunamazsa veya doğru kişi değilse, ad ve soyadına göre almayı deneyin (çünkü kayıt tanımlayıcıları kaynağınızın kaynağına bağlı olarak değişebilir). adres defteri verileri.

Bu, verileri neden sakladığınıza bağlı olarak, istediğiniz gibi olabilir veya olmayabilir. Ancak, bu üç değeri bir NSDictionary'a kolayca koyabilirsiniz ve sözlüğü NSUserDefaults'a yazabilirsiniz.

0

Sen aslında kolayca NSString olarak kullanılabilir CFStringRef olduğu vCard temsili mümkün dönüşüm kullanarak saklayabilir.