IOS 操作数据库(FMDB)

公司最近在做离线缓存的东西,用的是sqlite数据库保存的。使用第三方类库FMDataBase对数据库进行相关操作,这是我写的一个小demo,废话不说,先上效果图:

在操作数据库的时候遇到了一点小问题,sqlite里面string类型就用text来存储,int型用integer,float用real,

需要注意的是:插入数据的时候如果string类型直接插入,但是要是float或者是integer类型就需要将插入值转化成NSNumber数据类型如下:[NSNumber numberWithInt:24]

在调试数据库操作的时候最好在模拟器上进行,然后打印出数据库路径,然后查看数据库里面的数据,是否存在,这里推荐一个查看sqlite数据库的软件,很小,功能不算强大但是也勉强够用了。(不要积分)

http://download.csdn.net/detail/zyzxrj/8203551

还需要注意一点,做数据库增删的时候不可查看数据库,这时候数据库会被锁住,导致插入或者删除失败。但是查询操作可以。

可参考下面语句

NSString *createMessageTable = @"create table if not exists message(messageNo integer primary key,failldReason
text,contract text,contractPhone text,isRead integer, orderStatus integer, messageType integer, acceptMessageTime text,appointedTime text,orderDate text,startStation text,arrivalStation text,transportLocation text,tradeNo text) ";

这个界面我为了省时间直接xib拖得,相信有一定ios开发基础的人都可以用代码写出来,我也不废话了,主要说一些数据库操作的问题:

DataBaseViewController.h:

#import <UIKit/UIKit.h>

@interface DataBaseViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *nameTextField;
@property (weak, nonatomic) IBOutlet UITextField *sexTextField;
@property (weak, nonatomic) IBOutlet UITextField *ageTextField;

- (IBAction)save:(id)sender;
- (IBAction)query:(id)sender;
- (IBAction)queryByCondition:(id)sender;
- (IBAction)update:(id)sender;
- (IBAction)deleteByCondition:(id)sender;

@end

DataBaseViewController.m:

//
//  DataBaseViewController.m
//  Location
//
//  Created by admin on 14-11-17.
//  Copyright (c) 2014年 admin. All rights reserved.
//

#import "DataBaseViewController.h"
#import "FMDatabase.h"
#import "FMDatabaseQueue.h"
#define IOS7_OR_LATER   ([[[UIDevice currentDevice] systemVersion]floatValue] >= 7.0)
@interface DataBaseViewController ()

@end

@implementation DataBaseViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //控制器,点击空白地方,隐藏键盘
    CGRect cgrect = self.view.frame;
    if (!IOS7_OR_LATER) {
        cgrect.origin.y -= 20;
    }
    UIControl *clickControl = [[UIControl alloc] init];
    clickControl.frame = cgrect;
    [clickControl addTarget:self action:@selector(hideKeyboard) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:clickControl];
    [self.view sendSubviewToBack:clickControl];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
//隐藏软键盘
- (void)hideKeyboard
{
    [_nameTextField resignFirstResponder];
    [_ageTextField resignFirstResponder];
    [_sexTextField resignFirstResponder];
}
- (IBAction)save:(id)sender {
    //获取Document文件夹下的数据库文件,没有则创建
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];
    NSLog(@"%@",dbPath);
    //获取数据库并打开
    FMDatabase *dataBase = [FMDatabase databaseWithPath:dbPath];
    if (![dataBase open]) {
        NSLog(@"打开数据库失败");
        return ;
    }
    //创建表(FMDB中只有update和query操作,出了查询其他都是update操作)
    [dataBase executeUpdate:@"create table if not exists user(name text,gender text,age integer) "];
    //插入数据
    BOOL inser = [dataBase executeUpdate:@"insert into user values(?,?,?)",_nameTextField.text,_sexTextField.text,_ageTextField.text];
    if (inser) {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"信息保存成功" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
        [alert show];
    }
    [dataBase close];
}
//查询全部
- (IBAction)query:(id)sender {
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];

    FMDatabase *dataBase = [FMDatabase databaseWithPath:dbPath];
    if (![dataBase open]) {
        NSLog(@"打开数据库失败");
        return ;
    }
    FMResultSet *resultSet = [dataBase executeQuery:@"select * from user"];
    while ([resultSet next]) {
        NSString *name = [resultSet stringForColumn:@"name"];
        NSString *genter = [resultSet stringForColumn:@"gender"];
        int age = [resultSet intForColumn:@"age"];
        NSLog(@"Name:%@,Gender:%@,Age:%d",name,genter,age);
    }

    [dataBase close];
}
//条件查询
- (IBAction)queryByCondition:(id)sender {
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];
    FMDatabase *dataBase = [FMDatabase databaseWithPath:dbPath];
    if (![dataBase open]) {
        return ;
    }
