ios开发中,经常会用到数据库sqlite的知识,除了增,删,改,查之外,我们说说如何获取数据库中有多少表和表相关的内容。

前言

跟数据库使用相关的一般的增删改查的语句,这里就不做解释了。在网上有很多。记得之前项目中曾经有这样的一个场景。一个数据库中存在了好几个表。假定我们不知道表名的前提下来获取这些数据。

数据库结构

下来看看数据库结构:



我们可以看到,在这个数据库文件中一共有10个表。我们的目的就是获取这些表中的内容。

获取数据库中有多少表

在这里我们使用的是 FMDB 来操作的。我们下打开一个数据库。

NSString *smsPaht = [[NSBundle mainBundle] pathForResource:@"sms" ofType:@"sqlite"];
FMDatabase *db = [FMDatabase databaseWithPath:smsPaht]; if ([db open]) { // 根据请求参数查询数据
FMResultSet *resultSet = nil; }

我们已经打开了数据库,众所周知 FMDB 使用executeQuery来调用数据库语句。在这里就不卖关子了。查询一个数据库中的所有的表的语句为:

resultSet = [db executeQuery:@"SELECT * FROM sqlite_master where type='table';"];

获取每个表的信息

FMResultSet 这个对象中有一个属性columnNameToIndexMap。它是一个NSMutableDictionary对象。其中key表示的是指定结果集中对应列的名称,value表示的是指定结果集中对应的列号(columnIdx)。我们打印出来可以看到:

{
name = 1;
rootpage = 3;
sql = 4;
"tbl_name" = 2;
type = 0;
}

后边我们获取表名的时候,就用到了name = 1 这个字段。我们看下边的代码:

NSString *smsPaht = [[NSBundle mainBundle] pathForResource:@"sms" ofType:@"sqlite"];

FMDatabase *db = [FMDatabase databaseWithPath:smsPaht];

if ([db open]) {

    // 根据请求参数查询数据
FMResultSet *resultSet = nil; resultSet = [db executeQuery:@"SELECT * FROM sqlite_master where type='table';"];
NSMutableDictionary *dict = resultSet.columnNameToIndexMap;
// 遍历查询结果
while (resultSet.next) { NSString *str0 = [resultSet stringForColumnIndex:0];
NSString *str1 = [resultSet stringForColumnIndex:1];
NSString *str2 = [resultSet stringForColumnIndex:2];
NSString *str3 = [resultSet stringForColumnIndex:3];
NSString *str4 = [resultSet stringForColumnIndex:4];
QKYLog(@"%@,%@,%@,%@,%@",str0,str1,str2,str3,str4); } }

打印结果为:

2016-08-26 15:20:05.909 xxxx[5255:190053] table,sqlite_sequence,sqlite_sequence,3,CREATE TABLE sqlite_sequence(name,seq)
2016-08-26 15:20:05.910 xxxx[5255:190053] table,member,member,4,CREATE TABLE 'member'( [id] integer PRIMARY KEY autoincrement, [recordid] integer,
[groupid] integer )
2016-08-26 15:20:05.910 xxxx[5255:190053] table,groups,groups,2,CREATE TABLE groups ( [id] integer PRIMARY KEY autoincrement, [name] varchar (100) )
2016-08-26 15:20:05.911 xxxx[5255:190053] table,blessing,blessing,5,CREATE TABLE blessing(title text primary key, content text)
2016-08-26 15:20:05.911 xxxx[5255:190053] table,festivel,festivel,83,CREATE TABLE festivel(title text primary key, content text)
2016-08-26 15:20:05.911 xxxx[5255:190053] table,funny,funny,357,CREATE TABLE funny(title text primary key, content text)
2016-08-26 15:20:05.913 xxxx[5255:190053] table,love,love,419,CREATE TABLE love(title text primary key, content text)
2016-08-26 15:20:05.944 xxxx[5255:190053] table,other,other,449,CREATE TABLE other(title text primary key, content text)
2016-08-26 15:20:05.944 xxxx[5255:190053] table,xiaoyuan,xiaoyuan,607,CREATE TABLE xiaoyuan(title text primary key, content text)
2016-08-26 15:20:05.944 xxxx[5255:190053] table,yuehui,yuehui,642,CREATE TABLE yuehui(title text primary key, content text)
2016-08-26 15:20:05.944 xxxx[5255:190053] table,zhichang,zhichang,670,CREATE TABLE zhichang(title text primary key, content text)

