在存取数据的时候用数据库的话会很方便,但是ios开发的过程中不像java开发那样的直接写数据路的操作语句
这里我们就借助及三房框架FMDB让ios开发过程中的数据库的操作想java开发中一样的方便
下边仅仅对数据库的CRUD做了简单地实例
FMDB还有一个很优秀的地方
就是可以自动的回滚
我在更新数据库的地方进行了简单的应用
/*
设计数据库-> t_person
设计表的字段 -> name,money
创建数据库文件->FMDB
*/
#import "ViewController.h"
#import "FMDB.h"
@interface ViewController ()
@property (nonatomic, strong) FMDatabaseQueue *queue;
@end
@implementation ViewController
// 增加
- (IBAction)insert:(id)sender {
// NSString *sql = [NSString stringWithFormat:@"insert into t_person (name,money) values('%@',%d)",@"wanglaowu",1000];
// ? 数据库的占位符
// executeUpdate方法里面的参数必须添对象
[_queue inDatabase:^(FMDatabase *db) {
BOOL success = [db executeUpdate:@"insert into t_person (name,money) values(?,?)",@"a",@1000];
if (success) {
NSLog(@"插入成功");
}else{
NSLog(@"插入失败");
}
BOOL success1 = [db executeUpdate:@"insert into t_person (name,money) values(?,?)",@"b",@1500];
if (success1) {
NSLog(@"插入成功");
}else{
NSLog(@"插入失败");
}
}];
}
- (IBAction)delete:(id)sender {
[_queue inDatabase:^(FMDatabase *db) {
NSString *sql = [NSString stringWithFormat:@"delete from t_person"];
BOOL success = [db executeUpdate:sql];
if (success) {
NSLog(@"删除成功");
}else{
NSLog(@"删除失败");
}
}];
}
- (IBAction)select:(id)sender {
[_queue inDatabase:^(FMDatabase *db) {
FMResultSet *set = [db executeQuery:@"select * from t_person"];
while ([set next]) {
// 查询到一条记录
NSString *name = [set stringForColumn:@"name"];
int money = [set intForColumn:@"money"];
NSLog(@"name = %@-money=%d",name,money);
}
}];
}
- (IBAction)update:(id)sender {
[_queue inDatabase:^(FMDatabase *db) {
// 开启事务
[db beginTransaction];
NSString *sql = [NSString stringWithFormat:@"update t_person set money = 500 where name = 'a'"];
BOOL success = [db executeUpdate:sql];
if (success) {
NSLog(@"更新成功");
}else{
NSLog(@"更新失败");
// 回滚:前面的操作全部无效,只要是一个事务上的操作.
[db rollback];
}
/**
* 错误的示范
*/
NSString *sql1 = [NSString stringWithFormat:@"update1 t_person set money = 2000 where name = 'b'"];
BOOL success1 = [db executeUpdate:sql1];
if (success1) {
NSLog(@"更新成功");
}else{
// 回滚:前面的操作全部无效,只要是一个事务上的操作.
[db rollback];
NSLog(@"更新失败");
}
// 提交
[db commit];
}];
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [docPath stringByAppendingPathComponent:@"person.sqlite"];
// 1.创建数据库的队列,会自动帮你创建FMDatabase对象,打开数据库,肯定会生成数据库实例还有生成数据库文件
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
_queue = queue;
//FMDatabase *db 是多线程安全的
[queue inDatabase:^(FMDatabase *db) {
// 创建表格
// executeUpdate除了查询操作,其他都是属于更新,创建表格,增删改
BOOL success = [db executeUpdate:@"create table if not exists t_person (id integer primary key,name text not null,money integer not null);"];
if (success) {
NSLog(@"创建成功");
}else{
NSLog(@"创建失败");
}
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
一些更好用的例子
//
// ViewController.m
// FMDBTest
//
// Created by 杨小兵 on 15/7/31.
// Copyright (c) 2015年 杨小兵. All rights reserved.
//
#import "ViewController.h"
#import "FMDB.h"
@import AssetsLibrary;
@import AVFoundation;
@interface ViewController ()<UIImagePickerControllerDelegate , UINavigationControllerDelegate>
@property(nonatomic , strong)UIImage *image;
@property (nonatomic, strong) FMDatabaseQueue *queue;
@property (weak, nonatomic) IBOutlet UITextField *IDTextField;
@property (weak, nonatomic) IBOutlet UITextField *nameTextField;
@property (weak, nonatomic) IBOutlet UIButton *iconButton;
- (IBAction)iconButtonClick:(UIButton *)sender;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self creatDataBase];
}
// 增加
- (IBAction)insert:(id)sender
{
// executeUpdate方法里面的参数必须添对象
[_queue inDatabase:^(FMDatabase *db) {
[db open];
BOOL success = [db executeUpdate:@"insert into FMDBTest (name,imageData) values(?,?)",self.nameTextField.text,UIImagePNGRepresentation(self.image)];
if (success)
{
NSLog(@"插入成功");
}
else
{
NSLog(@"插入失败");
}
[db close];
}];
}
- (IBAction)delete:(id)sender
{
[_queue inDatabase:^(FMDatabase *db) {
[db open];
BOOL success = [db executeUpdate:@"delete from FMDBTest where id = ?",self.IDTextField.text];
if (success)
{
NSLog(@"删除成功");
}
else
{
NSLog(@"删除失败");
}
[db close];
}];
}
- (IBAction)select:(id)sender
{
[_queue inDatabase:^(FMDatabase *db) {
[db open];
FMResultSet *set = [db executeQuery:@"select * from FMDBTest where id = ?",self.IDTextField.text];
if ([set next])
{
// 查询到一条记录
NSInteger ID = [set intForColumn:@"id"];
NSString *name = [set stringForColumn:@"name"];
NSData *data = [set dataForColumn:@"imageData"];
self.IDTextField.text = [NSString stringWithFormat:@"%@",@(ID)];
self.nameTextField.text = name;
[self.iconButton setImage:[UIImage imageWithData:data] forState:UIControlStateNormal];
}
else
{
NSLog(@"没有查询到内容");
}
[db close];
}];
}
- (IBAction)update:(id)sender
{
[_queue inDatabase:^(FMDatabase *db) {
[db open];
// 开启事务
[db beginTransaction];
BOOL success = [db executeUpdate:@"update FMDBTest set name = ? , imageData = ? where id = ?",self.nameTextField.text,UIImagePNGRepresentation(self.image),self.IDTextField.text];;
if (success) {
NSLog(@"更新成功");
}else{
NSLog(@"更新失败");
// 回滚:前面的操作全部无效,只要是一个事务上的操作.
[db rollback];
}
// 提交
[db commit];
[db close];
}];
}
- (void)creatDataBase
{
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *filePath = [docPath stringByAppendingPathComponent:@"FMDBTest.sqlite"];
// 1.创建数据库的队列,会自动帮你创建FMDatabase对象,打开数据库,肯定会生成数据库实例还有生成数据库文件
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
_queue = queue;
//FMDatabase *db 是多线程安全的
[queue inDatabase:^(FMDatabase *db) {
// 创建表格
// executeUpdate除了查询操作,其他都是属于更新,创建表格,增删改
BOOL success = [db executeUpdate:@"create table if not exists FMDBTest (id integer primary key,name text not null , imageData blob not null);"];
if (success)
{
NSLog(@"创建成功");
}
else
{
NSLog(@"创建失败");
}
[db close];
}];
}
- (IBAction)iconButtonClick:(UIButton *)sender
{
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.delegate = self;
imagePicker.allowsEditing = YES;
[self presentViewController:imagePicker animated:YES completion:nil];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
self.image = info[@"UIImagePickerControllerEditedImage"];
[picker dismissViewControllerAnimated:YES completion:^{
[self.iconButton setImage:self.image forState:UIControlStateNormal];
}];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (UIImage *)image
{
if (_image == nil)
{
_image = [UIImage imageNamed:@"icon"];
}
return _image;
}
@end
例子的giehub地址 https://github.com/sixTiger/FMDBTest/tree/master
本文介绍如何使用FMDB简化iOS开发中的SQLite数据库操作,包括数据库的增删查改,并展示了一个包含图片存储的具体示例。
990

被折叠的 条评论
为什么被折叠?