//    FMResultSet *resultSet = [dataBase executeQuery:@"select *from user where name = ?",@"ZY"];
    FMResultSet *resultSet = [dataBase executeQueryWithFormat:@"select * from user where name = %@",@"zy"];
    while ([resultSet next]) {
        NSString *name = [resultSet stringForColumnIndex:0];
        NSString *gender = [resultSet stringForColumn:@"gender"];
        int age = [resultSet intForColumn:@"age"];
        NSLog(@"Name:%@,Gender:%@,Age:%d",name,gender,age);
    }
    [dataBase close];
}

- (IBAction)update:(id)sender {
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];
    FMDatabase *dataBase = [FMDatabase databaseWithPath:dbPath];
    if (![dataBase open]) {
        return ;
    }
    //参数必须是NSObject的子类,int,double,bool这种基本类型,需要封装成对应的包装类才可以
    BOOL update = [dataBase executeUpdate:@"update user set age = ? where name = ?",[NSNumber numberWithInt:24],@"ZY"];
    if (update) {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"信息更新成功" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
        [alert show];
    }
    [dataBase close];
}

- (IBAction)deleteByCondition:(id)sender
{
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *dbPath = [docPath stringByAppendingPathComponent:@"user.db"];
    FMDatabase *dataBase = [FMDatabase databaseWithPath:dbPath];
    if (![dataBase open]) {
        return ;
    }
    BOOL delete = [dataBase executeUpdateWithFormat:@"delete from user where name = %@",@"zy"];
    if (delete) {
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"信息删除成功" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];
        [alert show];
    }
    [dataBase close];
}

@end

下面是整个demo的源文件(不要积分的):

http://download.csdn.net/detail/zyzxrj/8203583

大家要是有不解之处可以参考代码

时间: 2024-11-11 20:42:02

IOS 操作数据库(FMDB)的相关文章

iOS开发 数据库FMDB

iOS开发  数据库FMDB 1.简介 需求作用: 如果需要保存大量的结构较为复杂的数据时候, 使用数据库, 例如交规考试项目 常用的数据库: (1)Microsoft SQL Server 2000/2008, 中小企业使用较多 (2)Oracle 比较复杂, 大企业使用较多 (3)Mysql数据库, 网站使用较多 (4)sqlite: 本地数据库, 访问数据足够快, 直接访问文件 足够简单, 功能相对其他数据库软件不是特别齐全, 足够用了  足够小, 系统不超过1M, 适合在移动端上使用 2

IOS第三方数据库--FMDB

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包. FMDB同时兼容ARC和非ARC工

iOS开发数据库-FMDB

前言 FMDB是以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码:对比苹果自带的Core Data框架,更加轻量级和灵活:提供了多线程安全的数据库操作方法,有效地防止数据混乱:FMDB同时兼容ARC和非ARC工程,在编译的时候会自动根据工程配置来调整相关的内存管理代码. 使用方法 FMDB有三个主要的类 FMDatabase 表示一个单独的SQLite数据库. 用来执行SQLite的命令. FMResultSet 表示FMDatabase执行查

iOS数据库操作(使用FMDB)

iOS学习笔记(十六)——数据库操作(使用FMDB) 分类: iOS开发 2013-07-15 23:19 8655人阅读 评论(5) 收藏 举报 目录(?)[+] iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一

iOS 数据库操作(使用FMDB)

iOS 数据库操作(使用FMDB) iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包.

iOS开发之用代码实现数据库FMDB的操作

iOS开发之用代码实现数据库FMDB的操作 1.简介 需求作用: 如果需要保存大量的结构较为复杂的数据时候, 使用数据库, 例如交规考试项目 常用的数据库: (1)Microsoft SQL Server 2000/2008, 中小企业使用较多 (2)Oracle 比较复杂, 大企业使用较多 (3)Mysql数据库, 网站使用较多 (4)sqlite: 本地数据库, 访问数据足够快, 直接访问文件 足够简单, 功能相对其他数据库软件不是特别齐全, 足够用了  足够小, 系统不超过1M, 适合在移

iOS数据库操作之FMDB框架的使用

原文链接:http://blog.csdn.net/xyz_lmn/article/details/9312837 iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文

iOS学习笔记(十六)——数据库操作(使用FMDB)

iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入如下文件,并使用 libsqlite3.dylib 依赖包. FMDB同时兼容ARC和非ARC工

iOS开发数据库篇—FMDB数据库队列(下)

iOS开发数据库篇—FMDB数据库队列(下) 一.代码示例 1.需要先导入FMDB框架和头文件,由于该框架依赖于libsqlite库,所以还应该导入该库. 2.代码如下: 1 // 2 // YYViewController.m 3 // 05-FMDB数据库队列 4 // 5 // Created by apple on 14-7-28. 6 // Copyright (c) 2014年 wendingding. All rights reserved. 7 // 8 9 #import "Y