iosデータの持続化の3つの方法


IOSでよく使用される3つのローカルデータの永続化方法:
1:属性シーケンス化リストはファイルplistに格納されます.
2:アーカイブをシーケンス化し、モデルデータをアーカイブする.
3:ローカルデータベースストレージ、埋め込みsqlite;
実はこの3つの方法はすべてデータをローカルファイルに格納して、ただ実現方式と使用するシーンが異なるだけで、複雑さは上から下まで増加します.
このほか、アプリケーションのグローバル設定をキー値ペアで記録するNSUserDefaultsを使用してデータを格納する方法もありますが、settings.bundle内のデータはNSUserDefaultsが存在します.
 
主なコードは次のとおりです.
 
方法一:plist
 
//   plist    
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	NSString *documentDirectory = [path objectAtIndex:0];
	filePath = [documentDirectory stringByAppendingPathComponent:@"xxx.plist"];
//     plist
NSArray *arr = [[NSArray allocl] initWithObjects:A,B,C,nil];
[arr writeToFile:self.filePath atomically:YES];

// plist   
NSMutableArray *arr = [[NSMutableArray alloc] initWithContentsOfFile:filePath];


 
方法2:archiver
 
//    NSCoding,NSCopying       User,          :
@synthesize passport;
@synthesize password;
@synthesize nickname;
@synthesize remark;

- (void)encodeWithCoder:(NSCoder *)encoder{
	[encoder encodeObject:passport forKey:kPassportKey];
	[encoder encodeObject:password forKey:kPasswordKey];
	[encoder encodeObject:nickname forKey:kNicknameKey];
	[encoder encodeObject:remark forKey:kRemarkKey];
}

- (id)initWithCoder:(NSCoder *)decoder{
	if (self=[super init]) {
		self.passport = [decoder decodeObjectForKey:kPassportKey];
		self.password = [decoder decodeObjectForKey:kPasswordKey];
		self.nickname = [decoder decodeObjectForKey:kNicknameKey];
		self.remark = [decoder decodeObjectForKey:kRemarkKey];
	}
	return self;
}

- (id)copyWithZone:(NSZone *)zone{
	User *copy = [[[self class] allocWithZone:zone] init];
	passport = [self.passport copy];
	password = [self.password copy];
	nickname = [self.nickname copy];
	remark = [self.remark copy];
	return copy;
}

//      
- (NSString *)dataFilePath{
	NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
	return [(NSString *)[arr objectAtIndex:0] stringByAppendingPathComponent:@"archiver"];
}

//              
User *user = [[User alloc] init];
	user.passport = @"alec030711";
	user.password = @"abcd";
	user.nickname = @"alecchyi";
	user.remark = @"fuck";
	
	NSMutableData *data = [[NSMutableData alloc] init];
	NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
	[archiver encodeObject:user forKey:@"kData"];
	[archiver finishEncoding];
	[data writeToFile:[self dataFilePath] atomically:YES];
	[archiver release];
	[data release];
	[user release];

//        
NSMutableData *data = [[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]];
	NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
	User *user = [unArchiver decodeObjectForKey:@"kData"];
	[unArchiver finishDecoding];

	[data release];
	[unArchiver release];

 
 方式3:sqlite
	sqlite3 *database;
	//     ,     
	if (sqlite3_open([        UTF8String], &database) != SQLITE_OK) {
		sqlite3_close(database);
	}
	//   
	char *errorStr;
	NSString *createTable = @"drop table if exists users;create table if not exists users (id integer primary key,nickname text);";
	if (sqlite3_exec(database,[createTable UTF8String],NULL,NULL,&errorStr)!=SQLITE_OK) {
		sqlite3_close(database);
	}
	//    
	for (int x=1; x<5; x++) {
		NSString *insert = [[NSString alloc] initWithFormat:@"insert or replace into users (id,nickname) values (%d,'ruby%d')",x,x];
		if (sqlite3_exec(database,[insert UTF8String],NULL,NULL,&errorStr)!=SQLITE_OK) {
			sqlite3_free(database);
		}
		[insert release];
	}
	//     
	NSString *query = @"select nickname,id from users";
	sqlite3_stmt *statememt;
	if (sqlite3_prepare_v2(database,[query UTF8String],-1,&statememt,nil)==SQLITE_OK) {
		while (sqlite3_step(statememt)==SQLITE_ROW) {
			char *rowData = (char *)sqlite3_column_text(statememt,0);
			NSString *nickname = [[NSString alloc] initWithUTF8String:rowData];
			[nickname release];
		}
	}
	sqlite3_finalize(statememt);
	//     
	sqlite3_close(database);
	
	//             :sqlite3_open, sqlite3_exec,sqlite3_prepare_v2  sqlite3_step sqlite_finalize,sqlite3_close。

 方式3はlibsqlite 3.libを導入する必要があり、sqliteデータベースはCで実現され、記憶もC形式で記憶されるため、データを取り出す際にUTF 8 Stringでobjecitve-c形式の文字列に変換する必要がある