数据库基础用法
//fmdb需要libsqlite3.dylib依赖库
//重写init方法,完成必要的初始化操作
- (id)init
{
self = [super init];
if (self) {
//指定数据库的路径 user.db
_lock = [[NSLock alloc] init];
NSString *dbPath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/user.db"];
//创建一个FMDataBase(操作sqlite3)的对象,并将数据库的路径传递给对象
_dataBase = [[FMDatabase alloc] initWithPath:dbPath];
//open有两层含义:如果指定路径下没有user.db则创建一个user.db数据库文件,并打开,如果已经存在user.db则直接打开,返回值反映操作是否成功
BOOL isOpen = [_dataBase open];
if (isOpen) {
//create table if not exists固定写法
//userInfo表名,()里面是表单的字段
//primary key主键,autoincrement主键自动增长
//创建一个表单,如果表单已经存在,这个sql语句就不会产生反应
NSString *createSql = @"create table if not exists userInfo(id integer primary key autoincrement,name varchar(256),age integer default 0,image blob)";
//需要执行创建表的语句
//创建表以及增、删、改的sql语句,执行的话全用executeUpdate方法,返回值为执行的结果
BOOL isCreate =[_dataBase executeUpdate:createSql];
if (!isCreate) {
//执行语句失败
//lastErrorMessage 会获取到执行sql语句失败的信息
NSLog(@"create error:%@",_dataBase.lastErrorMessage);
}
}
}
return self;
}
+(DBManager *)shareManager
{
static DBManager *manager = nil;
//@synchronized 同一时刻,只能有一个线程来执行{}中的代码
//为了防止,多个线程同时来调用shareManager而造成实例化多个对象
@synchronized(self){
if (manager == nil) {
manager = [[DBManager alloc] init];
}
}
return manager;
}
//将数据模型中的数据插入到表中
- (void)insertDataWithModel:(UserModel *)model{
[_lock lock];
UIImage *image = model.headImage;
//将image转化为NSData,UIImagePNGRepresentation将png格式的图片转化成NSData
NSData *imageData = UIImagePNGRepresentation(image);
//insert的sql语句,sql语句中,用?来作为占位符,不管字段是何种类型
NSString *insertSql = @"insert into userInfo(name,age,image) values(?,?,?)";
//executeUpdate:后面跟的参数类型必须是对象类型
//FMDataBase对象会将传过来的参数,转化成与数据库字段相匹配的类型,再进行后续处理
BOOL isInsert = [_dataBase executeUpdate:insertSql,mm.nameStr,mm.ageStr,imageDate];
if (!isInsert) {
NSLog(@"insert error = %@",_fmdb.lastErrorMessage);
}
[_lock unlock];
}
//根据主键id删除某条数据
- (void)deleteDataWithUserId:(NSInteger)userId
{
[_lock lock];
NSString *deleteSql = @"delete from userInfo where id =?";
//参数必须是对象类型,再作为executeUpdate:方法的参数
BOOL isDelete = [_dataBase executeUpdate:deleteSql,[NSNumber numberWithInteger:userId]];
if (isDelete == NO) {
NSLog(@"delete error:%@",_dataBase.lastErrorMessage);
}
[_lock unlock];
}
//根据主键id来更改某条数据
- (void)updateDataWithModel:(UserModel *)model userId:(NSInteger)userId
{
[_lock lock];
NSData *imageData = UIImagePNGRepresentation(model.headImage);
NSString *updateSql = @"update userInfo set name=?,age=?,image=? where id=?";
BOOL isUpdate =[_dataBase executeUpdate:updateSql,model.userName,model.age,imageData,[NSNumber numberWithInteger:userId]];
if (isUpdate == NO) {
NSLog(@"updateError:%@",_dataBase.lastErrorMessage);
}
[_lock unlock];
}
//获取所有的数据
- (NSArray *)getAllStudentsae
{
//取到userInfo表中所有的数据
[_lock lock];
//用来存放UserModel
NSMutableArray *array = [NSMutableArray array];
NSString *selectSql = @"select * from userInfo";
//FMResultSet 查询结果
FMResultSet *set =[_dataBase executeQuery:selectSql];
//类似于数组的快速遍历,set会依次代表所有的查询结果
while ([set next]) {
//每次取出一整条数据
//根据字段名称,取出字段的值
NSString *name=[set stringForColumn:@"name"];
NSString *age = [set stringForColumn:@"age"];
NSData *imageData =[set dataForColumn:@"image"];
UserModel *model = [[UserModel alloc] init];
model.userName = name;
model.age = age;
model.headImage = [UIImage imageWithData:imageData];
[array addObject:model];
[model release];
}
[_lock unlock];
return array;
}
【图片选择器进阶】
UIImagePickerController *ipc = [[UIImagePickerController alloc]init];//照片选择器
//打开编辑模式(为了裁剪图片)
picker.allowsEditing = YES;
ipc.delegate = self;//<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
[self presentViewController:ipc animated:YES completion:nil];
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
//判断点击的是否是图片资源
//#import <MobileCoreServices/MobileCoreServices.h>才能用kUTTypeImage
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
//裁剪后的图片,只有打开编辑模式info里才有这个键值对
UIImage *image1 = [info objectForKey:UIImagePickerControllerEditedImage];
//原图
UIImage *image2 = [info objectForKey:UIImagePickerControllerOriginalImage];
//将图片转化为二进制数据
NSData* headData = UIImagePNGRepresentation(image2);
}
[picker dismissViewControllerAnimated:YES completion:nil];
}