FMDB基本用法及图片选择器

数据库基础用法



//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,UIImagePNGRepresentationpng格式的图片转化成NSData

    NSData *imageData = UIImagePNGRepresentation(image);

    //insertsql语句,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];

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值