iOS开发周刊iOS开发技术分享iOS 开发

SQLite在iOS中的使用

2016-01-29  本文已影响1247人  侯垒

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>

上一篇下一篇

猜你喜欢

热点阅读