SQLite在iOS中的使用

SQLite,是一款轻型的数据库。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,目前最新的版本是Sqlite3。

先给大家介绍几个概念。

记录:我们通常把表中能表达一条完整的信息叫做一个“记录”,可以对应Model的一个对象。<br >
字段:在数据库中,大多数时,表的“列”称为“字段” ,每个字段包含某一专题的信息。对应着Model类中的属性。<br >
主键(primary key):是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。在两个表的关系中,主关键字用来在一个表中引用来自于另一个表中的特定记录。主关键字是一种唯一关键字,表定义的一部分。一个表不能有多个主关键字,并且主关键字的列不能包含空值。主关键字是可选的,并且可在 CREATE TABLE 或 ALTER TABLE 语句中定义。<br >
外键(Foreign Key):在本表A中是主键,在另外一张表中不是主键,而是普通的字段,那个这个字段可以称之为表A的外键

sqlite中常用到的类型

NULL. 值是空值。

INTEGER. 值是有符号整数,根据值的大小以1,2,3,4,6 或8字节存储。

REAL. 值是浮点数,以8字节 IEEE 浮点数存储。

TEXT. 值是文本字符串,使用数据库编码(UTF-8, UTF-16BE 或 UTF-16LE)进行存储。

BLOB. 二进制数据类型。

常见的sqlite的增、删、改、查常用操作

1.创建表

CREATE TABLE IF NOT EXISTS UserTable (username TEXT primary key,password TEXT,email TEXT);

2.插入一条数据

INSERT OR REPLACE INTO UserTable (username , password,email) VALUES (?,?,?);

3.更新一条数据

UPDATE UserTable set password = '123456' where username = 'wxhl';

4.查询数据

SELECT username,password,email FROM UserTable where username = 'wxhl'

5.删除数据

DELETE FROM UserTable WHERE username='wxhl'

6.模糊查询

SELECT *FROM UserTable Where username is LIKE "侯%"

7.倒叙排列(默认正)

SELECT *FROM UserTable ORDER BY sage DESC

看看在iOS工程中的使用 Model类的封装 <code>

//  Created by 侯垒 on 16/1/29.
//  Copyright (c) 2012年 Se7eN_HOU. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface StudnetModel : NSObject

@property(nonatomic)int ID;
@property(nonatomic)int age;
@property(strong,nonatomic)NSString *phone;
@property(strong,nonatomic)NSString *name;
@property(strong,nonatomic)NSData *data;
-(id)initWithName:(NSString *)name andAge:(int)age andId:(int)ID andAddres:(NSString *)phone andPhoto:(NSData *)imageData;
@end

</code>

数据库工具类的封装<code>

//
//  Created by 侯垒 on 16/1/29.
//  Copyright (c) 2016年 Se7eN_HOU. All rights reserved.
//
# import <Foundation/Foundation.h>
# import <sqlite3.h>//系统内嵌数据库文件
# import "StudnetModel.h"//导入model类<br >

@interface DataBaseManager : NSObject<br >
+(sqlite3 *)openDB;//打开数据库操作
+(void)closeDB;//关闭数据库的操作
//向数据库里面添加一个记录
+(BOOL)addStudent:(StudnetModel *)stu;
//根据条件修改一个记录的值
+(BOOL)updateStuentName:(NSString *)name andAge:(int)age andPhone:(NSString *)phone whereIDIsEqual:(int)ID;
//查找全部
+(NSMutableArray *)findAll;
//根据ID删除一条记录
+(BOOL)deleteByID:(int)ID;
@end

</code>

打开数据库的方法 <code>

+(sqlite3 *)openDB
{
    if (db)
    {
        //能进到该if语句数据数据库对象已经创建过了,只要直接把原来创建的数据库对象直接返回出去就行
        return db;
    }

   //没有创建数据库的时候,就要先创建数据库//1、找到数据库文件要存放的路径
    NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
   //2、在该路径下创建一个数据库文件的路径
    NSString *filePath=[docPath stringByAppendingPathComponent:@"StudentDB.sqlite"];
NSLog(@"filePath=%@",filePath);
   //3、在该数据库路径下创建一个数据库文件
  /*
  //因为sqlite用的是C级别语言,所以这里需要将OC的语法都转化为C的语法,
  //参数一:数据库的路径,并且要转化成C的路径
  //参数二:你要操作那个数据库对象
  //这一行代码就是告诉编译器,以后我都用db这个指针来操作硬盘里面的数据库文件
   */
  int state=sqlite3_open([filePath UTF8String], &db);
  if (state!=SQLITE_OK)
  {
      NSLog(@"数据库打开失败");
      return nil;
  }
  //4、创建一个表,用来存放数据(SQL语句)
   NSString *createTableStr=@"create table if not exists classA(ID integer primary key,name text,phone text,age integer,photo BLOB)";
  //sqlite3_exec:数据库使用的函数
  //参数一:你要使用的是哪一个数据库
  //参数二:你要对数据库做什么操作(创建表,增,删,改,查)
  //参数三,四:系统预留参数
  //参数五:错误信息,指针的指针,填写地址
  char *errmsg;
  if (sqlite3_exec(db,[createTableStr UTF8String], NULL, NULL, &errmsg))
  {
      //能进到该if语句里面,说明操作成功
      sqlite3_close(db);//关闭数据库
      sqlite3_free(errmsg);//释放指针;
  }
  //把创建好的表返回出去
    return db;
}

