2種類のデータを保存したい。1つはデフォルトの不変データセット(モンスター統計、アイテムデータベースなど)です。2つ目は、ユーザーがアプリを終了したときにデータを保存するための文字統計です。
私はすでにcoredata(リソースフォルダーに設定されたsqliteのデフォルトを保存)を使用したプログラミングをほとんど行っていません。しかし、メモリ、速度、暗号化を考慮してデータを保存するための最良の方法を正確に知りたいと思います。
大規模なデータの場合は、CoreData または Sqilte を使用することをお勧めします (FMDB と呼ばれる sqlite ラッパーを参照してください)。
統計スコアなどのより安全なデータについては、キーチェーン (サンプル) を使用することをお勧めします。
安全な小さなデータがない場合は、NSUserDefaults
.
NSArray *stringsArray = [[NSArray alloc] arrayWithObjects: string1, string2, string3, nil];
[[NSUserDefaults standardUserDefaults] setObject:stringsArray forKey:@"MyStrings"];
[[NSUserDefaults standardUserDefaults] synchronize]
私は少し偏っていますが、sqlite の方が好きです。いくつかのプロジェクトで使用したいくつかのコード例をまとめました。他のコード例をご覧になりたい場合はお知らせください。
//
// SQLiteFunctions.h
//
#import <sqlite3.h>
#import "Users.h"
@interface SQLiteFunctions : NSObject
{
@public
@private
char *error;
sqlite3 *dbPointer;
sqlite3_stmt *sqlStatement;
}
@property (nonatomic, strong) Users *users;
@property (nonatomic, strong) NSMutableArray *returnData;
-(BOOL)openBundleDatabase:(int)bibleversion;
-(void)closeDatabase;
-(int)getUserRecords:(const char *)sqlquery;
@end
**
//
// SQLiteFunctions.m
//
#import "SQLiteFunctions.h"
@implementation SQLiteFunctions
@synthesize returnData;
@synthesize users;
-(BOOL)openBundleDatabase
{
// initializing db file access
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"dbname.sqlite"];
// testing to see if database was found
BOOL success = [fileMgr fileExistsAtPath:dbPath];
if(!success)
{
// can't find database
NSLog(@"Cannot locate database file '%@'.", dbPath);
return NO;
}
// testing for other error
if(!(sqlite3_open([dbPath UTF8String], &dbPointer) == SQLITE_OK))
{
// logging other error
NSLog(@"An error has occured: %s", sqlite3_errmsg(dbPointer));
return NO;
}
// returning success
return YES;
}
-(void)closeDatabase
{
// finalizing and closing the database
sqlite3_finalize(sqlStatement);
sqlite3_close(dbPointer);
}
-(int)getUserRecords:(const char *)sqlquery
{
// retreiving database values
if ([self getRecords:sqlquery])
{
// setting the date format
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"MM/dd/yyyy"];
// looping through existing return rows
while (sqlite3_step(sqlStatement)==SQLITE_ROW)
{
// retreiving database values
users = [[Users alloc] init];
// retreiving database values
users.user_name = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 0)];
users.user_id = sqlite3_column_int(sqlStatement,1);
users.last_logged = [dateFormat dateFromString:[NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 2)]];
users.consecutive_days = sqlite3_column_int(sqlStatement,3);
users.audio = sqlite3_column_int(sqlStatement,4);
users.profile_skip = sqlite3_column_int(sqlStatement,5);
users.anim_speed = sqlite3_column_int(sqlStatement,6);
users.display_font = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStatement, 7)];
// adding object to the return data array
[returnData addObject:users];
}
}
// returning number of rows in the array
return [returnData count];
}
**
//
// Users.h
//
#import <Foundation/Foundation.h>
@interface Users : NSObject
@property (nonatomic,copy) NSString *user_name;
@property (nonatomic,assign) NSInteger user_id;
@property (nonatomic,copy) NSDate *last_logged;
@property (nonatomic,assign) NSInteger consecutive_days;
@property (nonatomic,assign) BOOL audio;
@property (nonatomic,assign) BOOL profile_skip;
@property (nonatomic,assign) NSInteger anim_speed;
@property (nonatomic,copy) NSString *display_font;
@end
**
//
// Users.m
//
#import "Users.h"
@implementation Users
@synthesize user_name;
@synthesize user_id;
@synthesize last_logged;
@synthesize consecutive_days;
@synthesize audio;
@synthesize profile_skip;
@synthesize anim_speed;
@synthesize display_font;
@end