通过对比columnNameToIndexMap中的内容,大家应该看明白了吧。我们就是通过NSString *str1 = [resultSet stringForColumnIndex:1];来获取表名的。

代码

NSString *smsPaht = [[NSBundle mainBundle] pathForResource:@"sms" ofType:@"sqlite"];
FMDatabase *db = [FMDatabase databaseWithPath:smsPaht]; if ([db open]) { // 根据请求参数查询数据
FMResultSet *resultSet = nil; resultSet = [db executeQuery:@"SELECT * FROM sqlite_master where type='table';"]; NSMutableArray *tableNames = [NSMutableArray array];
// 遍历查询结果
while (resultSet.next) { NSString *str1 = [resultSet stringForColumnIndex:1];
[tableNames addObject:str1]; } NSMutableDictionary *result = [NSMutableDictionary dictionary]; for (NSString *tableName in tableNames) { FMResultSet *resultSet = nil; resultSet = [db executeQuery:[NSString stringWithFormat:@"SELECT * FROM %@;",tableName]];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
// 遍历查询结果
while (resultSet.next) { NSString *key = [resultSet stringForColumnIndex:0];
NSString *value = [resultSet stringForColumnIndex:1];
if (key && value) { // 在这里要对value按照⭐️进行分割
NSArray *array = [value componentsSeparatedByString:@"★"];
if (array) {
dict[key] = array;
} }
} result[tableName] = dict;
} NSData *jsonData = [NSJSONSerialization dataWithJSONObject:result options:0 error:NULL];
if (!jsonData) {
return;
} NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; QKYLog(@"%@",jsonStr);
}

总结

上边的代码仅作参考,在实际开发中会根据不同的数据结构有不用的写法。但是我们的目的主要是懂得如何去获取数据。

最终解析出的json数据为:

