iOS-sqlite3&FMDB使用代码示范
数据库操作是我们使用十分频繁的一份操作,在iOS中如何使用数据库,使用什么数据库,是我们不得不考虑的一个问题。
小型数据我们可以使用plist文件,或者NSUserDefaults存储。数据量比较多得情况下,我们可以使用sqlite或者Core Data.
在此先介绍一下sqlite的系统API,然后介绍一下第三方库FMDB,使用第三方库比使用系统的sqlite简单方便。
对数据库的操作,我们可以简单理解为增删改查,下面的具体直接使用代码实现增删改查,不一具体介绍。
#import <UIKit/UIKit.h>
#import <sqlite3.h>
#import "Person.h"
@interface ViewController : UIViewController
{
NSMutableArray *_arrayData;
}
- (IBAction)addButtonClick:(id)sender;
- (IBAction)deleteButtonClick:(id)sender;
- (IBAction)updateButtonClick:(id)sender;
- (IBAction)selectButtonClick:(id)sender;
@end #import "ViewController.h" @interface ViewController () @end
sqlite3 *_database;
@implementation ViewController - (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_arrayData = [[NSMutableArray alloc]init];
for(int i = ;i < ;i ++)
{
Person *p = [[Person alloc]init];
p.name = [NSString stringWithFormat:@"wyg%d",i];
p.age = + i;
[_arrayData addObject:p];
}
[self createTable];
} - (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} - (IBAction)addButtonClick:(id)sender
{
[self insertData];
} - (IBAction)deleteButtonClick:(id)sender
{
[self deleteData];
} - (IBAction)updateButtonClick:(id)sender
{
[self updateData];
} - (IBAction)selectButtonClick:(id)sender
{
[self selectData];
} -(void)openDatabase
{
if (sqlite3_open([[self getFilePath] UTF8String], &_database) == SQLITE_OK)
{
NSLog(@"open success");
}
else
{
NSLog(@"open failed");
}
}
-(void)createTable
{
[self openDatabase];
NSString *sql = @"create table if not exists students(name text ,age integer)";
sqlite3_stmt *stmt = nil;
if (sqlite3_prepare_v2(_database, [sql UTF8String], -, &stmt, nil) == SQLITE_OK)
{
if (sqlite3_step(stmt) == SQLITE_DONE)
{
NSLog(@"create table success");
}
else
{
NSLog(@"create table failed");
}
}
sqlite3_finalize(stmt);
sqlite3_close(_database);
}
-(void)insertData
{
[self openDatabase];
NSString *sql = @"insert into students(name,age)values(?,?)";
sqlite3_stmt *stmt = nil;
for (int i = ; i < _arrayData.count; i ++)
{
Person *p = _arrayData[i];
if (sqlite3_prepare_v2(_database, [sql UTF8String], -, &stmt, nil) == SQLITE_OK)
{
sqlite3_bind_text(stmt, , [p.name UTF8String], strlen([p.name UTF8String]), nil);
sqlite3_bind_int(stmt, , p.age);
if (sqlite3_step(stmt) == SQLITE_DONE)
{
NSLog(@"insert success");
}
else
{
NSLog(@"insert failed");
}
}
}
sqlite3_finalize(stmt);
sqlite3_close(_database);
}
-(void)deleteData
{
[self openDatabase];
sqlite3_stmt *stmt = nil;
NSString *sql = @"delete from students where age > 23";
if (sqlite3_prepare_v2(_database, [sql UTF8String], -, &stmt, nil) == SQLITE_OK)
{
if (sqlite3_step(stmt) == SQLITE_DONE)
{
NSLog(@"delete success");
}
else
{
NSLog(@"delete failed");
}
}
sqlite3_finalize(stmt);
sqlite3_close(_database);
}
-(void)updateData
{
[self openDatabase];
sqlite3_stmt *stmt = nil;
NSString *sql = @"update students set name = 'www' where age > 22";
if (sqlite3_prepare_v2(_database, [sql UTF8String], -, &stmt, nil) == SQLITE_OK)
{
if (sqlite3_step(stmt) == SQLITE_DONE)
{
NSLog(@"update success");
}
else
{
NSLog(@"update failed");
}
}
sqlite3_finalize(stmt);
sqlite3_close(_database);
}
-(void)selectData
{
[self openDatabase];
NSString *sql = @"select *from students";
sqlite3_stmt *stmt = nil;
NSMutableArray *array = [[NSMutableArray alloc]init];
if (sqlite3_prepare_v2(_database, [sql UTF8String], -, &stmt, nil) == SQLITE_OK)
{
while (sqlite3_step(stmt) == SQLITE_ROW)
{
char *name = (char *)sqlite3_column_text(stmt, );
int age = sqlite3_column_int(stmt, );
Person *p = [[Person alloc]init];
p.name = [NSString stringWithUTF8String:name];
p.age = age;
[array addObject:p];
}
}
NSLog(@"---%@",array);
sqlite3_finalize(stmt);
sqlite3_close(_database);
}
-(NSString *)getFilePath
{
NSString *docuPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[];
NSString *filePath = [docuPath stringByAppendingPathComponent:@"database.db"];
return filePath;
}
@end
sqlite
关于FMDB,是对系统sqlite的封装,使用起来更加方便,我们可以从github上下载。
下面代码是对FMDB的基本封装。
其中包括对数据库打开关闭的操作,和数据库的基本操作。
对数据库创建,打开,关闭等操作我们封装在DatabaseTool类里面。
对数据库的基本操作,例如创建表,增删改查等操作,我们封装在ContactDAO类里面。
操作的数据我们封装在Contact里面。
*********************************************************
** DatabaseTool
** #import <Foundation/Foundation.h>
#import "FMDB.h"
@interface DatabaseTool : NSObject
+(FMDatabase *)shareDatabase;
+(BOOL)close;
@end #import "DatabaseTool.h"
static FMDatabase *_db = nil;
@implementation DatabaseTool
+(FMDatabase *)shareDatabase
{
if (_db == nil)
{
_db = [[FMDatabase alloc]initWithPath:[self getFilePath]];
}
[self open];
return _db;
}
+(NSString *)getFilePath
{
NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[];
NSString *path = [documentPath stringByAppendingPathComponent:@"file.db"];
return path;
}
+(BOOL)open
{
if ([_db open] == NO)
{
[_db close];
NSAssert(NO, @"数据库打开失败");
}
//设置数据库缓存机制
[_db setShouldCacheStatements:YES];
return YES;
}
+(BOOL)close
{
if ([_db close] == NO)
{
NSAssert(NO, @"数据库关闭失败");
}
return YES;
}
@end
*************************************************************
** Contact
**
#import <Foundation/Foundation.h>
//modal 模型
@interface Contact : NSObject
{
int _cid;
NSString *_name;
NSString *_phone;
}
@property(nonatomic,assign) int cid;
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *phone;
//自定义初始化方法
-(id)initWithID:(int)ID name:(NSString *)aName phone:(NSString *)aPhone;
@end #import "Contact.h" @implementation Contact
@synthesize cid = _cid;
@synthesize name = _name;
@synthesize phone = _phone;
-(id)initWithID:(int)ID name:(NSString *)aName phone:(NSString *)aPhone
{
if (self = [super init])
{
self.cid = ID;
self.name = aName;
self.phone = aPhone;
}
return self;
}
-(void)dealloc
{
[_name release];
[_phone release];
[super dealloc];
}
@end
*************************************************************
** ContactDAO
**
#import <Foundation/Foundation.h>
#import "DatabaseTool.h"
//连接 数据模型和数据库对象 主要完成表的创建,增删改查得功能
@interface ContactDAO : NSObject
+(void)createContactTable;
+(void)insertData;
+(NSMutableArray *)queryData;
+(void)updateDataWithID:(int)cid;
+(void)deleteDataWithID:(int)cid;
@end #import "ContactDAO.h"
#import "Contact.h"
@implementation ContactDAO
+(void)createContactTable
{
FMDatabase *database = [DatabaseTool shareDatabase];
if ([database tableExists:@"contact"] == NO)
{
[database executeUpdate:@"create table contact(id integer primary key autoincrement not null,name text,phone text)"];
}
[DatabaseTool close];
}
+(void)insertData
{
FMDatabase *database = [DatabaseTool shareDatabase];
[database executeUpdate:@"insert into contact(name,phone)values(?,?)",@"wyg",@""];
[DatabaseTool close];
}
+(NSMutableArray *)queryData
{
NSMutableArray *array = [[NSMutableArray alloc]init];
FMDatabase *database = [DatabaseTool shareDatabase];
FMResultSet *set = [database executeQuery:@"select *from contact"];
while ([set next])
{
int cid = [set intForColumn:@"id"];
NSString *name = [set stringForColumn:@"name"];
NSString *phone = [set stringForColumn:@"phone"];
Contact *c = [[Contact alloc]initWithID:cid name:name phone:phone];
[array addObject:c];
[c release];
}
[set close];
[DatabaseTool close];
return array;
}
+(void)updateDataWithID:(int)cid
{
NSNumber *num = [NSNumber numberWithInt:cid];
FMDatabase *database = [DatabaseTool shareDatabase];
[database executeUpdate:@"update contact set name = 'www' where id = ?",num];
[DatabaseTool close];
}
+(void)deleteDataWithID:(int)cid
{
NSNumber *num = [NSNumber numberWithInt:cid];
FMDatabase *database = [DatabaseTool shareDatabase];
[database executeUpdate:@"delete from contact where id = ?",num];
[DatabaseTool close];
}
@end
FMDB
iOS-sqlite3&FMDB使用代码示范的更多相关文章
- IOS数据库FMDB增、删、改、查的使用【原创】
http://blog.it985.com/13588.html IOS数据库FMDB增.删.改.查的使用[原创] FMDB是一个XCODE的中一个轻量级的数据库,用于将网络资源存储在本地.所以,FM ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- iOS——使用FMDB进行数据库操作(转载)
iOS 使用FMDB进行数据库操作 https://github.com/ccgus/fmdb [摘要]本文介绍iOS 使用FMDB进行数据库操作,并提供详细的示例代码供参考. FMDB 使用方法 A ...
- 关于AJAX 的交互模型、交互流程及代码示范
AJAX = 异步JavaScript + XML. 它是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况 ...
- ios蓝牙开发(三)ios连接外设的代码实现:手机app去读写蓝牙设备。
手机app去读写蓝牙设备....... 代码下载: 原文博客主提供Github代码连接,地址是:https://github.com/coolnameismy/demo ios连接外设的代码实现流程: ...
- iOS 蓝牙开发(二)iOS 连接外设的代码实现(转)
转载自:http://www.cocoachina.com/ios/20150917/13456.html 原文作者:刘彦玮 上一篇文章介 绍了蓝牙的技术知识,这里我们具体说明一下中心模式的应用场景. ...
- iOS开发关于Block代码错误
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4052362.html ,转载请注明出处. iOS开发关于Block代码错误 Incompatible bloc ...
- iOS书摘之编写高质量iOS与OS X代码的52个有效方法
来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...
- ios开发FMDB导入SQLCipher加密数据库
转:http://www.2cto.com/kf/201407/315727.html [iOS]FMDB/SQLCipher数据库加解密,迁移
随机推荐
- HTML 标签(一)
HTML HTML:超文本编辑语言(标签语言) 浏览器顺序渲染,从上到下,从左到右 是树型的 html格式 标签的属性是关键 meta标签 可提供有关页面的元信息 <meta charset=& ...
- lua在linxu和windows系统下的遍历目录的方法
在windows下遍历目录使用lfs库:例如遍历整个目录下的所有文件 local lfs = require "lfs" function findPathName(path) ...
- Scrapy+Chromium+代理+selenium
上周说到scrapy的基本入门.这周来写写其中遇到的代理和js渲染的坑. js渲染 js是爬虫中毕竟麻烦处理的一块.通常的解决办法是通过抓包,然后查看request信息,接着捕获ajax返回的消息.但 ...
- Python基础——时间
导入时间模块 import time 时间戳 print(time.time()) 获取本地时间 print(time.localtime(time.time())) 时间显示格式化 print(ti ...
- day13-生成器
def generator(): print(1) yield 'a' rcp = generator() print(rcp.__next__()) 只要含有yield关键字的函数都是生成器函数.y ...
- biological clock--class
'''this application aimed to cauculate people's biological block about emotional(28), energy(23),int ...
- 小谈python里 列表 的几种常用用法
在python中列表的常用方法主要包括增加,删除,查看和修改.下面以举例子的方法具体说明,首先我们创建两个列表,列表是用[ ]表示的,里面的元素用逗号隔开. a=[‘hello’,78,15.6,‘你 ...
- 如何提高UDP的可靠性
TCP是通过确认机制和超时重传机制实现可靠传输 UDP UDP它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频.视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数 ...
- Linux学习-X Server 配置文件解析与设定
X server 的配置 文件都是预设放置在 /etc/X11 目录下,而相关的显示模块或上面提到的总总模块,则主要放置在/usr/lib64/xorg/modules . 比较重要的是字型文件与芯片 ...
- Markdown 使用锚点
首先是建立一个跳转的连接: [说明文字](#jump) 然后标记要跳转到什么位置即可: <span id = "jump">跳转到这里:</span>