iOSクラス要素の配列格納Sqlite(NSCodingの使用)
3532 ワード
今日はここでNSArrayストレージのデータベース処理の問題を記録します!Sqliteは配列形式で直接格納することはサポートされていないことはよく知られています!だから配列を扱うときはNSDataのモードに変換し、呼び出したときに変換します.ストレージ変換:
以上、1つの配列をMutableDataに変換することで、データベースストレージ操作が可能になります!取り出すときにそれを戻すのも簡単です.
前に私はずっとこのように操作して、私はまだ多くの人がこのように解決したと信じています!
最近、swiftを書いている間に何気なくNSCodingに遭遇しました(詳しくは後述します)、関連ドキュメントを見ているうちに、もっと簡単な方法を見ました.は、まず、文字列配列の記憶問題 を解決するためにアーカイブ解除可能である.
1つのコードで問題を解決して、今前の方法がそんなに何度も変換されたことを見て、本当に面倒です!では、NSCodingはいつ使えますか.上記の配列の要素は文字列ですが、クラスであれば?みんなは自分でやってみることができて、結果はきっとできません.すべてのオリジナルクラスはNSCodingプロトコルを実装し、アーカイブ中にトランスコードを実装することでアーカイブが成功します. API
NSCodingプロトコルには2つの方法しかなく,いずれもrequireの方法であり,1つは自分のクラスをトランスコードし,1つは変換されたコードをクラスオブジェクトにトランスコードする.次に、クラスを書いて実行可能かどうかを確認し、まずカスタムアニメーションクラスを書きます.
はい.mファイルにおけるNSCodingプロトコルの実装
カスタムAnimalアーカイブ変換の具体的な実装:
大成功(swiftも同様)
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プロトコルを実装し、アーカイブ中にトランスコードを実装することでアーカイブが成功します.
//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も同様)