iosデータの持続化の3つの方法
IOSでよく使用される3つのローカルデータの永続化方法:
1:属性シーケンス化リストはファイルplistに格納されます.
2:アーカイブをシーケンス化し、モデルデータをアーカイブする.
3:ローカルデータベースストレージ、埋め込みsqlite;
実はこの3つの方法はすべてデータをローカルファイルに格納して、ただ実現方式と使用するシーンが異なるだけで、複雑さは上から下まで増加します.
このほか、アプリケーションのグローバル設定をキー値ペアで記録するNSUserDefaultsを使用してデータを格納する方法もありますが、settings.bundle内のデータはNSUserDefaultsが存在します.
主なコードは次のとおりです.
方法一:plist
方法2:archiver
方式3:sqlite
方式3はlibsqlite 3.libを導入する必要があり、sqliteデータベースはCで実現され、記憶もC形式で記憶されるため、データを取り出す際にUTF 8 Stringでobjecitve-c形式の文字列に変換する必要がある
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形式の文字列に変換する必要がある