热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS原生SQLite3使用

#import<FoundationFoundation.h>#import<sqlite3.h>@interfaceDatabase:NSObject+

#import

#import

@interface Database : NSObject

+ (sqlite3 *)openDB;

+ (void)closeDB;

@end

#define FILE_NAME @"Database.sqlite"


#import "Database.h"


static sqlite3 *db =nil;

@implementation Database

+ (sqlite3 *)openDB{

    if (!db) {

        //1.获取document文件夹的路径

        //参数1:文件夹的名字参数2:查找域参数3:是否使用绝对路径

        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0];

        //获取数据库文件的路径

        NSString *dbPath = [documentPathstringByAppendingPathComponent:@"Database.sqlite"];

        //iOS中管理文件的类,负责复制文件,删除文件,移动文件

//        NSFileManager *fm = [NSFileManager defaultManager];

        //判断document中是否有sqlite文件

        int result =sqlite3_open([dbPath UTF8String], &db);

        if (result ==SQLITE_OK) {

            NSLog(@"打开数据库");

        }else{

            NSLog(@"打开数据库失败");

        }


//        if (![fm fileExistsAtPath:dbPath]) {

//            //获取*.appsqlite文件的路径

//            NSString *boundlePath = [[NSBundle mainBundle] pathForResource:@"Database" ofType:@"sqlite"];

//            NSError *error = nil;

//            //*.appsqlite文件复制一份到dbPath

//             BOOL result = [fm copyItemAtPath:boundlePath toPath:dbPath error:&error];

//            //若复制文件失败,打印错误信息

//            if (!result) {

//                NSLog(@"%@",error);

//            }

//        }

        //打开数据库参数1:文件路径(UIF8String可以将OCNSString转为c中的char)参数2:接受数据库的指针

       

    }

    returndb;

}


+ (void)closeDB{

    sqlite3_close(db);

    db = nil;

}

@end

#import

#import "Student.h"

@interface DatabaseHelper : NSObject

+ (NSMutableArray *)getAllStudents;

+ (Student *)getStudentWithID:(NSInteger)aID;

+ (BOOL)insertStudent:(Student *)aStudent;

+ (BOOL)updateStudentName:(NSString *)aName byID:(NSInteger)aID;

+ (BOOL)deleteStudentWithID:(NSInteger)aID;

+ (void)createTablels;

@end

#import "DatabaseHelper.h"


#import "Database.h"

#import

@implementation DatabaseHelper

+ (void)createTablels{

    sqlite3 *db = [DatabaseopenDB];

    //create table if not exists t_persons (c_id integer primary key autoincrement,c_deviceType text,c_UDN text,c_friendlyName text,c_history_time integer,c_desc text)

    char *sql ="create table if not exists t_persons (c_id integer primary key autoincrement,c_name text,c_sex text,c_age integer,c_desc text)";

    char *error;

    //执行创建语句并接受

    int result =sqlite3_exec(db, sql, NULL, NULL, &error);

    //判断是否创建成功

    if (result !=SQLITE_OK) {

        NSLog(@"创建数据表失败  %s",error);

    }else{

        NSLog(@"数据库表创建成功");

    }

    [DatabasecloseDB];

}



+ (NSMutableArray *)getAllStudents{

    //打开数据库

    sqlite3 *db = [DatabaseopenDB];

    //数据库操作指针 stmt:statement

    sqlite3_stmt *stmt=nil;

    //验证SQL的正确性参数1:数据库指针,参数2:SQL语句,参数3:SQL语句的长度   -1代表无限长(会自动匹配长度),参数4:返回数据库操作指针,参数5:为未来做准备的,预留参数,一般写成NULL

    int result =sqlite3_prepare_v2(db, "select * from t_persons", -1, &stmt,NULL);

    NSMutableArray *studentArr =@[].mutableCopy;

    //判断SQL执行的结果

    if (result ==SQLITE_OK) {

        //存在一行数据

        while (sqlite3_step(stmt) ==SQLITE_ROW) {

            int ID =sqlite3_column_int(stmt,0);

            constunsigned char *name =sqlite3_column_text(stmt,1);

            constunsigned char *sex =sqlite3_column_text(stmt,2);

            int age =sqlite3_column_int(stmt,3);

            //blob类型的获取二进制对象

            //1 获取长度

            int length =sqlite3_column_bytes(stmt,4);

            //2 获取数据

            constvoid *photo = sqlite3_column_blob(stmt,4);

            //3 转成NSData

            NSData *photoData = [NSDatadataWithBytes:photo length:length];

            //4 转成UIImage

           UIImage *image = [UIImageimageWithData:photoData];

            //封装Student模型

            Student *student = [[Studentalloc] init];

            student.ID = ID;

            student.name = [NSStringstringWithUTF8String:(constchar *)name];

            student.sex = [NSStringstringWithUTF8String:(constchar *)sex];

            student.age = age;

            student.photo = image;

            //添加到数组

            [studentArr addObject:student];

        }

    }

    //释放stmt指针

    sqlite3_finalize(stmt);

    //关闭数据库

    [DatabasecloseDB];

    return studentArr;

}

