在使用数据库存取数据的时候,必须要注意的是:在存取数据使用model类的时候,定义全局变量的model类比较方便,但是在存入数据的时候(一定要先初始化,不然存入的数据,有可能会出现,下一条数据会将上一条数据也存入,也就是夹带了上面的数据和本条数据一起存入数据库,在需要写入数据库的时候,一定要先初始化,或者不定义全局变量,在要存入数据的时候,直接实例化一个相对应的model对象即可,更直观,也方便后期查找和修改)
例如:下面两个不同实例化
Student *stuName = [[Student alloc] init];
Student *stuSex = [[Student alloc] init];
下面是更新语句:
UPDATE student SET name = ?, sex = ? WHERE number = ?
在上面的更新语句中,多个属性的时候需要用逗号隔开,而不是AND隔开,用了AND之后会导致数据库中的数值变为0或者 1(这是需要注意的地方)
下面是两种更新数据库的方法
1:直接在方法中传递参数(如果数据库中的属性较少,该方法比较直观,方便,直接修改,不需要在通过model类)
- (BOOL)updateStudentName:(NSString *)aName byID:(NSInteger)aID
{
sqlite3_stmt *stmt = nil;
NSString *sqlStr = [NSString stringWithFormat:@"update student set name = '%@' where number = %ld", aName, aID];
int result = sqlite3_prepare_v2(dbPoint, [sqlStr UTF8String], -1, &stmt, NULL);
if (result == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {//觉的应加一个判断, 若有这一行则修改
if (sqlite3_step(stmt) == SQLITE_DONE) {
sqlite3_finalize(stmt);
return YES;
}
}
}
sqlite3_finalize(stmt);
return NO;
}
2:不传递参数,用model复制之后直接更新数据库(如果数据库中的属性较多,这种方法比较好):需要注意的是在更新中这只需要更新的数据如果不更新数据(不给赋新的值,数据库的的该属性会变成NULL,下次再进入APP会闪退,数据库会崩溃,原有数据会丢失,也就是说,更新的里面的所有的属性必须全部从新赋值,及时不改变,只要你更新方法中有的属性必须从新赋值)
- (void)updatedata:(Student *)stu
{
// Update数据进入数据库
char *update = "UPDATE student SET name = ?, sex = ? WHERE number = ?";
char *errorMsg = NULL;
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(dbPoint, update, -1, &stmt, nil) == SQLITE_OK) {
// 下面的数字1,2是指上面问号的顺序
// Student *stu = [[Student alloc] init];
const char *subjectChar = [stu.name UTF8String];
const char *contentChar = [stu.sex UTF8String];
sqlite3_bind_text(stmt, 1, subjectChar, -1, NULL);
sqlite3_bind_text(stmt, 2, contentChar, -1, NULL);
sqlite3_bind_int(stmt, 3, stu.number);
}
if (sqlite3_step(stmt) != SQLITE_DONE) {
NSAssert(0, @"erroe updating tabels %s",errorMsg);
}
sqlite3_finalize(stmt);
// sqlite3_close(dbPoint);
}