导入fmdb
1.首先需要把fmdb这个第三方类库给导入工程中。
FMDB的github地址: https://github.com/ccgus/fmdb
#import "ViewController.h"
// FMDatabase是在iOS开发中处理sqlite3的一个第三方库,它能自动识别sql语句,大大简化了sqlite3的操作
#import "FMDatabase.h"
@interface ViewController ()<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *passField;
@property (weak, nonatomic) IBOutlet UITextField *idField;
@end
@implementation ViewController
{
// FMDB是不考虑线程安全的,所以我们在处理增删改查操作的时候,要自己手动加锁
NSLock* _lock;
// 声明一个sqlite3操作指针,实例化的时候,需指定操作的数据库路径
FMDatabase* _database;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_lock = [[NSLock alloc] init];
// 这种方式是获取应用程序束目录下的文件,只支持读取,不支持写入,一般读取本地媒体文件或plist文件等,才会使用
// [NSBundle mainBundle] pathForResource:<#(NSString *)#> ofType:<#(NSString *)#>
// 获取应用程序的沙箱目录,此目录支持读写操作,所以本地保存都是把保存的数据存放到这个目录下
// 这个方法会返回一个数组,实际上数组里面只有一个字符串对象,就是沙箱目录
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentDir = [paths objectAtIndex:0];
NSLog(@"documentDir = %@",documentDir);
// 创建一个数据库路径
NSString* dataPath = [documentDir stringByAppendingPathComponent:@"studentdb.db"];
// 实例化数据库操作对象,指定要操作的数据库
_database = [[FMDatabase alloc] initWithPath:dataPath];
// 如果数据库存在,则打开,打开成功,就返回yes
// 如果数据库不存在,则创建,创建成功,就返回yes
BOOL isOpenSucess = [_database open];
if (isOpenSucess == NO) {
// _database.lastErrorMessage可以获取到数据库当前出问题的原因
NSLog(@"open database faild:%@",_database.lastErrorMessage);
return;
}
// 封装一个sql语句,用于创建一个表,如果表存在,则直接打开
NSString* createTableSql = @"create table if not exists studentlist(id integer primary key,name char(20),pass char(20))";
//executeUpdate:用于数据库的增/删/改/创建表操作
// 参数是若干对象,第一个字符串一定是我们要操作的sql语句,后面的参数是SQL语句里面要用到的参数
BOOL isCreateSucess = [_database executeUpdate:createTableSql];
if (isCreateSucess == NO) {
NSLog(@"create table failed:%@",_database.lastErrorMessage);
return;
}
}
- (IBAction)saveBtn:(UIButton *)sender {
// 获取要存储的数据
NSString* name = self.nameField.text;
NSString* pass = self.passField.text;
NSString* userID = self.idField.text;
// 封装一个sql语句,用于插入表操作
// 在ios里封装插入语句的时候,values要用?占位,而不能直接写值
NSString* insertSql = @"insert into studentlist(id,name,pass) values(?,?,?)";
[_lock lock];
// 指向插入数据操作,把要插入的数据作为参数传递,参数的形式只能是对象,不能是基本数据类型,fmdb会自动识别数据库内对应数据项的类型,并自动转换,比如userID是一个字符串,而数据库中userID是一个integer,fmdb会自动把字符串转换成integer
BOOL isInsertSuccess = [_database executeUpdate:insertSql,userID,name,pass];
if (isInsertSuccess == NO) {
NSLog(@"insert data failed:%@",_database.lastErrorMessage);
}else{
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"message" message:@"保存成功" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
[_lock unlock];
}
- (IBAction)deleteBtn:(UIButton *)sender {
[_lock lock];
NSString* deleteSql = @"delete from studentlist where id=1";
BOOL isDeleteSuccess = [_database executeUpdate:deleteSql];
if (isDeleteSuccess) {
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Delete" message:@"success" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}else{
NSLog(@"delete failed:%@",_database.lastErrorMessage);
}
[_lock unlock];
}
- (IBAction)updateBtn:(id)sender {
[_lock lock];
// 封装更改信息的sql语句
NSString* updateSql = @"update studentlist set name=\"newTom\" where id=1";
BOOL isUpdateSuccess = [_database executeUpdate:updateSql];
if (isUpdateSuccess == NO) {
NSLog(@"update faild:%@",_database.lastErrorMessage);
return;
}else{
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"update" message:@"success" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
[_lock unlock];
}
- (IBAction)lookUpBtn:(UIButton *)sender {
[_lock lock];
NSString* querySql = @"select* from studentlist";
// FMResultSet使用这个类对象,来保存查找数据库的结果
FMResultSet* set = [_database executeQuery:querySql];
//[set next]; // 类似于枚举的工作原理,逐行遍历表中的所有数据
while ([set next]) {// 当遍历到某一行发现没有数据的时候,返回no
// 循环体内,我们就可以获取当前遍历的这一行的所有数据项(字段)
// 使用xxxForColumn:字段名称 获取该字段对应的数据
NSString* name = [set stringForColumn:@"name"];
NSInteger userID = [set intForColumn:@"id"];
NSString* pass = [set stringForColumn:@"pass"];
NSLog(@"ID:%d,name:%@,pass:%@",userID,name,pass);
}
[_lock unlock];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
@end