首先需要创建4个textfield,目的是把4个text存入到数据库中去,触发事件是在点击home键的时候。当再次进入到程序的时候再从数据库中读取text的值并显示。
然后命名之所以采用1234这种类型是因为遍历的时候比较方便
@property (nonatomic, retain) IBOutlet UITextField *field1;
@property (nonatomic, retain) IBOutlet UITextField *field2;
@property (nonatomic, retain) IBOutlet UITextField *field3;
@property (nonatomic, retain) IBOutlet UITextField *field4;
最后放上代码,有很详细的注释#pragma mark -
- (void)viewDidLoad {
//先转化
//NSString *path=[self dataFilePath];
//const char *pat=[path UTF8String];//const以后就不要再赋值了,常量
if (sqlite3_open([[self dataFilePath] UTF8String], &database)!= SQLITE_OK) {//不是0就是错
sqlite3_close(database);
NSAssert(0, @"Failed to open database");//如果是0, 失败,报错
}
char *errorMsg;
//创建表语句
NSString *createSQL = @"CREATE TABLE IF NOT EXISTS FIELDS (ROW INTEGER PRIMARY KEY, FIELD_DATA TEXT);";//设主键PRIMARY KEY
//执行这个语句,使用sqlite3_exec的原因就是一执行就完事,没有后续操作了,但是查询语句就比较复杂
if (sqlite3_exec (database, [createSQL UTF8String],NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
NSAssert1(0, @"Error creating table: %s", errorMsg);
}
//查询语句
NSString *query = @"SELECT ROW, FIELD_DATA FROM FIELDS ORDER BY ROW";
sqlite3_stmt *statement;//缓冲地带,查询完的结果,放在这个缓冲池里
//-1是不限长度
if (sqlite3_prepare_v2( database, [query UTF8String],-1, &statement, nil) == SQLITE_OK) {
//while按逐行循环取值,结束条件
while (sqlite3_step(statement) == SQLITE_ROW) {
/*************分别取出一行中不同列的值************/
//从结果表中去出第1列的值,因为此列是int型,所以就用sqlite3_column_int
int row = sqlite3_column_int(statement, 0);
//从结果表中去出第2列的值,因为此列是char型,所以就用sqlite3_column_text第二列是text,类型要对应
char *rowData = (char *)sqlite3_column_text(statement, 1);
//把c的字符串转化为NSString,项目中取使用
NSString *fieldName = [[NSString alloc]
initWithFormat:@"field%d", row];
//把c的字符串转化为NSString,项目中取使用.编码是utf8
NSString *fieldValue = [[NSString alloc]
initWithUTF8String:rowData];
UITextField *field = [self valueForKey:fieldName];
field.text = fieldValue;
[fieldName release];
[fieldValue release];
}
//把缓冲的结果表关闭掉
sqlite3_finalize(statement);
}
UIApplication *app = [UIApplication sharedApplication];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationWillTerminate:)
name:UIApplicationWillTerminateNotification
object:app];
[super viewDidLoad];
}
- (NSString *)dataFilePath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:kFilename];
}
//此方法完成对数据进行保存,把textField的值输入数据库
- (void)applicationWillTerminate:(NSNotification *)notification {
for (int i = 1; i <= 4; i++)
{
NSString *fieldName = [[NSString alloc]
initWithFormat:@"field%d", i];
UITextField *field = [self valueForKey:fieldName];
[fieldName release];
//错误提示
char *errorMsg;
//插入语句 .(?, ?)意思是先不说,以后再说
char *update = "INSERT OR REPLACE INTO FIELDS (ROW, FIELD_DATA) VALUES (?, ?);";
sqlite3_stmt *stmt;
//因为参数是?,需要滞后给"?"赋值,所以此处用sqlite3_prepare_v2
if (sqlite3_prepare_v2(database, update, -1, &stmt,nil) == SQLITE_OK) {
//给第一个问号赋值,第一个对应的位置的是row字段,所以用sqlite3_bind_int,bind是绑定
sqlite3_bind_int(stmt, 1, i);//注意第一个问号从1开始的
//给第二个问号赋值,第二个对应的位置的是FIRLD_DATA字段,所以用sqlite3_bind_text
sqlite3_bind_text(stmt, 2, [field.text UTF8String], -1, NULL);
}
//真正导致插入的地方
if (sqlite3_step(stmt) != SQLITE_DONE)//不带大括号只管一行
NSAssert1(0, @"Error updating table: %s", errorMsg);//断言
sqlite3_finalize(stmt);
}
//for循环执行完毕才关闭,数据库,说明彻底用完了,因为这个方法执行了说明结束了
sqlite3_close(database);
}