数据库操作是我们使用十分频繁的一份操作,在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使用代码示范的更多相关文章

  1. IOS数据库FMDB增、删、改、查的使用【原创】

    http://blog.it985.com/13588.html IOS数据库FMDB增.删.改.查的使用[原创] FMDB是一个XCODE的中一个轻量级的数据库,用于将网络资源存储在本地.所以,FM ...

  2. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  3. iOS——使用FMDB进行数据库操作(转载)

    iOS 使用FMDB进行数据库操作 https://github.com/ccgus/fmdb [摘要]本文介绍iOS 使用FMDB进行数据库操作,并提供详细的示例代码供参考. FMDB 使用方法 A ...

  4. 关于AJAX 的交互模型、交互流程及代码示范

    AJAX  = 异步JavaScript + XML. 它是一种用于创建快速动态网页的技术.通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况 ...

  5. ios蓝牙开发(三)ios连接外设的代码实现:手机app去读写蓝牙设备。

    手机app去读写蓝牙设备....... 代码下载: 原文博客主提供Github代码连接,地址是:https://github.com/coolnameismy/demo ios连接外设的代码实现流程: ...

  6. iOS 蓝牙开发(二)iOS 连接外设的代码实现(转)

    转载自:http://www.cocoachina.com/ios/20150917/13456.html 原文作者:刘彦玮 上一篇文章介 绍了蓝牙的技术知识,这里我们具体说明一下中心模式的应用场景. ...

  7. iOS开发关于Block代码错误

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4052362.html ,转载请注明出处. iOS开发关于Block代码错误 Incompatible bloc ...

  8. iOS书摘之编写高质量iOS与OS X代码的52个有效方法

    来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...

  9. ios开发FMDB导入SQLCipher加密数据库

    转:http://www.2cto.com/kf/201407/315727.html [iOS]FMDB/SQLCipher数据库加解密,迁移

随机推荐

  1. 【转】iOS开发-文件管理(一)

    iOS开发-文件管理(一) 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立.封闭.安全的空间,叫做沙盒.它一般存放着程序包文件(可执行文件).图片.音频.视频.pli ...

  2. halt, reboot, poweroff - 中止系统运行

    SYNOPSIS /sbin/halt [-n] [-w] [-d] [-f] [-i] [-p] /sbin/reboot [-n] [-w] [-d] [-f] [-i] /sbin/powero ...

  3. python_106_创建类的两种方式

    class Foo(object): def __init__(self, name): self.name = name f = Foo("alex") print(type(f ...

  4. Python-DDT实现接口自动化

    Get请求参数化例子 import unittest import requests import ddt @ddt.ddt class MyTestCase(unittest.TestCase): ...

  5. java基础—object类

    一.Object类介绍

  6. 作业题:输出单个字符 输入单个字符 scanf printf

    输出单个字符用putchar() #include <iostream> using namespace std; int main(){ char x='B'; char y='O'; ...

  7. DNS预解析 dns-prefetch

    1.DNS 是什么? Domain Name System,域名系统,作为域名和IP地址相互映射的一个分布式数据库. DNS大家都懂,那么浏览器访问域名的时候,是需要去解析一次DNS,也就是把域名 g ...

  8. paper:synthesizable finit state machine design techniques using the new systemverilog 3.0 enhancements之fsm summary

    主要是1.不要用1段式写FSM 2.不要用状态编码写one-hot FSM ,要用索引编码写one-hot FSM.

  9. 爬取豆瓣Top250_Ajax动态页面

    爬取网址: 完整代码: import sys from urllib import request, parse import ssl ssl._create_default_https_contex ...

  10. HDU 3861 The King’s Problem 强连通分量 最小路径覆盖

    先找出强连通分量缩点,然后就是最小路径覆盖. 构造一个二分图,把每个点\(i\)拆成两个点\(X_i,Y_i\). 对于原图中的边\(u \to v\),在二分图添加一条边\(X_u \to Y_v\ ...