</code>

关闭数据库<code>

+(void)closeDB
{
    if (db)
    {
        sqlite3_close(db);
    }
}

</code>

向数据库中添加数据<code>

#pragma mark- 添加
+(BOOL)addStudent:(StudnetModel *)stu
{   //1、打开数据库
    sqlite3 *db=[DataBaseManager openDB];
    //2、创建一个数据库管理员
    sqlite3_stmt *stmt=nil;
    //3、准备添加的sql语句
    //准备执行的语句
    //参数一:准备对哪一个数据库操作
    //参数二:sql语句 ?是展位符
    //参数三:-1:(自动计算长度)
    //参数四:用谁去操作数据
    //参数五:系统预留参数
    int state= sqlite3_prepare_v2(db,"insert into classA(name,phone,age,photo) values(?,?,?,?)" , -1, &stmt, nil);
    if (state==SQLITE_OK)
    {
        //参数1:用仓库管理员去操作数据的写入
        //参数2:对哪一个?(字段)进行赋值
        //参数3:写入数据库的具体的值
        //参数4:-1
        //参数5:系统预留参数
        //对?进行具体的赋值
        sqlite3_bind_text(stmt, 1, [stu.name UTF8String], -1, nil);
        sqlite3_bind_text(stmt, 2, [stu.phone UTF8String], -1, nil);
        sqlite3_bind_int(stmt, 3, stu.age);
        sqlite3_bind_blob(stmt, 4, stu.data.bytes, stu.data.length, nil);

        //一步一步去执行的方法
        int result= sqlite3_step(stmt);
        if (result==SQLITE_DONE)
        {
            //SQLITE_DONE = sqlite3_step() has finished executing
            //进到该if语句说明添加成功
            return YES;
        }
    }
    return NO;
}

</code>

修改数据<code>

#pragma -mark更改
+(BOOL)updateStuentName:(NSString *)name andAge:(int)age andPhone:(NSString *)phone whereIDIsEqual:(int)ID
{
    //1、打开数据库
    sqlite3 *db=[DataBaseManager openDB];
    //2、创建数据的管理员
    sqlite3_stmt *stmt=nil;
    //3、准备修改的SQL语句
    int result=sqlite3_prepare_v2(db,"update classA set name = ?,phone = ?,age =? where ID = ?", -1, &stmt, nil);
    //4、如果sql语句没有错误,进行具体的赋值
    if (result==SQLITE_OK)
    {
        //对问号的赋值
        sqlite3_bind_text(stmt, 1,[name UTF8String], -1, nil);
        sqlite3_bind_text(stmt, 2,[phone UTF8String], -1, nil);
        sqlite3_bind_int(stmt, 3, age);
        sqlite3_bind_int(stmt, 4, ID);
        int state = sqlite3_step(stmt);
        if (state==SQLITE_DONE)
        {
            return YES;
        }
    }
    return NO;
}

</code>

查询数据<code>

  #pragma mark- 查找全部
  +(NSMutableArray *)findAll
  {
  //1
  sqlite3 *db=[DataBaseManager openDB];
  //2
  sqlite3_stmt *stmt=nil;
  //3
  int result=sqlite3_prepare_v2(db,"select * from classA", -1, &stmt, nil);
  //4
  NSMutableArray *allStudentArray=[[NSMutableArray alloc] init];
  if (result==SQLITE_OK)
  {
      //开始搜索

      //SQLITE_ROW= sqlite3_step() has another row ready
      //SQLITE_ROW只要数据库里面还有下一行,就会自动循环
      while (SQLITE_ROW==sqlite3_step(stmt))
      {
          //sqlite3_column_int从数据库里面读取数据的方法
          int ID=sqlite3_column_int(stmt, 0);
          const unsigned char *name=sqlite3_column_text(stmt, 1);
          const unsigned char *phone=sqlite3_column_text(stmt, 2);
          int age=sqlite3_column_int(stmt, 3);
        
        
         const void *bytes = sqlite3_column_blob(stmt, 4);
          int length = sqlite3_column_bytes(stmt, 4);
          NSData *data = [NSData dataWithBytes:bytes length:length];
        
          //将从数据库里面读取出来的C语言级别数据转化为OC的类型的数据再赋值给Model类
          StudnetModel *student=[[StudnetModel alloc] init];
          student.ID=ID;
          student.name=[NSString stringWithUTF8String:(char *)name];
          student.phone=[NSString stringWithUTF8String:(char *)phone];
          student.age=age;
          student.data = data;
          [allStudentArray addObject:student];
      }
  }
   return allStudentArray;
}

</code>

删除数据<code>

+(BOOL)deleteByID:(int)ID
{
sqlite3 *db=[DataBaseManager openDB];
sqlite3_stmt *stmt=nil;
int result=sqlite3_prepare_v2(db,"delete from classA where ID = ?", -1, &stmt, nil);
if (result==SQLITE_OK)
{
    sqlite3_bind_int(stmt, 1, ID);
    int state=sqlite3_step(stmt);
    if (state==SQLITE_DONE)
    {
        return YES;
    }
    
}
return NO;
}

</code>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容