欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

fmdb(FMDatabase) 数据库总结

程序员文章站 2022-05-27 16:06:48
...

这段时间公司在做一个新的应用,用到了数据库。在网上找了一些资料,最后决定用fmdb来做。主要是用起来比较简单,适合刚接触数据库这方面的人。 一、步 首先是创建数据库: (NSString*)filePath:(NSString *)fileName { NSString *path=NSHomeDirectory(); /

这段时间公司在做一个新的应用,用到了数据库。在网上找了一些资料,最后决定用fmdb来做。主要是用起来比较简单,适合刚接触数据库这方面的人。

一、步 首先是创建数据库:

+(NSString*)filePath:(NSString *)fileName
{

NSString *path=NSHomeDirectory();


//拼接路径Library/Caches
path=[path stringByAppendingPathComponent:@"Library/Caches"];
NSLog(@"path=%@",path);
NSFileManager *fm=[NSFileManager defaultManager];
//检查指定的缓存目录是否存在
if ([fm fileExistsAtPath:path]) {
//检查要保存的文件名是否合法
if (fileName&& [fileName length]!=0) {
//拼接全路径
path=[path stringByAppendingPathComponent:fileName];
}
}
else{
NSLog(@"缓存目录不存在");
}
return path;
}


-(id)init
{

DataItem *item = [[DataItem alloc] init];
NSLog(@"090909090==%@",item.destination);
if (self=[super init]) {
//实例化第三方数据库操作类对象
//如果user.db文件不存在就创建新的
//存在就直接使用
fmdb=[[FMDatabase databaseWithPath:[Database filePath:@"user.db"]] retain];
//尝试打开数据库
if ([fmdb open]) {
//创建数据表
[self createTable];
}
}
return self;
}

二、 创建数据库表 需要建多个表所以用一个数组来保存建表语句,然后遍历数组执行建表语句


NSArray *reportinfoArray = [NSArray arrayWithObjects:@"CREATE TABLE IF NOT EXISTS report_info (report_id integer Primary Key Autoincrement,report_name Varchar(1024) DEFAULT NULL,user_id integer DEFAULT NULL“,nil];

以report_id为自增长的主建 在建表语句中将其声明为主建,在表的插入过程中 repord_id回从1开始自动增长不需要对其进行赋值。

for (NSString *sql in reportinfoArray) {
//执行sql语句
//创建表,增,删,改都用这个方法
if ([fmdb executeUpdate:sql]) {
NSLog(@"已创建");

}
else{
NSLog(@"创建表失败:%@",[fmdb lastErrorMessage]);;
}
}


三,插入 可一条一条插入也可批量插入

-(void)insertItem:(DataItem *)item
{
if ([self existsItem:item]) {
return;
}else{


NSString *sql=[NSString stringWithFormat:@"insert into report_info (report_name,user_id,any_invoice,allowance,advance_payment,report_aim,report_starttime,report_endtime,destination) values (?,?,?,?,?,?,?,?,?)"];
//变参方法,每个?号代表一个字段值,所有参数必须为对象类类型
if (sql) {
[fmdb executeUpdate:sql,item.report_name,item.user_id,item.any_invoice,item.allowance,item.advance_payment,item.report_aim,item.report_starttime,item.report_endtime,item.destination];
//获取最后一个插入的数据的主键
markID = [fmdb lastInsertRowId];
}
else{
NSLog(@"插入失败 :%@",[fmdb lastErrorMessage]);
}


}
}
批量插入
-(void)insertStayArray:(NSArray *)array
{
//开始批量操作
[fmdb beginTransaction];
for (DataItem *item in array) {
[self insertStayItem:item];
}
//提交所有修改
[fmdb commit];
}

注释:在插入过程中遇到了一个问题 再插入nsinteger 类型的数据的时候 程序会崩溃 后来的解决办法是[NSString stringWithFormat:@"%d",item.report_id] 将其转化为nsstring 类

型在进行插入。

四、删除相对简单 只需要根据其主键后按照某些特定条件进行删除

-(void)deletestay_info:(int)stay_id
{
NSString*delete=[NSString stringWithFormat:@"DELETE FROM stay_info WHERE stay_id = %d",stay_id];
BOOL a=[fmdb executeUpdate:delete];
if (a) {
NSLog(@"%d,删除成功!",stay_id);
}
}



五、查找 也是根据某些特定的条件进行查找

-(DataItem*)getStay_info:(int)stay_id
{

NSString *sql=[NSString stringWithFormat:@"select * from stay_info where stay_id=%d",stay_id];


//执行查询
FMResultSet *rs=[fmdb executeQuery:sql];
//如果有记录
DataItem *item=[[[DataItem alloc] init] autorelease];

while ([rs next]) {
//此方法是一组方法
//根据字段类型选择不同方法
item.stay_id = [rs longForColumn:@"stay_id"];
item.stay_endtime = [rs stringForColumn:@"stay_endtime"];
item.stay_company_pay = [rs stringForColumn:@"stay_company_pay"];
}

return item;

}


六、修改 根据要修改的内容判断满足怎样的条件需要修改


-(void)alerttraffic_info:(DataItem *)item
{
NSLog(@"traffic_destination = %@",item.traffic_destination);

NSLog(@"traffic_id=%d",item.traffic_id);
NSString*Name=[NSString stringWithFormat:@"UPDATE traffic_info SET traffic_kind = '%@' WHERE traffic_id = %d",item.traffic_kind,item.traffic_id];
[fmdb executeUpdate:Name];

NSString*trafficDate=[NSString stringWithFormat:@"UPDATE traffic_info SET traffic_date = '%@' WHERE traffic_id = %d",item.traffic_date,item.traffic_id];
[fmdb executeUpdate:trafficDate];

}