//查询单个学生

+ (Student *)getStudentWithID:(NSInteger)aID

{

    sqlite3 *db = [DatabaseopenDB];

    sqlite3_stmt *stmt =nil;

    NSString *sqlStr = [NSStringstringWithFormat:@"select * from t_persons where c_id = %ld", (long)aID];

    int result =sqlite3_prepare_v2(db, [sqlStrUTF8String], -1, &stmt,NULL);

    Student *student =nil;

    if (result ==SQLITE_OK) {

        if (sqlite3_step(stmt) ==SQLITE_ROW) {

            int ID =sqlite3_column_int(stmt,0);

            constunsigned char *name =sqlite3_column_text(stmt,1);

            constunsigned char *sex =sqlite3_column_text(stmt,2);

            int age =sqlite3_column_int(stmt,3);

            int length =sqlite3_column_bytes(stmt,4);

            constunsigned char *photo =sqlite3_column_blob(stmt,4);

            NSData *photoData = [NSDatadataWithBytes:photo length:length];

            UIImage *image = [UIImageimageWithData:photoData];

            student = [[Studentalloc] init];

            student.ID = ID;

            student.name = [NSStringstringWithUTF8String:(constchar *)name];

            student.sex = [NSStringstringWithUTF8String:(constchar *)sex];

            student.age = age;

            student.photo = image;

        }

    }

    sqlite3_finalize(stmt);

    [DatabasecloseDB];

    return student;

}


+ (BOOL)insertStudent:(Student *)aStudent

{

    sqlite3 *db = [DatabaseopenDB];

    sqlite3_stmt *stmt =nil;

    //c_name c_sex c_age

    NSString *sqlStr = [NSStringstringWithFormat:@"insert into t_persons (c_name,c_sex,c_age,c_desc) values ('Silence of the Lambs, The', 'Jodie Foster', 1991, 'Jodie Foster');"];

    

    int result =sqlite3_prepare_v2(db, [sqlStrUTF8String], -1, &stmt,NULL);

    

    if (result ==SQLITE_OK) {

        //判断语句执行完成没有

        if (sqlite3_step(stmt) ==SQLITE_DONE) {

            sqlite3_finalize(stmt);

            [DatabasecloseDB];

            returnYES;

        }

    }

    sqlite3_finalize(stmt);

    [DatabasecloseDB];

    returnNO;

}

//修改学生的姓名

+ (BOOL)updateStudentName:(NSString *)aName byID:(NSInteger)aID

{

    sqlite3 *db = [DatabaseopenDB];

    sqlite3_stmt *stmt =nil;

    NSString *sqlStr = [NSStringstringWithFormat:@"update t_persons set name = '%@' where c_id = %ld", aName, (long)aID];

    int result =sqlite3_prepare_v2(db, [sqlStrUTF8String], -1, &stmt,NULL);

    if (result ==SQLITE_OK) {

        if (sqlite3_step(stmt) ==SQLITE_ROW) {//觉的应加一个判断,若有这一行则修改

            if (sqlite3_step(stmt) ==SQLITE_DONE) {

                sqlite3_finalize(stmt);

                [DatabasecloseDB];

                returnYES;

            }

        }

    }

    sqlite3_finalize(stmt);

    [DatabasecloseDB];

    returnNO;

}

//删除一个学生

+ (BOOL)deleteStudentWithID:(NSInteger)aID

{

    sqlite3 *db = [DatabaseopenDB];

    sqlite3_stmt *stmt =nil;

    NSString *sqlStr = [NSStringstringWithFormat:@"delete from t_persons where c_id = %ld", (long)aID];

    int result =sqlite3_prepare_v2(db, [sqlStrUTF8String], -1, &stmt,NULL);

    if (result ==SQLITE_OK) {

        if (sqlite3_step(stmt) ==SQLITE_ROW) {//觉的应加一个判断,若有这一行则删除

            if (sqlite3_step(stmt) ==SQLITE_DONE) {

                sqlite3_finalize(stmt);

                [DatabasecloseDB];

                returnYES;

            }

        }

    }

    sqlite3_finalize(stmt);

    [DatabasecloseDB];

    returnNO;

}

@end


//调用

@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    [selfcreateTable];

    

    if ([selfinsetOne]) {

        NSLog(@"插入成功");

    }

    

    [selfgetOneStu];

}

- (void)createTable{

    [DatabaseHelpercreateTablels];

}

- (BOOL)insetOne{

    Student *stu = [[Studentalloc] init];

    stu.name =@"chi";

    stu.sex =@"man";

    stu.age =24;

    stu.photo = [UIImageimageNamed:@"record"];

   return [DatabaseHelperinsertStudent:stu];

}

- (void)getOneStu{

    Student *stu = [DatabaseHelpergetStudentWithID:1];

    NSLog(@"%@", stu);

}



推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
author-avatar
顽石1129_659
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有