您的位置:首页 > 移动开发 > IOS开发

《精通iOS开发·第六版》数据持久化基础知识之SOLite3持久化

2016-03-29 14:10 501 查看

《精通iOS开发·第六版》数据持久化基础知识之SOLite3持久化

1、BIDViewController.m文件

#import "BIDViewController.h"
#import <sqlite3.h>

@interface BIDViewController ()

@property(strong,nonatomic)IBOutletCollection(UITextField)NSArray *lineFields;

@end

@implementation BIDViewController

- (void)viewDidLoad {
[super viewDidLoad];
//视图加载完成之后(通常是从nib文件加载),做一些额外的设置
sqlite3 *database;
if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Filed to open database");
}
//有用的c语言小知识:
//如果两个内联的字符串之间只有空白(包括换行符)而没有其他字符,那么这两个字符串会被连接为一个字符串。
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS" "(ROW INTEGER PRIMARY KEY,FIELD_DATA TEXT);";
char *errorMsg;
if (sqlite3_exec(database, [createSQL UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Error creating table:%s",errorMsg);
}
NSString *query = @"SELECT ROW,FIELD_DATA FROM FIELDS ORDER BY ROW";
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
int row = sqlite3_column_int(statement, 0);
char *rowData = (char *)sqlite3_column_text(statement, 1);
NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData];
UITextField *field = self.lineFields[row];
field.text = fieldValue;
}
sqlite3_finalize(statement);
}
sqlite3_close(database);

UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
// Do any additional setup after loading the view from its nib.
}

-(NSString *)dataFilePath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:@"data.sqlite"];
}

-(void)applicationWillResignActive:(NSNotification *)notification
{
sqlite3 *database;
if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK) {
sqlite3_close(database);
NSAssert(0, @"Filed to open database");
}
for (int i=0; i<4; i++) {
UITextField *filed = self.lineFields[i];
char *upade = "INSERT OR REPLACE INTO FIELDS (ROW,FIELD_DATA)" "VALUES (?,?);";
char *errorMsg = NULL;
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, upade, -1, &stmt, nil) == SQLITE_OK) {
sqlite3_bind_int(stmt, 1, i);
sqlite3_bind_text(stmt, 2, [filed.text UTF8String], -1, NULL);
}
if (sqlite3_step(stmt) != SQLITE_DONE) {
NSAssert(0, @"Error updating table:%s",errorMsg);
sqlite3_finalize(stmt);
}
sqlite3_close(database);
}

}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end


2、BIDViewController.xib文件



注意:如下图





lineFields与XIB中的四个文本输入框链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: