iOSクラス要素の配列格納Sqlite(NSCodingの使用)

3532 ワード

今日はここでNSArrayストレージのデータベース処理の問題を記録します!Sqliteは配列形式で直接格納することはサポートされていないことはよく知られています!だから配列を扱うときはNSDataのモードに変換し、呼び出したときに変換します.
  • ストレージ変換:
  •     NSArray * arr = @[@"First", @"Second"];
        NSMutableData * mutableData = [[NSMutableData alloc] init];  // data
        for (NSString * str in arr) {
            NSString * strData = [str stringByAppendingString:@"-"];// , 
            NSData *temp =[strData dataUsingEncoding:NSASCIIStringEncoding]; //NSString -> NSData
            [mutableData appendData:temp];//data mutableData 
        }
    
    

    以上、1つの配列をMutableDataに変換することで、データベースストレージ操作が可能になります!取り出すときにそれを戻すのも簡単です.
        NSString * string01 = [[NSString alloc]initWithData:mutableData encoding:NSUTF8StringEncoding];//NSData -> NSString
        NSArray * array02 = [string01 componentsSeparatedByString:@"-"];// 
    

    前に私はずっとこのように操作して、私はまだ多くの人がこのように解決したと信じています!
    最近、swiftを書いている間に何気なくNSCodingに遭遇しました(詳しくは後述します)、関連ドキュメントを見ているうちに、もっと簡単な方法を見ました.
  • は、まず、文字列配列の記憶問題
  • を解決するためにアーカイブ解除可能である.
    // 
        NSData *data02 = [NSKeyedArchiver archivedDataWithRootObject:arr];// , 
    //    
        NSArray *array03 = [NSKeyedUnarchiver unarchiveObjectWithData:data02]; 
    
    

    1つのコードで問題を解決して、今前の方法がそんなに何度も変換されたことを見て、本当に面倒です!では、NSCodingはいつ使えますか.上記の配列の要素は文字列ですが、クラスであれば?みんなは自分でやってみることができて、結果はきっとできません.すべてのオリジナルクラスはNSCodingプロトコルを実装し、アーカイブ中にトランスコードを実装することでアーカイブが成功します.
  • API
  • //Encodes the receiver using a given archiver. (required)
    // decoder  An unarchiver object.
    - (void)encodeWithCoder:(NSCoder *)encoder
    
    //Returns an object initialized from data in a given unarchiver.(required)
    // decoder  An unarchiver object.
    - (id)initWithCoder:(NSCoder *)decoder
    
    

    NSCodingプロトコルには2つの方法しかなく,いずれもrequireの方法であり,1つは自分のクラスをトランスコードし,1つは変換されたコードをクラスオブジェクトにトランスコードする.次に、クラスを書いて実行可能かどうかを確認し、まずカスタムアニメーションクラスを書きます.
    @interface Animal : NSObject
    @property (nonatomic, retain) NSString *animalKind;
    @property (nonatomic, retain) NSString *animalWeight;
    
    -(Animal *)initWithKind:(NSString*) animalKind 
                   andWeight:(NSString *) animalWeight;
    @end
    

    はい.mファイルにおけるNSCodingプロトコルの実装
    @implementation Animal
    @synthesize animalKind = _animalKind, animalWeight = _animalWeight;
    // 
    -(Animal *)initWithKind:(NSString*) animalKind 
                   andWeight:(NSString *) animalWeight{
       self = [super init];
       if (self) {
           self.animalKind = animalKind;
           self.animalWeight = animalWeight;
        }
       return self;
    }
    // 
    -(void)encodeWithCoder:(NSCoder *)aCoder{
       [aCoder encodeObject:self.animalKind forKey:@"animalKind"];
       [aCoder encodeObject:self.animalWeight forKey:@"animalWeight"];
    }
    // , 
    -(id)initWithCoder:(NSCoder *)aDecoder{
       if (self = [super init]) {
           self.animalKind = [aDecoder decodeObjectForKey:@"animalKind"];
           self.animalWeight = [aDecoder decodeObjectForKey:@"animalWeight"];
        }
       return self;
    }
    
    @end
    
    

    カスタムAnimalアーカイブ変換の具体的な実装:
      Animal *dog = [[Animal alloc]initWithKind:@"Dog" andWeight:@"30K"];
      Animal *cat = [[Animal alloc]initWithKind:@"Cat" andWeight:@"12K"];
      NSArray *animalArray =[NSArray arrayWithObjects:dog, cat, nil];
    
      NSData *animalData = [NSKeyedArchiver archivedDataWithRootObject: animalArray];// 
    
      NSArray *animalArray2 =[NSKeyedUnarchiver unarchiveObjectWithData: animalData];// 
    

    大成功(swiftも同様)