iOS-SQLite数据库使用介绍

摘要:
类似于文件句柄file sqlite3_Stmt*Stmt,用于保存已编译的SQL语句sqlite3_Open(),执行非查询SQL语句sqlite3_Step(),绑定类型为int _ bind_ Double()的数据sqlite3,现在建议在程序中使用sqlite3 _ prepare_ v2函数sqlite3_prepare仅用于打开和创建前向兼容的数据库//在指定位置打开数据库。
iOS-SQLite数据库使用介绍

SQLite是MySQL的简化版,更多的运用与移动设备或小型设备上。SQLite的优点是具有可移植性,它不需要服务器就能运行,同时,它也存在一些缺陷,首先,没有提供简单的数据库创建方式,必须手工创建数据库,其次,SQLite没有面向对象接口,必须使用依赖于C语言代码的API。相对于OC,这套API既不那么优雅,也更难使用。当相比于用文件进行存储,还是更推荐使用SQLite进行数据存储。

使用数据库的前提条件

首先,需要添加依赖库libsqlite3.dylib。
在iOS9之后,依赖库中只有 .tbd文件,没有.dylib文件。

如何添加.dylib文件?

iOS-SQLite数据库使用介绍第1张

点击add other按钮
iOS-SQLite数据库使用介绍第2张
进入下面路径/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

http://blog.csdn.net/totogo2010/article/details/7702207

http://blog.csdn.net/ryantang03/article/details/7781930

免责声明:文章转载自《iOS-SQLite数据库使用介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇使用GDI+保存位图文件为PNG文件Android学习笔记.9.png格式图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

日期/时间 相关查询

获取当前月份的第一天 运行这个命令能快速返回当前月份的第一天。你可以用任何的日期值替换 “SYSDATE”来指定查询的日期。 SELECT TRUNC (SYSDATE, 'MONTH') "First day of current month"      FROM DUAL; 获取当前月份的最后一天 这个查询语句类似于上面那个语句,而且充...

基于.NET Standard的分布式自增ID算法--Snowflake

概述 本篇文章主要讲述分布式ID生成算法中最出名的Snowflake算法。搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier。 那么为何还要引入snowflake呢? INT自增主键 自增主键是解决主键生成的最简单方案,它有如下优势: 数据库本身负责主键生成,效率高 数据库本身保证主键顺序递增,方...

ETL工具之Kettle的简单使用一(不同数据库之间的数据抽取-转换-加载)

ETL工具之Kettle将一个数据库中的数据提取到另外一个数据库中: 1.打开ETL文件夹,双击Spoon.bat启动Kettle 2.资源库选择,诺无则选择取消 3.选择关闭 4.新建一个转换 5.配置所需数据库 6.将需要进行提取的数据表,用表输入得到 7.选择源数据所在数据库及表,sql语句可自...

sqlserver2008r2 版本数据库迁移到2019版本导致查询效率慢的解决方法

1、在sqlserver2008 版本的数据库引擎创建数据库后,迁移到sqlserver2019版本,存储过程查询效率变慢了。 2、主要原因:使用sqlserver2019版本的数据库软件创建,默认是不往低版本的数据库软件兼容。 3、处理版本,右击数据库-》属性-》选项-》兼容级别,选择SQL Server 2008 (100) 即可。    ...

mongoDB系列之(一):10分钟玩转mongoDB

1.mongoDB是什麽mongodb是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key-Value形式。 存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary JSON)。 模式自由(schema-free),意味着对于存储在mong...

ORM框架:Entity Framework

ORM框架:Entity Framework 1.Entity Framework的概念 什么是ORM 对象-关系映射(Object/Relational Mapping,简称ORM),用来把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。这样在具体的操作实体对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作实体对象的属性和方法。...