【iOS】sqlite3的使用(増删改查)

目录:

一、sqlite3常用函数

二、将sqlite3集成到项目,实现増删改查

三、封装DBManager

四、Demo

一、sqlite3常用函数及解释

(1)sqlite3_open:

用来创建和打开数据库文件,接收两个参数,第一个是数据库的名字,第二个是数据库的句柄。如果数据库文件不存在,将首先新建它,然后再打开它,否则只是打开它。

(2)sqlite3_prepare_v2:

使用格式化的字符串来获得sql准备语句(prepared statement),然后转化为可被SQLite3识别的执行语句。(实际上这个函数并不执行这个SQL语句)

(3)sqlite3_step:

这个函数执行上一个函数调用创建的准备语句,这个语句执行到结果的第一行可用的位置,再次调用sqlite3_setp(),会继续前进到结果的第二行。当执行插入、更新、删除操作时会被调用一次,当执行取回数据时可以执行多次。这个函数不能在sqlite3_preprare_v2之前调用。

(4)sqlite3_column_count:

返回表的列数

(5)sqlite3_column_text:

以text的格式返回列的内容(实际上是C的char*类型)。它接收两个参数,SQLite语句和列的索引。

(6)sqlite3_column_name:

返回列的名字,参数和上一个函数一样

(7)sqlite3_changes:

返回执行语句后受影响的行数

(8)sqlite3_last_insert_rowid:

返回最后插入的行的id

(9)sqlite3_errmsg:

返回SQLite错误描述

(10)sqlite3_finalize:

从内存删除之前sqlite3_prepare_v2函数创建的准备语句

(11)sqlite3_close:

关闭数据库连接,在结束任何数据库数据修改后调用,它将释放其存储的系统资源。

二、将sqlite3集成到项目,实现増删改查

1.首先需要将SQLite3的库添加到工程,输入sqlite,从推荐选项中选择libsqlite3.dylib  ,如下图。

2.导入sqlite3的头文件 :#import <sqlite3.h>

3.定义宏,方便后面使用,并声明一个sqlite3 句柄

#define DBNAME    @"myDB.sqlite"
#define TABLENAME @"PERSONINFO"
#define NAME      @"name"
@interface ViewController (){
    sqlite3 *db;
}

3.创建和打开数据库文件

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documents = [paths objectAtIndex:0];
  NSString *database_path = [documents stringByAppendingPathComponent:DBNAME];
  if (sqlite3_open([database_path UTF8String], &db)!= SQLITE_OK) {
       sqlite3_close(db);
       NSLog(@"打开数据库失败");
  }

4. 新建一个sql语句操作数据库的函数

-(void)execSql:(NSString *)sql
{
    char *err;
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
        sqlite3_close(db);
        NSLog(@"数据库操作数据失败!");
    }
}  

5.创建数据表,表名为2中的宏定义PERSONINFO

NSString *sqlCreateTable = @"CREATE TABLE IF NOT EXISTS PERSONINFO(peopleInfoID integer primary key, firstname text, lastname text, age integer);";
[self execSql:sqlCreateTable];  

6.插入一条名字为张三,年龄22岁的记录

NSString *sql = [NSString stringWithFormat:@"insert into peopleInfo values(null, '%@', '%@', %d)", @“张”,@“三”,22]; 

[self execSql:sql];

7.查询所有记录

NSString *sqlQuery = @"SELECT * FROM PERSONINFO";
   sqlite3_stmt * statement;  

   if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) {
       while (sqlite3_step(statement) == SQLITE_ROW) {
           char *firstName = (char*)sqlite3_column_text(statement, 1);
           NSString *firstNameStr = [[NSString alloc]initWithUTF8String:firstName];
             <pre name="code" class="objc">           char *lastName = (char*)sqlite3_column_text(statement, 2);
           NSString *lastNameStr = [[NSString alloc]initWithUTF8String:lastName];  

int age = sqlite3_column_int(statement, 3); NSLog(@"firstName:%@ lastName:%@ age:%d",firstNameStr,lastNameStr, age);

} } sqlite3_close(db);


三、封装DBManager

(1)新建一个添加一个DBManager类: 选择File > New > File…,选择 Cocoa Touch Class,单击下一步,按如图所示操作。

(2).h文件

#import <Foundation/Foundation.h>

@interface DBManager : NSObject

@property (nonatomic, strong) NSMutableArray *arrColumnNames;//存储列名
@property (nonatomic) int affectedRows;//记录被改变的行数
@property (nonatomic) long long lastInsertedRowID;//记录最后插入行的id

-(NSArray *)loadDataFromDB:(NSString *)query;//查询
-(void)executeQuery:(NSString *)query;//插入、更新、删除
-(instancetype)initWithDatabaseFilename:(NSString *)dbFilename;//初始化方法
-(BOOL)createTableWithSql:(const char *)sql_stmt;//新建表

@end

(3).m文件

#import "DBManager.h"
#import <sqlite3.h> //导入sqlite3的头文件

@interface DBManager()

@property (nonatomic, strong) NSString *documentsDirectory;
@property (nonatomic, strong) NSString *databaseFilename;
@property (nonatomic, strong) NSMutableArray *arrResults;

@end

@implementation DBManager

-(instancetype)initWithDatabaseFilename:(NSString *)dbFilename{
    self = [super init];
    if (self) {
        //获得存储路径
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        self.documentsDirectory = [paths objectAtIndex:0];

        //数据库名
        self.databaseFilename = dbFilename;
    }
    return self;
}

#pragma mark 建表
-(BOOL)createTableWithSql:(const char *)sql_stmt{
    BOOL isSuccess = YES;
    //检查数据库文件是否已经存在
    NSString *destinationPath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];
    NSLog(@"path:%@",destinationPath);
    if (![[NSFileManager defaultManager] fileExistsAtPath:destinationPath]) {
        sqlite3 *database = nil;
        const char *dbpath = [destinationPath UTF8String];
        if (sqlite3_open(dbpath, &database) == SQLITE_OK){
            char *errMsg;
            if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg)
                != SQLITE_OK)
            {
                isSuccess = NO;
                NSLog(@"Failed to create table");
            }
            sqlite3_close(database);
        }else{
            isSuccess = NO;
            NSLog(@"Failed to open/create table");
        }
    }
    return isSuccess;
}

#pragma mark 执行sql语句
-(void)runQuery:(const char *)query isQueryExecutable:(BOOL)queryExecutable{
    //创建一个sqlite3对象
    sqlite3 *sqlite3Database;

    //设置数据库路径
    NSString *databasePath = [self.documentsDirectory stringByAppendingPathComponent:self.databaseFilename];

    //初始化存储结果的array
    if (self.arrResults != nil) {
        [self.arrResults removeAllObjects];
        self.arrResults = nil;
    }
    self.arrResults = [[NSMutableArray alloc] init];

    //初始化存储列名的array
    if (self.arrColumnNames != nil) {
        [self.arrColumnNames removeAllObjects];
        self.arrColumnNames = nil;
    }
    self.arrColumnNames = [[NSMutableArray alloc] init];

    //打开数据库
    BOOL openDatabaseResult = sqlite3_open([databasePath UTF8String], &sqlite3Database);
    if(openDatabaseResult == SQLITE_OK) {
        //声明一个sqlite3_stmt对象,存储查询结果
        sqlite3_stmt *compiledStatement;

        //将所有数据加载到内存
        BOOL prepareStatementResult = sqlite3_prepare_v2(sqlite3Database, query, -1, &compiledStatement, NULL);
        if(prepareStatementResult == SQLITE_OK) {
            //是否是查询语句
            if (!queryExecutable){
                //用来保存每一行数据
                NSMutableArray *arrDataRow;

                //将结果一行行地加入到arrDataRow中
                while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                    //初始化arrDataRow
                    arrDataRow = [[NSMutableArray alloc] init];

                    //获得列数
                    int totalColumns = sqlite3_column_count(compiledStatement);

                    //读取和保存每一列数据
                    for (int i=0; i<totalColumns; i++){
                        //将数据转化为char
                        char *dbDataAsChars = (char *)sqlite3_column_text(compiledStatement, i);

                        //数据不为空则加到arrDataRow中
                        if (dbDataAsChars != NULL) {
                            //将char转化为string.
                            [arrDataRow addObject:[NSString  stringWithUTF8String:dbDataAsChars]];
                        }

                        //保存列名(只保存一次)
                        if (self.arrColumnNames.count != totalColumns) {
                            dbDataAsChars = (char *)sqlite3_column_name(compiledStatement, i);
                            [self.arrColumnNames addObject:[NSString stringWithUTF8String:dbDataAsChars]];
                        }
                    }

                    //如果不为空,将每行的数据保存到
                    if (arrDataRow.count > 0) {
                        [self.arrResults addObject:arrDataRow];
                    }
                }
            }
            else {
                //插入、更新、删除等操作
                if (sqlite3_step(compiledStatement) == SQLITE_DONE) {
                    // 被改变了多少行
                    self.affectedRows = sqlite3_changes(sqlite3Database);

                    // 最后插入的行id
                    self.lastInsertedRowID = sqlite3_last_insert_rowid(sqlite3Database);
                }
                else {
                    // 插入、更新、删除等错误
                    NSLog(@"DB Error: %s", sqlite3_errmsg(sqlite3Database));
                }
            }
        }
        else {
            //打开错误
            NSLog(@"%s", sqlite3_errmsg(sqlite3Database));
        }

        // 释放内存
        sqlite3_finalize(compiledStatement);

    }

    // 关闭数据库
    sqlite3_close(sqlite3Database);
}

-(NSArray *)loadDataFromDB:(NSString *)query{
    // 执行查询
    [self runQuery:[query UTF8String] isQueryExecutable:NO];

    // 返回查询结果
    return (NSArray *)self.arrResults;
}

-(void)executeQuery:(NSString *)query{
    // 执行插入、更新、删除等
    [self runQuery:[query UTF8String] isQueryExecutable:YES];
}

@end

四、使用三中DBManager完成一个Demo,实现增删改查,效果如下图,源代码:http://download.csdn.net/detail/dolacmeng/8816001

时间: 2024-10-25 00:22:01

【iOS】sqlite3的使用(増删改查)的相关文章

iOS开发-plist文件增删改查

plist第一次看到这个后缀名文件的时候感觉怪怪的,不过接触久了也就习以为常了,plist是Property List的简称可以理解成属性列表文件,主要用来存储串行化后的对象的文件.扩展名为.plist ,因此被称为 plist文件,xCode中默认的是一种树状的结构展现出来数据,可视化的动态增删改查,非常人性化,不过最终的结果是以XML形式存储的,Plist文件可以用于存储用户的一些设置信息,具体根据需求而定. 简单创建文件 简单创建文件就是说可以直接从xCode创建,右击项目new File

iOS 数据库SQL的增删改查语句实现

1: 创建数据库表格 1.1 — 表格创建使用一个数据库软件快速创建:软件大小14.3M; 下载地址:http://pan.baidu.com/s/1qWOgGoc; 表格创建-> 打开软件,点击第一个 "New SQLite Database" 开始创建表格 1.2 — 点击保存之后就又一个Student的sql在桌面,然后创建表格,点击上方按钮Database -> Create Table 为了方便,创建的表格名字和数据库名字一样 Student:添加4个参数,整形.

iOS Plist文件,增删改查

今天早上,9点开始弄Plist,然后一直写,一直写(中午取出40分钟吃饭时间),写到1点,写完了,交给头,头说,不是这个意思.我是每个用户创建了一个文件夹,在这个用户的文件夹里面,分别根据应用创建了文件夹,将Plist文件存在这个应用的文件夹中.头说:就只有一个Plist,这个Plist的命名是以用户名称来命名的,每个应用的名称和信息,记录在这个Plist文件里面.这个Document里面,只有一个Plist了..刚睡醒午觉的我,灰灰地又回去改,有了上午的经验,半个小时,就弄出来了.去给头请示,

iOS使用sqlite3原生语法进行增删改查以及FMDB的使用

转载自:http://www.cnblogs.com/Steak/p/3802508.html 首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去. 一种方法是从外面拷贝到程序里:http://www.cnblogs.com/Steak/p/3764395.html 另一种方法就是直接创建表,既然是操纵数据库,那么一定有一个数据库对象,sqlite是C库,所以需要一个C变量: 1 @interface DBHa

IOS开发中使用CNContact对通讯录增删改查

IOS开发中使用CNContact对通讯录增删改查 首先当然是把CNcontact包含在工程中: 1 @import Contacts; 1.下面是增加联系人的程序段: 1 CNMutableContact * contact = [[CNMutableContact alloc]init]; 2 contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"22"]); 3 //设置名字 4 contact.gi

IOS之分析网易新闻存储数据(CoreData的使用,增删改查)

用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的. 首先: 1.网易新闻用CoreData存储了新闻列表,因为我打开网易新闻的Documents时看到了三个文件: newsapp.sqlite,newsapp.sqlite-shm,newsapp.sqlite-wal:这三个文件是你在用CoreData时自动生成的.所以我确定他是用coredata存储的数据而不是sqlite数据库.(Core

Android_ADB 常用 shell命令 和 sqlite3 简单增删改查

今天学习了一个ADB的常用命令.接下来简单使用几个常用ADB shell 命令. 首先我们得明白什么是adb.exe ADB -Android Debug Bridge, 是 Android sdk 里的一个工具,用这个工具可以直接操作管理 Android 模拟器或者真实的 Android 设备 简单来说,ADB 是一个[客户端(pc)-服务器端(android)]程序. 当然,重要的一点是,你的 Android 设备得打开 USB 调试 ADB 的主要功能有: 1.运行设备的 shell(命令

IOS sqlite数据库增删改查

1.简单介绍 简单封装sqlite数据库操作类 BaseDB 用于完毕对sqlite的增删改查.使用前先导入libsqlite3.0.dylib库 2.BaseDB.h // // BaseDB.h // SqliteDemo // // Created by 赵超 on 14-8-26. // Copyright (c) 2014年 赵超. All rights reserved. // #import <Foundation/Foundation.h> #import "sqli

(原理篇)基于SQLite3轻量级封装,一行代码实现增删改查

最近写的项目中有用到数据库,写了不少蛋疼的sql语句,每次都是好几行代码,而且每次都是重复的没有一点技术含量的代码,虽然也有不少基于sqlite的封装,不过用起来还是感觉不够面向对象! 为了不再写重复的代码,花了几天时间,基于SQLite3简单封装了下,实现了一行代码解决增删改查等常用的功能!并没有太过高深的知识,主要用了runtime和KVC: 首先我们创建个大家都熟悉的Person类,并声明两个属性,下面将以类此展开分析 @interface Person : NSObject @prope