您的位置:首页 > 数据库

IOS 操作数据库(FMDB)

2014-11-27 11:00 134 查看
公司最近在做离线缓存的东西,用的是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

大家要是有不解之处可以参考代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: