iOS-SQLite数据库使用介绍
iOS-SQLite数据库使用介绍
SQLite是MySQL的简化版,更多的运用与移动设备或小型设备上。SQLite的优点是具有可移植性,它不需要服务器就能运行,同时,它也存在一些缺陷,首先,没有提供简单的数据库创建方式,必须手工创建数据库,其次,SQLite没有面向对象接口,必须使用依赖于C语言代码的API。相对于OC,这套API既不那么优雅,也更难使用。当相比于用文件进行存储,还是更推荐使用SQLite进行数据存储。
使用数据库的前提条件
首先,需要添加依赖库libsqlite3.dylib。
在iOS9之后,依赖库中只有 .tbd文件,没有.dylib文件。
如何添加.dylib文件?
点击add other按钮
进入下面路径/usr/lib
,选中libsqlite3.dylib
文件,打开
常用方法介绍:
sqlite3 *db, 数据库句柄,跟文件句柄FILE很类似
sqlite3_stmt *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句
sqlite3_open(), 打开数据库,没有数据库时创建。
sqlite3_exec(), 执行非查询的sql语句
Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。
Sqlite3_close(), 关闭数据库文件
sqlite3_finalize,这个过程销毁前面被sqlite3_prepare创建的准备语句
还有一系列的函数,用于从记录集字段中获取数据,如
sqlite3_column_text(), 取text类型的数据。
sqlite3_column_blob(),取blob类型的数据
sqlite3_column_int(), 取int类型的数据
sqlite3_bind_text(), 绑定text类型的数据。
sqlite3_bind_blob(),绑定blob类型的数据
sqlite3_bind_int(), 绑定int类型的数据
sqlite3_bind_double(), 绑定浮点类型的数据
sqlite3_prepare(),将sql文本转换成一个准备语句,用于查询和有bind等使用时,封装出了sqlite3_exec()方法,现在建议在程序中使用sqlite3_prepare_v2这个函数,sqlite3_prepare只是用于前向兼容
数据库打开与创建
//在指定位置打开一个数据库,如果数据库不存在,则创建它
sqlite3 *database;
//[[self dataFilePath] UTF8String]将OC字符串装换成C字符串
if (sqlite3_open([[self dataFilePath] UTF8String], &database)!=SQLITE_OK) {
//关闭数据库
sqlite3_close(database);
NSAssert(0, @"open database faid!");
NSLog(@"数据库创建失败!");
}
//获取数据库存在路径
-(NSString *) dataFilePath{
NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *document = [path objectAtIndex:0];
return [document stringByAppendingPathComponent:TABLENAME];//'persion.sqlite'
}
注:由于sqlite3是基于C语言编写的,而不是纯粹的object-c,所以有关字符串,我们不能使用NSString,因为它不识别,所以只能用c语言的字符串,char*,好在Nsstring提供了转换的方法,那就是 UTF8String。
下面便是刚刚创建的路径
创建一张表
NSString *ceateSQL = @"CREATE TABLE IF NOT EXISTS PERSIONINFO(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER, SEX TEXT, WEIGHT INTEGER, ADDRESS TEXT)";
char *ERROR;
/*sqlite3_exec这个方法可以执行那些没有返回结果的操作,例如创建、插入、删除等,这个函数包含了sqlite3_prepare这个函数的操作,目的是将UTF-8格式的SQL语句转换为编译后的语句 */
if (sqlite3_exec(database, [ceateSQL UTF8String], NULL, NULL, &ERROR)!=SQLITE_OK){
sqlite3_close(database);
NSAssert(0, @"ceate table faild!");
NSLog(@"表创建失败");
}
我创建了一张名为PERSIONINFO的数据库表,其中有一个自增的ID,和NAME,AGE,SEX,WEIGTH,ADDRESS五个属性。
查询表数据
NSString *quary = @"SELECT * FROM PERSIONINFO";//SELECT ROW,FIELD_DATA FROM FIELDS ORDER BY ROW
sqlite3_stmt *stmt;
//sqlite3_prepare_v2的作用是将UTF-8格式的SQL语句转换为编译后的语句,并返回指向该语句的指针
if (sqlite3_prepare_v2(database, [quary UTF8String], -1, &stmt, nil) == SQLITE_OK) {
//sqlite3_step的作用是在编译后的语句中向前移动一条记录,SQLITE_ROW代表一行
while (sqlite3_step(stmt)==SQLITE_ROW) {
char *name = (char *)sqlite3_column_text(stmt, 1);
NSString *nameString = [[NSString alloc] initWithUTF8String:name];
self.nameTextField.text = nameString;
[nameString release];
int age = sqlite3_column_int(stmt, 2);
self.ageTextField.text = [NSString stringWithFormat:@"%d",age];
char *sex = (char *)sqlite3_column_text(stmt, 3);
NSString *sexString = [[NSString alloc] initWithUTF8String:sex];
self.sexTextField.text = sexString;
[sexString release];
int weight = sqlite3_column_int(stmt, 4);
self.weightTextField.text = [NSString stringWithFormat:@"%d",weight];
char *address = (char *)sqlite3_column_text(stmt, 5);
NSString *addressString = [[NSString alloc] initWithUTF8String:address];
self.addressTextField.text = addressString;
[addressString release];
}
//删除编译后的语句
sqlite3_finalize(stmt);
}
//用完了一定记得关闭,释放内存
sqlite3_close(database);
sqlite3_prepare_v2是执行查询的方法,当查询语句执行成功时,使用 sqlite3_step当游标指向每一行SQLITE_ROW时,我们开始读取数据 sqlite_3_column_text可以读取字符串类型的数据,参数二为column号,sqlite_3column_int读取int类型数据,其它的就不举例了,大家可以尝试。
保存,插入数据
char *update = "INSERT OR REPLACE INTO PERSIONINFO(NAME,AGE,SEX,WEIGHT,ADDRESS)""VALUES(?,?,?,?,?);";
//上边的update也可以这样写:
//NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES(?,?,?,?,?)",NAME,AGE,SEX,WEIGHT,ADDRESS];
char *errorMsg = NULL;
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
//【插入数据】在这里我们使用绑定数据的方法,参数一:sqlite3_stmt,参数二:插入列号,参数三:插入的数据,参数四:数据长度(-1代表全部),参数五:是否需要回调
sqlite3_bind_text(stmt, 1, [self.nameTextField.text UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 2, [self.ageTextField.text intValue]);
sqlite3_bind_text(stmt, 3, [self.sexTextField.text UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, [self.weightTextField.text integerValue]);
sqlite3_bind_text(stmt, 5, [self.addressTextField.text UTF8String], -1, NULL);
}
if (sqlite3_step(stmt) != SQLITE_DONE)
NSLog(@"数据更新失败");
NSAssert(0, @"error updating :%s",errorMsg);
sqlite3_finalize(stmt);
sqlite3_close(database);
当然,你也可以用大家熟知的,直接把数据写在要执行的sql语句后面,如下:
NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES('%@','%d','%@','%d','%@')",NAME,AGE,SEX,WEIGHT,ADDRESS,@"小杨",23,@"man",65,@"中国北京,haidian,shangdi,xinxiRoad,100014"];
//执行语句
if (sqlite3_exec(database, [insert UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {
sqlite3_close(database);
}
FMDB
FMDB是iOS平台的SQLite数据库框架,它是以OC的方式封装了SQLite的C语言API,它相对于cocoa自带的C语言框架有如下的优点:
使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码
对比苹果自带的Core Data框架,更加轻量级和灵活
提供了多线程安全的数据库操作方法,有效地防止数据混乱
注:github上地址: https://github.com/ccgus/fmdb
转载:
http://blog.csdn.net/mad1989/article/details/9322307
iOS-SQLite数据库使用介绍的更多相关文章
- Android SQLite 数据库详细介绍
Android SQLite 数据库详细介绍 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用 ...
- iOS sqlite数据库实现(转)
转载自:http://www.cnblogs.com/macroxu-1982/archive/2012/10/01/2709960.html 1 实现过程添加libsqlite3组件 选择项目后,在 ...
- iOS - SQLite 数据库存储
1.SQLite 数据库 SQLite 是一种轻型的嵌入式数据库,安卓和 iOS 开发使用的都是 SQLite 数据库.它占用资源非常低,在嵌入式设备中,可能需要几百 K 的内存数据就够了.他的处理速 ...
- 【转】iOS - SQLite 数据库存储
本文目录 1.SQLite 数据库 2.iOS 自带 SQLite 的使用 3.fmdb 的使用 4.fmdb 多线程操作 5.其他 SQLite 的第三方封装库 回到顶部 1.SQLite 数据库 ...
- IOS sqlite数据库增删改查
1.简单介绍 简单封装sqlite数据库操作类 BaseDB 用于完毕对sqlite的增删改查.使用前先导入libsqlite3.0.dylib库 2.BaseDB.h // // BaseDB.h ...
- iOS: sqlite数据库的基本操作
介绍: sqlite3(3是版本)是本地系统中的一个小型数据库,因为它没有在数据维护和安全上做过多的操作,所以它存储处理数据时,非常简单方便,但是它是不安全和不可靠的,如果一旦误操作删除了数据,是没有 ...
- iOS sqlite数据库图像化查看
问题描述:在xocde上用sqlite数据库的时候,因为没有图形化界面,有些时候很难看出自己设计的数据库是否有问题,比如我刚上手sqlite数据库设计id为自增长时,很自然的用了identify(1, ...
- iOS SQLite 数据库迁移
本文转载至 http://www.jianshu.com/p/c19dd08697bd 最近不得不考虑关于数据库迁移的问题,原先用了种很不好的处理方式(每次版本升级就删除本地数据库,太傻),于是开始考 ...
- 转:ios Sqlite数据库增删改查基本操作
研究了几天的数据库,终于把它给搞出来了.Sqlite是ios上最常用的数据库之一,大家还是有必要了解一下的.这是仿照网上的一个例子做的,有些部分写的不好,我稍作了修改,以讲解为主,主要让大家能够明白如 ...
- ios sqlite数据库操作
@interface MyViewController () { // 数据库实例,代表着整个数据库 sqlite3 *_db; } @end @implementation MyViewContro ...
随机推荐
- Metasploit介绍
Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估, 提供真正的安全风险情报.这些功能包括智能开发,密码审计 ...
- js 介绍
createjs 工作内容:html5游戏开发岗位要求:1. 熟悉HTML5特性, 掌握canvas开发技能;2.能独立的搭建出易扩展,高效,强壮,通用的前端底层框架;3.熟悉常用的JS开发框架或工具 ...
- PYTHON--CLASS
class Robot: population = 0 def __init__(self, name): self.name = name print("(Initializing {0} ...
- 使AspNetPager控件中文显示分页信息
在日常的编程过程中,很多学员对于使AspNetPager控件中文显示分页信息不是很清楚,本文将由达内的老师为各位学员介绍一下使AspNetPager控件中文显示分页信息的内容. AspNetPager ...
- 【UVA 10816】 Travel in Desert (最小瓶颈树+最短路)
[题意] 有n个绿洲, m条道路,每条路上有一个温度,和一个路程长度,从绿洲s到绿洲t,求一条道路的最高温度尽量小, 如果有多条, 选一条总路程最短的. InputInput consists of ...
- 窗口的子类化与超类化——子类化是窗口实例级别的,超类化是在窗口类(WNDCLASS)级别的
1. 子类化 理论:子类化是这样一种技术,它允许一个应用程序截获发往另一个窗口的消息.一个应用程序通过截获属于另一个窗口的消息,从而实现增加.监视或者修改那个窗口的缺省行为.子类化是用来改变或者扩展一 ...
- 【Xamarin挖墙脚系列:使用Xamarin进行Hybrid应用开发】
原文:[Xamarin挖墙脚系列:使用Xamarin进行Hybrid应用开发] 官方地址:https://developer.xamarin.com/guides/cross-platform/adv ...
- Knockout绑定audio的pause事件导致音频无法停止
...时间过得真快, 一晃4天已经过去了, 然而自己并没有动笔写什么. 自省. 看了看今天的工作, 感觉好像没什么可写的. 不禁在想是不是一天一篇有点儿难. 再一想, 这分明就是在给自己找理由. 就是 ...
- [cocos2d]cocos2d 2.1与ios 6.0
最近把xcode升级到4.5了,ios也编程6.0 mark一下需要修改的地方(针对于cocos2d 2.1版本),虽然都是warning,但是对于强迫症患者来说无法忍受啊~ 修改一 libs-Coc ...
- php Laravel 框架 介绍及安装
Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...