{
"member": {},
"groups": {},
"xiaoyuan": {
"校园": [
"上课瞌睡过度,眼皮打架无数,实在支持不住,误入梦境深处,呼噜,呼噜,惊起同学全部",
"校园风光如此多骄,引无数情侣尽弯腰,惜龙女杨过,牛郎织女略输一等,一代大傻韦小宝尽拿灵通发短信!",
"大学中永恒的爱情如钻石一般的少,大多是:只因思颜意,未求终生缘!",
"有风的日子,不妨出去走走。不妨放松呼吸,走向绚丽阳光,把发黄的",
"心事交给流水,向远去的雾霭行个注目礼。",
"逝去的年华在风中摇曳,枫树下依旧残留着她暖暖的气息,紧紧的抱着她,却发现眼前只有纷纷落下的枫叶.",
"我们的校园生活像一支旋律,它是热情,快乐和友爱的组装,是激越,奔放,令人陶醉的交响乐.",
"校园是我的一架钢琴,作息是钢琴的一副踏板,放飞的心是起伏的琴键,苦辣酸甜是多彩的乐章",
"我愿青春如校园春雨中的牡丹,夏夜幽静处的白兰,秋风微露里的海棠,漫天飞雪中的寒梅.",
"虎子最近上火连续两天上课鼻出血,昨天当铃响起虎子鼻血再次喷出同桌小青很是关心:你的周期咋那么准?",
"路是自己走出来的:爱情是自己努力得来的:前途是自己拼出来的,你要努力啊",
"忘了,忘了吧,忘掉所有的不愉快,我们都非圣贤,在我心底,依然珍惜...",...

IOS FMDB 获取数据库表和表中的数据的更多相关文章

  1. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net

    Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net 1. -catalog与schema的设计区别1 ...

  2. 关于如果从SQLSERVER中获取 数据库信息 或者 表信息

    1.首先呢.要明确一点.SQLSERVER中的系统信息一般都无从table中找到的.通常都在View中找到 这是重点. 2.接着我们打开算起来SQLSERVER,展开你某一数据库.看到类似 3.然后展 ...

  3. SQL获取数据库名,表名,列名,说明等信息

    由于最近工作涉及SQL语句较多,对一些不常见的SQL函数.及存储过程下面进行整理和描述,供大家分享: /************************************************ ...

  4. sql获取数据库的所有表以及名称字段

    获取数据库中所有的表 SELECT SysObjects.name AS Tablename FROM sysobjects WHERE xtype = 'U' 获取数据库中所有表的列名 SELECT ...

  5. SQL 根据关联表更新主表中字段数据

    今天遇到一个客户的数据更新问题,两个相关联的表,一个主表用于保存单据主要信息,一个副表用于保存单据的明细信息:现在要把主表的其中一个字段的数据更新到副表的一个字段中保存.精通的SQL语法的,当然是很简 ...

  6. 【Python + Selenium断言】之如何获取定位Web页面列表中的数据

    如下图所示: 当定位元素时,我想获取指定的某一列的某一行的断言,如图我只想获取jiancha1的值,有同学会说:直接定位不就好了.但是我们知道,列表的数据会时刻变动的,不能靠定死的路径,那该怎么办呢? ...

  7. MySql 获取数据库的所有表名

    目录 写在前面 根据数据库获取该数据库下所有的表名 根据表名获取列名与列值 写在前面 在实现某个功能的时候,需要使用MySql数据库获取某数据的所有的表名以及该表名的所有列名与列值. 根据数据库获取该 ...

  8. java连接Oracle数据库,从ResultSet中提取数据出现java.sql.sqlException结果集已耗尽

    出现错误的原因是ResultSet中并没有任何东西,再调用next()方法就会出错,原因可能是oracle创建用户,表没有提交,commit即可

  9. 获取和设置HTML标签中的数据

随机推荐

  1. 【.net 深呼吸】细说CodeDom(7):索引器

    在开始正题之前,先补充一点前面的内容. 在方法中,如果要引用方法参数,前面的示例中,老周使用的是 CodeVariableReferenceExpression 类,它用于引用变量,也适用于引用方法参 ...

  2. 常用 Gulp 插件汇总 —— 基于 Gulp 的前端集成解决方案(三)

    前两篇文章讨论了 Gulp 的安装部署及基本概念,借助于 Gulp 强大的 插件生态 可以完成很多常见的和不常见的任务.本文主要汇总常用的 Gulp 插件及其基本使用,需要读者对 Gulp 有一个基本 ...

  3. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  4. js实现前端分页页码管理

    用JS实现前端分页页码管理,可以很美观的区分页码显示(这也是参考大多数网站的分页页码展示),能够有很好的用户体验,这也是有业务需要就写了一下,还是新手,经验不足,欢迎指出批评! 首先先看效果图: 这是 ...

  5. iOS开发之Alamofire源码深度解析

    今天博客中的Alamofire源码的版本是以现在最新的3.4版本为例.上篇博客系统的对NSURLSession相关的东西进行了详细的解析,详情请看<详解NSURLSession>,为了就是 ...

  6. 对Thoughtworks的有趣笔试题实践

    记得2014年在网上看到Thoughtworks的一道笔试题,当时觉得挺有意思,但是没动手去写.这几天又在网上看到了,于是我抽了一点时间写了下,我把程序运行的结果跟网上的答案对了一下,应该是对的,但是 ...

  7. C++随笔:.NET CoreCLR之GC探索(1)

    一直是.NET程序员,但是.NET的核心其实还是C++,所以我准备花 一点时间来研究CoreCLR和CoreFX.希望这个系列的文章能给大家带来 帮助. GC的代码有很多很多,而且结构层次对于一个初学 ...

  8. PHP之Memcache缓存详解

         Mem:memory缩写(内存):内存缓存 1.  断电或者重启服务器内存数据即消失,即临时数据: Memcache默认端口:11211 存入方式:key=>>value    ...

  9. Java实现Excel中的NORMSDIST函数和NORMSINV函数

    由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...

  10. 港真,到底应该选择OA还是BPM?

    越来越多企业意识到流程管理的重要性,但是,选择OA还是BPM,却让他们产生了选择困难症. 一方面,企业皆注重流程的高效运转,最好内外部的业务都能用一个系统来解决.所有流程一天就能上线什么的,那就更好啦 ...