苹果如何获取app用户 数据app哪个文件关联数据路径

内容型APP运营经验分享:如何利用统计数据来管理你APP的内容
发布时间:&&&&QQ/微信:
感谢ChinaApp网友石老人说的投递!作者为搜房网 二手房集团北京公司 租房网主编。以下就是他关于自己做的APP运营过程的一些体会需要和ChinaApp网友分享的内容。
无论是还是做其他的东西,用心是首要的要素。而如何用心,则是一门学问,今天就通过从APP的统计数据管理内容来和大家分享一下。
首先介绍一下我的APP,文玩汇,主要针对文玩爱好者的一个手机应用,内容包括文玩知识介绍、文玩技巧交流、图片鉴赏等。这个APP是利用的,并且取得了简网给提供的高级统计功能,下面的内容将以简网高级统计功能和大家分享。
根据用户活跃时间段更新内容
上图是某个周二我的用户启动次数柱状图,这个可以通过高级统计中导出数据通过excel制作出来,如果懒得制作的话,直接看曲线也可以。通过这个图可以很准确的看出我的用户启动有3个高峰期,分别是中午12点、下午6点和晚上9点,对应着就是中午吃饭时候、下午下班在路上的时候和晚上睡觉前的时间,拎出这段时间来也可以佐证我的用户基本上是属于上班族。
那么这个表对于我更新内容有什么帮助呢?就是在每个高峰期前一个小时更新好内容,让他们启动之后就可以看到最新的内容。我目前是这么做的,分别在11点、下午5点和晚上8点更新内容,接下来从用户的停留时间看,这种更新时间安排是合理的。
根据联网方式数据决定你的图片和文字占比
上图是我直接截取的统计后台数据,可以很明显的看出,我的用户主要通过WIFI访问,这个也佐证了为何晚上21点出现一次启动高峰的原因了,因为在家里有wifi,不用担心流量。
但是通过数据可以看出其实2G网络访问仍然占比到10%以上,这部分用户大部分集中在中午吃饭或者晚上下班的路上,他们会吝惜自己的流量和忍受2 g网络的下载速度。
这个数据对我的内容有什么用处呢?我是这么做的,我会在晚上8点更新的时候,适度的更新一部分图片/视频(在这里帮简网喊一嗓子哈,简网制作的app是可以发布视频的)类文章,因为大家在家中基本上使用wifi联网的居多。
而中午11点和下午5点的更新,我就要降低图片文章的比例增加纯文字内容,这样可以有效的提升网友阅读体验。
根据访问路径来调整你的标题
其实这个数据在门户网站中叫做转化率(有的叫其他名字,基本意思类似),然后是用来考核值班编辑的一个数据。好的值班编辑方寸之间施拳脚,就几个字编出来的标题能够与众不同吸引大量点击,当然也催生了不少标题党,不过一个好的标题对于用户进入下一级页面是非常有帮助的。
通过上面的数据可以看出,我的标题或者说首页图片的编辑是不合格的,大概有2/3的网友在浏览列表页后就离开了应用,而只有1/3的继续访问详情页。
其实上图也反馈了简网的一个需求,就是应该实现在详情页之间浏览下一篇,目前简网是通过滑动返回列表页再继续访问详情页的方式,通过上面的数据可以看出,再次返回列表页后,再次流失了22%的用户(心在滴血啊~)
其实通过数据还能够分析出很多来,这里抛砖引玉只是举了3个例子,希望可以引出大家更多的思考,利用简网的平台创造出更好的内容,从而在移动互联网的蓝海中拿到自己的那张小小船票。
ChinaApp总结
作者的分享很到位,切实的把自己换位思考,心系用户,本文可以当用数据来优化APP内容的参考学习内容,内容型的APP也可以参考。毕竟这是一个流量不便宜的地方。逐步学习用数据来优化你的APP,做科学有效的APP运营。
对文玩有兴趣的朋友可以下载安装他的APP,地址:
微信扫扫打赏给ChinaApp
感谢分享给更多身边的朋友
相关文章推荐
Ad Marketplace推荐
关于ChinaApp
专注APP运营推广!海纳国内外最新的App营销推广技术技巧,已经成为行业众多公司要求员工必上的网站。如何轻松搞定APP数据分析? - 简书
下载简书移动应用
写了166448字,被440人关注,获得了364个喜欢
如何轻松搞定APP数据分析?
#文前小絮#提到——为什么要数据分析?APP数据分析有意义吗?当然!数据分析的用意本不在于数据本身,而是要打造一个数据反馈闭环。设计基础数据指标,多维度交叉分析不同指标,以数据甄别问题,再反向作用产品,最终形成数据驱动产品设计的闭环。事实上,APP数据分析并没有那么神圣,而一般常用的数据指标也都不难掌握。事实上,数据指标的设计基于两点事实:1、商业模式和业务背景;2、数据分析动机和目的;
如何轻松搞定APP数据分析?
正文数据分析解决方案的提供商是比较多的,甚至说数据分析本身也成为了创业的一种可能。友盟、CNZZ、Talking Data、腾讯云都提供了成套的数据解决方案。以下我将试着以自己的思维模式建立一套《APP数据分析思维模式》。数据分析建模类似于数学的排列组合理论,选择基础指标配合具体的业务需要,因此在数据建模之前有必要掌握常用的数据指标。万丈高楼平地起!基础指标1、用户:总用户数、新用户数、留存用户、转化率、地域分析;2、活跃:日活跃(DAU)、周活跃(WAU)、月活跃(MAU);3、营收:付费人数、付费率、付费点分布;4、应用:启动次数、使用频率、使用时长、使用间隔、版本分布、终端类型、错误分析;5、功能:功能活跃、页面访问路径、核心动作的转化率;分析维度你赚钱的方式决定了你应该关注的指标。从长远来讲,企业风险最高的部分往往是与其如何赚钱直接相关的。基于以上的基础数据指标,结合数据分析的两点事实,可以选取所需的指标,完成APP数据分析:1.用户分析分析用户属性为产品改进及推广提供充分、可靠的数据制定精准的策略;1.1用户规模基础指标:总用户数、新增用户、流失用户、回流用户;统计维度:按年、月、周、曰;指标比例:统一使用”率“表示;指标说明:苹果端很难取值,可以间接地转化;以激活APP量代替下载量;安卓比较好处理;日月周维度;新增用户/总用户数,说明产品健康度;比值的大小都有影响说明问题;1.2活跃用户_用户质量基础指标:日活跃(DAU)、周活跃(WAU)、月活跃(MAU);统计维度:按日、周、月,按渠道,按分群;指标比例:统一使用”率“表示;指标说明:日、周、月,统计维度依据产品类型/属性而选取;提高这些指标的方式:采取运营活动,推送,签到,任务,积分;以功能和内容驱动,用户APP的使用频率;1.3用户构成基础指标:活跃用户、启动次数;统计维度:按年、月、周、曰;a. 本周回流用户:上周未启动过应用,本周启动应用的活跃用户;b. 连续活跃n周用户:连续n周,每周至少启动过一次应用的活跃用户(第n+1未启动)c. 忠诚用户:连续活跃n周及以上的用户;d. 连续活跃用户:连续活跃2周以上的的用户;e. 近期流失用户:连续n周没有启动过应用的用户(第n+1周启动过);f. 周活跃用户:当周启动过应用的用户(去重);指标比例:统一使用”率“表示;绝对值——展示的是个用户成分的数量,百分比展示的是活跃用户 成分占周或曰用户的比例;对周活跃用户数据进行的成分分解,并通过历史数据预测未来数据变化趋势的模型。该模 型帮助您对应用后续的用户活跃和留存等进行科学预测,并制定有效的规划和目标;2.应用分析2.1启动次数基础指标:总用户数、新增用户、流失用户、回流用户;统计维度:按月、周或曰,按渠道,按分群;指标比例:某日/周/月的启动次数占所选时段总启动次数的比例;指标说明:打开应用视为启动,完全退出或退至后台即视为启动结束;2.2版本分布基础指标:启动次数、新增用户、活跃用户、升级用户;统计维度:按时间、版本;指标比例:统一使用”率“表示;不同版本的累计用户(占累计用户全体的比例);指标说明:展示累计用户排名前10的各个版本变化趋势,可以帮助了解每个版本的新增用户,最新版本的升级情况,目前的哪些版本状况;2.3使用状况基础指标:使用时长、使用频次、使用间隔;统计维度:日、周、月;版本、渠道、时间段;指标比例:某日/周/月的启动次数占所选时段总启动次数的比例;指标说明:统计周期内,一次启动的使用时长;一天内启动应用的次数;用统一用户相邻两次启动间隔的时间长度。2.4终端类型、错误分析(不做详细介绍)3.功能分析a. 功能活跃指标:某个功能的活跃用户,使用量情况;功能验证;对产品功能的数据分析,确保功能的取舍的合理性,b. 页面访问路径:用户从打开到离开应用整个过程中每一步骤的页面访问、跳转情况。页面访问路径是全量统计。通过路径分析得出用户类型的多样、用户使用产品目的的多样性,还原用户目的;通过路径分析,做用户细分;再通过用户细分,返回到产品的迭代。c. 漏斗模型:整个漏斗所关心的最终转化率的目标是序列中最后一个事件。用户转化率的分析,核心考察漏斗每一层的流失原因的分析。通过设置自定义事件以及漏斗来关注应用内每一步的转化率,以及转化率对收入水平的影响。通过分析事件和漏斗数据,可以针对性的优化转化率低的步骤,切实提高整体转化水平。4.行业分析指标说明:行业数据可以帮助了解行业内应用的整体水平,可以查看应用的全体应用或同类应用中各个 指标的数据、排名及趋势,有助于衡量应用的质量和表现;统计维度:用户规模、更新频次、应用排名;指标比例:全体排名和同规模排名;了解行业数据,可以知道自己的APP在整个行业的水平,可以从新增用户、活跃用户、启动次数、使用时长等多个维度去对比自己产品与行业平均水平的差异以及自己产品的对应的指标在整个行业的排名,从而知道自己产品的不足之处。5.渠道分析指标说明:渠道质量的评估,不同渠道获得用户的行为特征监控、判断问题;统计维度:时间段、不同渠道对比;基础对比(新增用户、新增账号、活跃用户、活跃账号、启动次数、单次使用时长、次日留存率);可以从多个维度的数据来对比不同渠道的效果,比如从新增用户、活跃用户、次日留存率、单次使用时长等角度对比不同来源的用户,这样就可以根据数据找到最适合自身的渠道,从而获得最好的推广效果。行文小结我认为是产品业务逻辑的分析。基础数据都是普遍适用的,而特定业务的个性化指标设计才真正考验功底,数据分析本质上是对产品业务逻辑的理解和把握。脱离产品,脱离具体业务场景的数据分析都是毫无意义的!原创声明:本文章的最终解释权归产品小王所有,如需转载,请注明文章出处!谢谢...
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
玩转简书的第一步,从这个专题开始。
想上首页热门榜么?好内容想被更多人看到么?来投稿吧!如果被拒也不要灰心哦~入选文章会进一个队...
· 131109人关注
各种关于各种产品的各种角度的看法。
从设计到吐槽,从追捧到海扁。
你敢做,我敢吐。
· 5287人关注
看看别人在思考什么,每天更新。
· 5224人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:4533人阅读
iOS本地缓存数据方式有五种:
1.直接写文件方式:可以存储的对象有NSString、NSArray、NSDictionary、NSData、NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中。
2.NSUserDefaults(偏好设置),用来存储应用设置信息,文件放在perference目录下。
3.归档操作(NSkeyedArchiver),不同于前面两种,它可以把自定义对象存放在文件中。
4.coreData:coreData是苹果官方iOS5之后推出的综合型数据库,其使用了ORM(Object Relational Mapping)对象关系映射技术,将对象转换成数据,存储在本地数据库中。coreData为了提高效率,甚至将数据存储在不同的数据库中,且在使用的时候将本地数据放到内存中使得访问速度更快。我们可以选择coreData的数据存储方式,包括sqlite、xml等格式。但也正是coreData 是完全面向对象的,其在执行效率上比不上原生的数据库。除此之外,coreData拥有数据验证、undo等其他功能,在功能上是几种持久化方案最多的。
5.FMDB:FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码,对比苹果自带的Core Data框架,更加轻量级和灵活,提供了多线程安全的数据库操作方法,有效地防止数据混乱。
方式一:直接写文件
//获取沙盒中缓存文件夹路径
//沙盒主目录
NSString *homePath = NSHomeDirectory();
//拼接路径
NSString *path = [homePath stringByAppendingPathComponent:@&Library/Caches&];
//第一个参数目标文件夹目录(NSCachesDirectory查找缓存文件夹),第二个参数为查找目录的域(NSUserDomainMask为在用户目录下查找),第三个参数为结果中主目录是否展开,不展开则显示为~
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
//虽然该方法返回的是一个数组,但是由于一个目标文件夹只有一个目录,所以数组中只有一个元素。
NSString *cachePath = [arr lastObject];
//& & NSString *cachePath = [arr objectAtIndex:0];
//获取沙盒中Document文件夹或者tmp文件夹路径都可使用上面两种方法
//tmp文件夹路径可直接这样获取
NSString *tmpPath = NSTemporaryDirectory();
NSLog(@&%@&,tmpPath);
//拼接路径(目标路径),这个时候如果目录下不存在这个lotheve.plist文件,这个目录实际上是不存在的。
NSString *filePath = [cachePath stringByAppendingPathComponent:@&tese.plist&];
NSLog(@&%@&,filePath);
//创建数据
NSDictionary *content = @{@&字典数据测试1&:@&1&,@&字典数据测试2&:@&2&,@&字典数据测试&:@&3&};
//将数据存到目标路径的文件中(这个时候如果该路径下文件不存在将会自动创建)
//用writeToFile方法写文件会覆盖掉原来的内容
[content writeToFile:filePath atomically:YES];
//读取数据(通过字典的方式读出文件中的内容)
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSLog(@&%@&,dic);
沙盒中Library/Caches目录下多了lotheve.plist文件:
文件内容:
如何获取模拟器沙盒路径:
打印日志,复制路径打开mac finder,点击左上角菜单前往,前往文件夹,把路径粘贴上去。
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
NSLog(@&%@&,path);
方式二:NSUserDefaults(偏好设置)
每个应用都有一个NSUesrDefaults实例,通过它可以存储应用配置信息以及用户信息,比如保存用户名、密码、字体大小、是否自动登录等等。数据自动保存在沙盒的Libarary/Preferences目录下。同样,该方法只能存取NSString、NSArray、NSDictionary、NSData、NSNumber类型的数据。
属性列表是一种明文的轻量级存储方式,其存储格式有多种,最常规格式为XML格式。在我们创建一个新的项目的时候,Xcode会自动生成一个info.plist文件用来存储项目的部分系统设置。plist只能用数组(NSArray)或者字典(NSDictionary)进行读取,由于属性列表本身不加密,所以安全性几乎可以说为零。因为,属性列表正常用于存储少量的并且不重要的数据。
在程序启动后,系统会自动创建一个NSUserDefaults的单例对象,我们可以获取这个单例来存储少量的数据,它会将输出存储在.plist格式的文件中。其优点是像字典一样的赋值方式方便简单,但缺点是无法存储自定义的数据。
代码示例:
//点击button保存数据
- (IBAction)saveData:(id)sender {
//获取NSUserDefaults对象
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//存数据,不需要设置路劲,NSUserDefaults将数据保存在preferences目录下
[userDefaults setObject:@&Lotheve& forKey:@&name&];
[userDefaults setObject:@&NSUserDefaults& forKey:@&demo&];
//立刻保存(同步)数据(如果不写这句话,会在将来某个时间点自动将数据保存在preferences目录下)
[userDefaults synchronize];
NSLog(@&数据已保存&);
//点击button读取数据
- (IBAction)getData:(id)sender
//获取NSUserDefaults对象
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//读取数据
NSString *name& = [userDefaults objectForKey:@&name&];
NSString *demo = [userDefaults objectForKey:@&demo&];
//打印数据
NSLog(@&name = %@ demo =%@&,name,demo);
点击“保存数据”后,查看沙盒中的Libarary/ Preferences目录:
数据以plist的格式写入磁盘中了。点开查看数据:
方式三:NSKeyedArchiver(归档操作)
与属性列表相反,同样作为轻量级存储的持久化方案,数据归档是进行加密处理的,数据在经过归档处理会转换成二进制数据,所以安全性要远远高于属性列表。另外使用归档方式,我们可以将复杂的对象写入文件中,并且不管添加多少对象,将对象写入磁盘的方式都是一样的。
使用NSKeyedArchiver对自定义的数据进行序列化,并且保存在沙盒目录下。使用这种归档的前提是让存储的数据模型遵守NSCoding协议并且实现其两个协议方法。(当然,如果为了更加安全的存储,也可以遵守NSSecureCoding协议,这是iOS6之后新增的特性)
使用归档操作存储数据的主要好处是,不同于前面两种方法只能存储几个常用的数据类型的数据,NSKeyedArchiver可以存储自定义的对象。
代码示例:
先创建一个继承NSObject的类,该类遵守NSCoding协议
TestPerson.h
@interface TestPerson : NSObject&NSCoding&
@property (nonatomic, copy) NSString *
@property (nonatomic, assign) NSI
@property (nonatomic, copy) NSString *
@property (nonatomic, strong) NSArray *familyM
TestPerson.m
#import &TestPerson.h&
@interface TestPerson ()
@implementationTestPerson
- (void)viewDidLoad
[super viewDidLoad];
#pragma mark - NSCoding协议方法 (一定要实现)
//当进行归档操作的时候就会调用该方法
//在该方法中要写清楚要存储对象的哪些属性
- (void)encodeWithCoder:(NSCoder *)aCoder
NSLog(@&调用了encodeWithCoder方法&);
[aCoder encodeObject:_name forKey:@&name&];
[aCoder encodeInteger:_age forKey:@&age&];
[aCoder encodeObject:_sex forKey:@&sex&];
[aCoder encodeObject:_familyMumbers forKey:@&familyMumbers&];
//当进行解档操作的时候就会调用该方法
//在该方法中要写清楚要提取对象的哪些属性
- (id)initWithCoder:(NSCoder *)aDecoder
NSLog(@&调用了initWithCoder方法&);
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@&name&];
self.age = [aDecoder decodeIntegerForKey:@&age&];
self.sex = [aDecoder decodeObjectForKey:@&sex&];
_familyMumbers = [aDecoder decodeObjectForKey:@&familyMumbers&];
这里还要讲一下一个小技巧:使用static修饰来替代宏定义。上面的序列化中,我们可以看到NSCoding的协议方法中对数据进行序列化并且使用一个key来保存它。正常情况下我们可以使用宏来定义key,但是过多的宏定义在编译时也会造成大量的损耗。这时候可以使用static定义静态变量来取代宏定义。
static NSString * const kUserNameKey = @&userName&;
让自定义的数据遵循NSCoding协议后,我们就能使用NSKeyedArchiver和NSKeyedUnarchiver来对持久化的数据进行存取操作了:
- (IBAction)saveData:(id)sender
//创建一个自定义类的实例
_p = [[TestPerson alloc]init];
_p.name = @&Lotheve&;
_p.age = 20;
_p.sex = @&m&;
_p.familyMumbers = @[@&Father&,@&Mather&,@&Me&];
//获取文件路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//文件类型可以随便取,不一定要正确的格式
NSString *targetPath = [docPath stringByAppendingPathComponent:@&lotheve.plist&];
//将自定义对象保存在指定路径下
[NSKeyedArchiver archiveRootObject:_p toFile:targetPath];
NSLog(@&文件已储存&);
- (IBAction)getData:(id)sender
//获取文件路径
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *targetPath = [docPath stringByAppendingPathComponent:@&lotheve.plist&];
TestPerson *person = [NSKeyedUnarchiver unarchiveObjectWithFile:targetPath];
NSLog(@&name = %@ , age =%ld , sex = %@ , familyMubers = %@&,person.name,person.age,person.sex,person.familyMumbers);
NSLog(@&文件已提取&);
点击“保存数据”后,查看沙盒中Documents目录:
点击查看文件内容:
点击“提取数据”后打印结果:
方式四:coreData
coreData是iOS5之后苹果推出的数据持久化框架,其提供了ORM的功能,将对象和数据相互转换。其中,它提供了包括sqlite、xml、plist等本地存储文件,默认使用sqlite进行存储。coreData具有两个模型:关系模型和对象模型,关系模型即是数据库,对象模型为OC对象。其关系图如下:
由于我们不需要关心数据的存储,coreData使用起来算是最简单的持久化方案。要使用coreData有两个方式,一个是在创建项目的时候勾选use core data,另一个则是手动创建。在这里我们要讲解的是前者创建的方式:
1、创建新项目勾选使用coreData
2、创建关系模型,在这里我创建的模型名字是LXDCoreDataDemo(注意名字一定要和项目名称保持一致)
3、在创建的关系模型中添加实体,命名为Person,并且添加三个字段:name、age、score
到了这里我们的实体模型就创建好了,接下来就是通过NSManagedObject来将实体模型转换成对象。通过从coreData取出的对象,全部都是继承自NSManagedObject的子类。那么我们需要根据当前的关系模型来创建Person类
选择LXDCoreDataDemo -& Next -& Person -& Create,我们就创建好了Person,这时候三个成员属性都会自动添加完成
在执行操作的类实现文件中,我们要加入AppDelegate和Person的头文件,因为在创建项目的时候如果我们勾选了use core data的选项,appDelegate文件中会帮我们生成用于管理、存储这些模型的对象,我们可以通过添加头文件来使用。插入数据的代码如下:
//先取出coredata上下文管理者
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = appDelegate.managedObjectC
//保存新数据
Person *person = [NSEntityDescription insertNewObjectForEntityForName: @&Person& inManagedObjectContext: context];
person.name = @&czk&
person.score = [NSNumber numberWithInt:100];
person.age = [NSNumber numberWithInt:25];
[appDelegate saveContext];
//查询所有数据
NSFetchRequest *request = [NSFetchRequest new];
NSEntityDescription *entity = [NSEntityDescription entityForName: @&Person& inManagedObjectContext: context];
[request setEntity: entity];
NSArray *results = [[context executeFetchRequest: request error: &error] copy];
for (Person *p in results) {
NSLog(@&%@, %@, %@&, p.name, p.age, p.score);
注意:如果出现崩溃异常,请卸载App后重新安装。
方式五:FMDB
对多线程的并发操作进行处理,所以是线程安全的;
以OC的方式封装了SQLite的C语言API,使用起来更加的方便;
FMDB是轻量级的框架,使用灵活。
因为它是OC的语言封装的,只能在ios开发的时候使用,所以在实现跨平台操作的时候存在局限性。
FMDB有三个主要的类
(1)FMDatabase
一个FMDatabase对象就代表一个单独的SQLite数据库
用来执行SQL语句
(2)FMResultSet
使用FMDatabase执行查询后的结果集
(3)FMDatabaseQueue
用于在多线程中执行多个查询或更新,它是线程安全的
这里建议使用CocoaPods导入FMDB,关于CocoaPods的使用这里就不啰嗦了。
创建数据库:
db&=&[FMDatabase&databaseWithPath:database_path];
1、当数据库文件不存在时,fmdb会自己创建一个。
2、 如果你传入的参数是空串:@&& ,则fmdb会在临时文件目录下创建这个数据库,数据库断开连接时,数据库文件被删除。
3、如果你传入的参数是 NULL,则它会建立一个在内存中的数据库,数据库断开连接时,数据库文件被删除。
打开数据库:
[db&open];
返回BOOL型。
[db&close];
数据库增删改等操作:
除了查询操作,FMDB数据库操作都执行executeUpdate方法,这个方法返回BOOL型。
看一下例子:
if([db&open])&{
NSString&*sqlCreateTable&=&&[NSString&stringWithFormat:@&CREATE&TABLE&IF&NOT&EXISTS&'%@'&('%@'&INTEGER&PRIMARY&KEY&AUTOINCREMENT,&'%@'&TEXT,&'%@'&INTEGER,&'%@'&TEXT)&,TABLENAME,ID,NAME,AGE,ADDRESS];
BOOLres&=&[db&executeUpdate:sqlCreateTable];
if(!res)&{
NSLog(@&error&when&creating&db&table&);
NSLog(@&success&to&creating&db&table&);
[db&close];
添加数据:
if([db&open])&{
NSString&*insertSql1=&[NSString&stringWithFormat:
@&INSERT&INTO&'%@'&('%@',&'%@',&'%@')&VALUES&('%@',&'%@',&'%@')&,
TABLENAME,&NAME,&AGE,&ADDRESS,&@&张三&,&@&13&,&@&济南&];
BOOLres&=&[db&executeUpdate:insertSql1];
NSString&*insertSql2&=&[NSString&stringWithFormat:
@&INSERT&INTO&'%@'&('%@',&'%@',&'%@')&VALUES&('%@',&'%@',&'%@')&,
TABLENAME,&NAME,&AGE,&ADDRESS,&@&李四&,&@&12&,&@&济南&];
BOOLres2&=&[db&executeUpdate:insertSql2];
if(!res)&{
NSLog(@&error&when&insert&db&table&);
NSLog(@&success&to&insert&db&table&);
[db&close];
修改数据:
if([db&open])&{
NSString&*updateSql&=&[NSString&stringWithFormat:
@&UPDATE&'%@'&SET&'%@'&=&'%@'&WHERE&'%@'&=&'%@'&,
TABLENAME,&&&AGE,&&@&15&,AGE,&&@&13&];
BOOLres&=&[db&executeUpdate:updateSql];
if(!res)&{
NSLog(@&error&when&update&db&table&);
NSLog(@&success&to&update&db&table&);
[db&close];
删除数据:
if([db&open])&{
NSString&*deleteSql&=&[NSString&stringWithFormat:
@&delete&from&%@&where&%@&=&'%@'&,
TABLENAME,&NAME,&@&张三&];
BOOLres&=&[db&executeUpdate:deleteSql];
if(!res)&{
NSLog(@&error&when&delete&db&table&);
NSLog(@&success&to&delete&db&table&);
[db&close];
数据库查询操作:
查询操作使用了executeQuery,并涉及到FMResultSet。
if([db&open])&{
NSString&*&sql&=&[NSString&stringWithFormat:
@&SELECT&*&FROM&%@&,TABLENAME];
FMResultSet&*&rs&=&[db&executeQuery:sql];
while([rs&next])&{
intId&=&[rs&intForColumn:ID];
NSString&*&name&=&[rs&stringForColumn:NAME];
NSString&*&age&=&[rs&stringForColumn:AGE];
NSString&*&address&=&[rs&stringForColumn:ADDRESS];
NSLog(@&id&=&%d,&name&=&%@,&age&=&%@&&address&=&%@&,&Id,&name,&age,&address);
[db&close];
FMDB的FMResultSet提供了多个方法来获取不同类型的数据:
数据库多线程操作:
如果应用中使用了多线程操作数据库,那么就需要使用FMDatabaseQueue来保证线程安全了。 应用中不可在多个线程中共同使用一个FMDatabase对象操作数据库,这样会引起数据库数据混乱。 为了多线程操作数据库安全,FMDB使用了FMDatabaseQueue,使用FMDatabaseQueue很简单,首先用一个数据库文件地址来初使化FMDatabaseQueue,然后就可以将一个闭包(block)传入inDatabase方法中。 在闭包中操作数据库,而不直接参与FMDatabase的管理。
FMDatabaseQueue * queue = [FMDatabaseQueue databaseQueueWithPath:database_path];
dispatch_queue_t&q1&=&dispatch_queue_create(&queue1&,&NULL);
dispatch_queue_t&q2&=&dispatch_queue_create(&queue2&,&NULL);
dispatch_async(q1,&^{
for(inti&=&0;&i&&&50;&++i)&{
[queue&inDatabase:^(FMDatabase&*db2)&{
NSString&*insertSql1=&[NSString&stringWithFormat:
@&INSERT&INTO&'%@'&('%@',&'%@',&'%@')&VALUES&(?,&?,&?)&,
TABLENAME,&NAME,&AGE,&ADDRESS];
NSString&*&name&=&[NSString&stringWithFormat:@&jack&%d&,&i];
NSString&*&age&=&[NSString&stringWithFormat:@&%d&,&10+i];
BOOLres&=&[db2&executeUpdate:insertSql1,&name,&age,@&济南&];
if(!res)&{
NSLog(@&error&to&inster&data:&%@&,&name);
NSLog(@&succ&to&inster&data:&%@&,&name);
dispatch_async(q2,&^{
for(inti&=&0;&i&&&50;&++i)&{
[queue&inDatabase:^(FMDatabase&*db2)&{
NSString&*insertSql2=&[NSString&stringWithFormat:
@&INSERT&INTO&'%@'&('%@',&'%@',&'%@')&VALUES&(?,&?,&?)&,
TABLENAME,&NAME,&AGE,&ADDRESS];
NSString&*&name&=&[NSString&stringWithFormat:@&lilei&%d&,&i];
NSString&*&age&=&[NSString&stringWithFormat:@&%d&,&10+i];
BOOLres&=&[db2&executeUpdate:insertSql2,&name,&age,@&北京&];
if(!res)&{
NSLog(@&error&to&inster&data:&%@&,&name);
NSLog(@&succ&to&inster&data:&%@&,&name);
上面已经分别介绍了五种方案的优缺点,在开发中,并没有说哪种持久化方案是最好的,只能说在不同开发场景下,最适合使用的持久化方案。
本文参考优秀博客:
/kf/775.html
http://blog.csdn.net/xyz_lmn/article/details/9312837
/p/86ea6da905cf
博主的微博、CocoaChina博客、简书同步更新,欢迎关注:
新浪微博:/p/6177/home?from=page_100505_profile&wvr=6&mod=data&is_all=1#place
简书:/users/63baf9271d14/latest_articles
CocoaChina:/477998
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:16456次
排名:千里之外

我要回帖

更多关于 app用户数据统计 的文章

 

随机推荐