公司最近在做离线缓存的东西,用的是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
大家要是有不解之处可以参考代码