IOS开发入门iOS-SQLite在项目中实际使用(Objective-C)
白羽 2019-07-10 来源 :网络 阅读 394 评论 0

摘要:本文将带你了解IOS开发入门iOS-SQLite在项目中实际使用(Objective-C),希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门iOS-SQLite在项目中实际使用(Objective-C),希望本文对大家学IOS有所帮助。

IOS开发入门iOS-SQLite在项目中实际使用(Objective-C)

实际开发中,掌握并熟练使用SQLite数据库对app内数据进行操作是移动开发人员至关重要的技能,iOS中封装的coreData固然也是对SQLite的二层封装,强大的https://github.com/ccgus/fmdb‘>FMDB也会帮程序员减轻很多不必要的麻烦,提高工作效率,既然是封装.性能自然不如直接操作SQL语句
   创建数据库管理类SQLiteManager
   设置类方法创建单例对象-OC中创建单例可以单独生成类方法创建单例对象,也可使用原始init方法创建普通对象
   ?1234567891011121314151617.h@interface SQLiteManager :  NSObject//类方法生成单例对象+(instancetype)shareInstance;@end .m@implementation  SQLiteManagerstatic SQLiteManager  *instance;+(instancetype)shareInstance{    static  dispatch_once_t  onceToken;    dispatch_once(&onceToken,  ^{        instance = [[self alloc]  init];    });    return  instance;}@end
   操作数据库
   首先需要在项目中导入libsqlite3.tbd框架
   
   然后在SQLiteManager数据库管理类引入头文件
   ?1#import <sqlite3.h></sqlite3.h>
   打开数据库
   在.h文件中暴露打开数据库的接口
   ?12//打开数据库-(BOOL)openDB;
   .m文件中轻松加愉快的实现使用原生SQLite框架的各种操作数据库的方法.
   SQL语句建议直接复制粘贴备忘录中的语句,以免拼写出错(有可能是博客中最没用的一句话)
   ?1234567891011121314151617181920212223242526272829303132333435363738#pragma  mark -  打开/创建数据库-(BOOL)openDB{    //app内数据库文件存放路径-一般存放在沙盒中    NSString  *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES) lastObject];    NSString *DBPath =  [documentPath  stringByAppendingPathComponent:@"appDB.sqlite"];    //创建(指定路径不存在数据库文件)/打开(已存在数据库文件)  数据库文件    //sqlite3_open(<#const char *filename#>,  <#sqlite3 **ppDb#>)  filename:数据库路径   ppDb:数据库对象    if (sqlite3_open(DBPath.UTF8String,  &_db) != SQLITE_OK) {        //数据库打开失败        return  NO;    }else{        //打开成功创建表        return  [self creatTable];    }}-(BOOL)creatTable{    //创建表的SQL语句    //用户  表    NSString *creatUserTable = @"CREATE TABLE IF  NOT EXISTS 't_User' ( 'ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'name' TEXT,'age'  INTEGER,'icon' TEXT);";    //车  表    NSString *creatCarTable = @"CREATE TABLE IF NOT  EXISTS 't_Car' ('ID' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,'type'  TEXT,'output' REAL,'master' TEXT)";    //项目中一般不会只有一个表    NSArray  *SQL_ARR = [NSArray arrayWithObjects:creatUserTable,creatCarTable,  nil];    return [self  creatTableExecSQL:SQL_ARR];}-(BOOL)creatTableExecSQL:(NSArray *)SQL_ARR{    for  (NSString *SQL in SQL_ARR)  {        //参数一:数据库对象   参数二:需要执行的SQL语句   其余参数不需要处理        if (![self  execSQL:SQL]) {            return  NO;        }    }    return  YES;}#pragma 执行SQL语句-(BOOL)execSQL:(NSString  *)SQL{    return sqlite3_exec(self.db, SQL.UTF8String,  nil, nil, nil) == SQLITE_OK;}
   数据库内SQL操作
   ?1234#pragma 执行SQL语句-(BOOL)execSQL:(NSString  *)SQL{    return sqlite3_exec(self.db, SQL.UTF8String,  nil, nil, nil) == SQLITE_OK;}
   如果需要更新数据库对应表中数据,直接调用SQL执行方法即可实现
   ?1234567-(void)updateIcon{    //更新对应的SQL语句    NSString  *SQL = [NSString stringWithFormat:@"UPDATE 't_User' SET icon='%@' WHERE  name = '%@'",@"https://qiuxuewei.com/newIcon.png",@"name_6"];    if  ([[SQLiteManager shareInstance] execSQL:SQL])  {        NSLog(@"对应数据修改成功");    }}
   项目中的Model自定义对象可以自定义一个将自身插入数据库的方法
   ?12345<code>-(BOOL)insertSelfToDB{    //插入对象的SQL语句    NSString  *insertSQL = [NSString stringWithFormat:@"INSERT INTO 't_User'  (name,age,icon) VALUES ('%@',%ld,'%@');",self.name,self.age,self.icon];    return  [[SQLiteManager shareInstance] execSQL:insertSQL];}</code>
   查询数据库中对应表中所有数据
   ?1234567891011121314151617181920212223242526272829303132333435363738<code>#pragma  mark - 查询数据库中数据-(NSArray *)querySQL:(NSString  *)SQL{    //准备查询    // 1>  参数一:数据库对象    // 2> 参数二:查询语句    //  3> 参数三:查询语句的长度:-1    // 4>  参数四:句柄(游标对象)//    sqlite3_prepare_v2(<#sqlite3 *db#>,  <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt  **ppStmt#>, <#const char  **pzTail#>)    sqlite3_stmt *stmt =  nil;    if (sqlite3_prepare_v2(self.db, SQL.UTF8String,  -1, &stmt, nil) != SQLITE_OK)  {        NSLog(@"准备查询失败!");        return  NULL;    }    //准备成功,开始查询数据    //定义一个存放数据字典的可变数组    NSMutableArray  *dictArrM = [[NSMutableArray alloc] init];    while  (sqlite3_step(stmt) == SQLITE_ROW)  {        //一共获取表中所有列数(字段数)        int  columnCount =  sqlite3_column_count(stmt);        //定义存放字段数据的字典        NSMutableDictionary  *dict = [[NSMutableDictionary alloc] init];        for  (int i = 0; i < columnCount; i++)  {            //  取出i位置列的字段名,作为字典的键key            const  char *cKey = sqlite3_column_name(stmt,  i);            NSString  *key = [NSString  stringWithUTF8String:cKey];             //取出i位置存储的值,作为字典的值value            const  char *cValue = (const char *)sqlite3_column_text(stmt,  i);            NSString  *value = [NSString  stringWithUTF8String:cValue];             //将此行数据  中此字段中key和value包装成  字典            [dict  setObject:value forKey:key];        }        [dictArrM  addObject:dict];    }    return  dictArrM;}</code>
   在自定义模型中有必要定义个工厂方法可将数据库对应表中所有数据取出,以模型数组的形式输出
   ?12345678910111213<code>+(NSArray  *)allUserFromDB{    //查询表中所有数据的SQL语句    NSString  *SQL = @"SELECT name,age,icon FROM  't_User'";    //取出数据库用户表中所有数据    NSArray  *allUserDictArr = [[SQLiteManager shareInstance]  querySQL:SQL];    NSLog(@"%@",allUserDictArr);    //将字典数组转化为模型数组    NSMutableArray  *modelArrM = [[NSMutableArray alloc] init];    for  (NSDictionary *dict in allUserDictArr)  {        [modelArrM addObject:[[User  alloc]  initWithDict:dict]];    }    return  modelArrM;}</code>
   当然,github已经上传源代码:https://github.com/qxuewei/Swift-test/tree/master/SQLite%E6%95%B0%E6%8D%AE%E5%BA%93%E6%93%8D%E4%BD%9C-0C    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程