仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1344|回复: 14
打印 上一主题 下一主题

[学习教程] IOS编程:.Net码农学Android---疾速懂得数据存储仓酷云

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:26:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
当时要是有人告诉我这些估计少走不少弯路还有提醒各位初学者刚开始学的时候会有几个月的低谷期很容易放弃如果挺过最开始的几个月后来就越学越容易了数据存储
Andoid中的数据存储和我们平常见到的纷歧样,大概说挪动设备的存储战争时纷歧样。Andoid中的存储体例有五种,单把存储拎出来,是由于我们后续的开辟会常常用到,主要性不问可知,多样的存储体例让我们选择时加倍天真,但每种体例都有各自的使用场景,不成互相替换,请看:
体例一:SharedPreferences
你能够叫它用户偏好参数,望文生义,就是用来存储一些用户的自界说设置,或别的“微型"用户数据
等等,仿佛忘了一件事,很主要,很主要!上面请按我说的做:

  • 拿出你的Android手机

  • 翻开R.E办理器(甚么?没有,还不快戳我)
  • 检察文件
假如常常检察文件的同砚一定发明了这么一个奇异的征象

<br>
这三个路径里的文件居然千篇一律,弄毛啊!
实在原形是如许的

<br>
这个观点必定要明白,接着前往根目次,在/data/data/<包名>/...中(任意翻开一个包),会看到有/lib,/shared_prefs,/files,等几个文件夹,我们的sharedPreferencesfan体例所存储的文件地位就在/shared_prefs中,读写例子人人就本人找吧,对不住了!
这内里提到的这几个文件夹会常常用到,人人必定要熟习!
体例二:文件存储
这里的文件存储实在又能够分为两种
存储到体系默许地位
先看代码

<br>
  1. /*name文件名,只是名字,不包括路径,如love/*content内容publicvoidsave(Stringname,Stringcontent){try{FileOutputStreamoutputStream=context.openFileOutput(name,Context.MODE_WORLD_WRITEABLE+Context.MODE_WORLD_READABLE);outputStream.write(content.getBytes());outputStream.close();}catch(Exceptione){//TODO:handleexception}}
复制代码

<br>
注重看代码中的正文,指定了文件名后,会默许存储到之前的/data/data/<包名>/files/<name>,格局默许xml,便是k/v的情势。
存储到自界说地位

<br>
  1. publicvoidsaveToSdcard(Stringfilename,Stringcontent)throwsException{Filepold=newFile("/storage/sdcard0",filename);FileOutputStreamoutputStream=newFileOutputStream(file);outputStream.write(content.getBytes());outputStream.close();}
复制代码

<br>
能够指定文件地位,对照天真,但团体倡议仍是恪守Android的商定,即便用默许存储地位,便于办理保护,布局也对照明晰。
体例三:SqlLite数据库存储
SqlLite简介,请走此通道,Android中内嵌了SqlLite,以是利用部署时不必安装数据库甚么的了。
SqlLite场景合适于那些数据对照复杂,庞大的数据存储,而且也有相干的Gui。
先看段代码:

<br>
  1. publicclassDbOpenHelerextendsSQLiteOpenHelper{//需手动完成一下机关办法publicDbOpenHeler(Contextcontet){super(contet,"itcast.db",null,3);//传进版本号}publicDbOpenHeler(Contextcontext,Stringname,CursorFactoryfactory,intversion){super(context,"itcast.db",null,1);//TODOAuto-generatedconstructorstub}@OverridepublicvoidonCreate(SQLiteDatabasedb){//第一次创立时会实行//TODOAuto-generatedmethodstubdb.execSQL("CREATETABLEperson(personIdintegerprimarykeyautoincrement,namevarchar(20))");}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){//TODOAuto-generatedmethodstub//当版本号纷歧样时即晋级时会实行//db.execSQL("ALTERTABLEpersonADDphonevarchar(20)null");db.execSQL("ALTERTABLEpersonADDamountinteger");}}
复制代码

<br>
看到OnCreate和OnUpgrade了吗,这两个办法必需给完成了。
OnCreate()在初始化你自界说的数据库时会挪用,你必需给它指定一个版本号,用来标识。
OnUpgrade()的感化是:当我们因为需求必要修正数据库或晋级数据库时,只需在机关办法中从头写进一个新的版本号(和之前的版本号分歧),体系就会检测到分歧从而挪用OnUpgrade(),你只需把你要改的到场到OnUpgrade()中就ok了
详细SqlLite操纵实例,请看http://www.ckuyun.com/cczw/archive/2012/05/23/2514544.html
体例四:ContentProvider
这是一种共享数据的存储体例,当你的一些数据必要表露给其他挪用者时就要用用到这个了。
有些同砚大概会说,我能够把数据放在文件中,好比体例一中的路径下不也能够会见吗?不成以,安卓中十分注意用户的平安性,以是良多操纵都被加上了权限的考证,体例一中的路径下的文件默许是只能让本应由会见的,(接纳公然写进权限能够会见),同时也一致了使用间共享数据会见体例。
同时,Android为罕见的一些数据供应了默许的ContentProvider(包含音频、视频、图片和通信录等)。
起首来明白几个观点
观点一.Uri(一致资本标识符)
为体系的每个资本给其一个名字,例如说通话纪录。
1、每个ContentProvider都具有一个大众的URI,这个URI用于暗示这个ContentProvider所供应的数据。
2、Android所供应的ContentProvider都寄存在android.provider包中。将其分为A,B,C,D4个部分:

<br>
A:尺度前缀,用来讲明一个ContentProvider把持这些数据,没法改动的;"content://"
B:URI的标识,它界说了是哪一个ContentProvider供应这些数据。关于第三方使用程序,为了包管URI标识的独一性,它必需是一个完全的、小写的类名。这个标识在元素的authorities属性中申明:通常为界说该ContentProvider的包.类的称号;"content://com.android.text.myprovider"
C:路径,普通的讲就是你要操纵的数据库中表的名字,大概你也能够本人界说,记得在利用的时分坚持分歧就ok了;"content://com.android.text.myprovider/tablename"
D:参数,假如URI中包括暗示必要猎取的纪录的ID;则就前往该id对应的数据,假如没有ID,就暗示前往全体;"content://hx.android.text.myprovider/tablename/#"#暗示数据id
观点.二UriMatcher、ContentUrist和ContentResolver
由于Uri代表了要操纵的数据,以是我们很常常必要剖析Uri,并从Uri中猎取数据。Android体系供应了两个用于操纵Uri的工具类,分离为UriMatcher和ContentUris。
UriMatcher:用于婚配Uri,它的用法以下:
1.起首把你必要婚配Uri路径全体给注册上,以下:
  1. //常量UriMatcher.NO_MATCH暗示不婚配任何路径的前往码(-1)。UriMatcheruriMatcher=newUriMatcher(UriMatcher.NO_MATCH);//假如match()办法婚配content://com.letchoice.providers.personprovider路径,前往婚配码为1uriMatcher.addURI(“com.letchoice.providers.personprovider”,“person”,1);//增加必要婚配uri,假如婚配就会前往婚配码//假如match()办法婚配content://com.letchoice.provider.personprovider/person/230路径,前往婚配码为2uriMatcher.addURI(“com.letchoice.providers.personprovider”,“person/#”,2);//#号为通配符
复制代码
2.注册完必要婚配的Uri后,就能够利用uriMatcher.match(uri)办法对输出的Uri举行婚配,假如婚配就前往婚配码,婚配码是挪用addURI()办法传进的第三个参数,假定婚配content://com.letchoice.provider.personprovider/person路径,前往的婚配码为1。
ContentUris:用于猎取Uri路径前面的ID部分,它有两个对照有用的办法:
&bull;withAppendedId(uri,id)用于为路径加上ID部分
&bull;parseId(uri)办法用于从路径中猎取ID部分ContentResolver:当内部使用必要对ContentProvider中的数据举行增加、删除、修正和查询操纵时,可使用ContentResolver类来完成,要猎取ContentResolver对象,可使用Activity供应的getContentResolver()办法。ContentResolver利用insert、delete、update、query办法,来操纵数据。
接上去看个例子吧:
Step1:界说你的Provider类
  1. publicclassMyContentProviderextendsContentProvider{privateDbOpenHelerdbOpenHeler;//之前的SqlLitehelper类}
复制代码
Step2:界说你的Uri

<br>
  1. privateDbOpenHelerdbOpenHeler;privatestaticfinalUriMatcherMATCHER=newUriMatcher(UriMatcher.NO_MATCH);//界说一个Matcher//privatestaticfinalintPERSON=1;//privatestaticfinalintPERSON=2;publicenumPERSON{//自界说列举参数值INSERT(1),DELETE(2);privateintnCode;privatePERSON(intnCode){this.nCode=nCode;}@OverridepublicStringtoString(){//TODOAuto-generatedmethodstubreturnString.valueOf(this.nCode);}};//这里是你界说的Uri,分两种,一种不带参数,一种带参数static{MATCHER.addURI("com.letchoice.providers.personprovider","person",Integer.parseInt(PERSON.INSERT.toString()));MATCHER.addURI("com.letchoice.providers.personprovider","person/#",Integer.parseInt(PERSON.DELETE.toString()));}
复制代码

<br>
Step3:在AndroidManifest.xml傍边举行声明
  1. <providerandroid:name=".MyContentProvider"android:authorities="com.letchoice.providers.personprovider"></provider>
复制代码
Step4:完成CURD办法(只贴一个query的)

<br>
  1. @OverridepublicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder){//TODOAuto-generatedmethodstubSQLiteDatabasedb=dbOpenHeler.getReadableDatabase();switch(MATCHER.match(uri)){//婚配检测case1://假如uri不带参数就不带参数查询returndb.query("person",projection,selection,selectionArgs,null,null,sortOrder);case2://假如uri带参数就带参数查询longrid=ContentUris.parseId(uri);Stringwhere="personId="+rid;if(selection!=null&&!"".equals(selection.trim())){where+="and"+selection;}returndb.query("person",projection,where,selectionArgs,null,null,sortOrder);default:thrownewIllegalArgumentException("thisisUnknownUri"+uri);}}
复制代码

<br>
Step5:内部挪用query失掉你想要的了局

<br>
  1. publicvoidtestQuery(){Uriuri=Uri.parse("content://com.letchoice.providers.personprovider/person");ContentResolverresolver=this.getContext().getContentResolver();//利用ContentResolver剖析uriCursorcursor=resolver.query(uri,null,null,null,"personIdasc");//依照personId晋级排序cursor.moveToFirst();while(cursor.moveToNext()){Log.i("testQuery",cursor.getString(cursor.getColumnIndex("name")));//打印出了局}cursor.close();}
复制代码

<br>
体例五:收集猎取
后面先容的几种存储都是将数据存储在当地设备上,除此以外,另有一种存储(猎取)数据的体例,经由过程收集来完成数据的存储和猎取。
我们能够挪用WebService前往的数据或是剖析HTTP协定完成收集数据交互。

如果同时支持iOS5和iOS4用宏判断下就可以当然也可以直接用assign)还有一点开始学习的时候肯定很疑惑内存管理是基于函数名称的比如带alloccopy的函数用了之后返回的对象一定要release
海妖 该用户已被删除
沙发
发表于 2015-1-21 06:53:23 | 只看该作者
同很多iOS开发者一样,我也是通过培训进入到iOS开发这个行业,开始没有打算培训,只准备自己学习一些计算机编程相关的知识,毕业时找一份编程相关工作(本人是信息与计算科学这个专业,是数学系)。
老尸 该用户已被删除
板凳
发表于 2015-1-30 10:13:37 | 只看该作者
才在自己的Windows电脑上安装配置成功了一个完美的Mac OS X Lion(10.7.4)系统,而且下载了Xcode4.5的最新版本。虽然不能实机调试,但是作为iOS开发学习已经非常完美了。
莫相离 该用户已被删除
地板
发表于 2015-2-2 17:17:06 来自手机 | 只看该作者
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
透明 该用户已被删除
5#
发表于 2015-2-4 01:04:07 | 只看该作者
培训的时候很痛苦,每天要待12个小时,上午讲课,下午和晚自习解决作业,看文档,学习的时候感觉就是资料太少,而且看着资料也不明所以,非常痛苦,
蒙在股里 该用户已被删除
6#
发表于 2015-2-9 08:45:22 | 只看该作者
边吃零食边看Stanford的视频教程
活着的死人 该用户已被删除
7#
发表于 2015-2-16 19:52:50 | 只看该作者
从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以,
因胸联盟 该用户已被删除
8#
发表于 2015-2-23 13:23:16 | 只看该作者
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
不帅 该用户已被删除
9#
发表于 2015-3-3 01:22:41 | 只看该作者
这个办法就是在WindowsXP或Win7的电脑上,使用vmware虚拟机来搭建一个真实的Mac OS X环境。
变相怪杰 该用户已被删除
10#
发表于 2015-3-4 00:18:15 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
兰色精灵 该用户已被删除
11#
发表于 2015-3-6 07:34:23 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
乐观 该用户已被删除
12#
发表于 2015-3-9 21:16:56 | 只看该作者
培训时可以选择安卓,iOS,Java,因为实习的时候我选了安卓,当时实习时间只有三周,学的晕头转向,而java我也没学过,iOS的基础是C语言,这个大学里还是学过的,于是选择了iOS。
灵魂腐蚀 该用户已被删除
13#
发表于 2015-3-11 14:39:48 | 只看该作者
iPhone文件系统:创建、重命名以及删除文件,NSFileManager中包含了用来查询单词库目录、创建、重命名、删除目录以及获取/设置文件属性的方法(可读性,可编写性等等)。
爱飞 该用户已被删除
14#
发表于 2015-3-18 19:20:45 | 只看该作者
好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。
第二个灵魂 该用户已被删除
15#
发表于 2015-3-26 12:26:18 | 只看该作者
以上可以同时进行,学习过程中尽量不要纠结细节和底层,要知道ios是封闭的、OC是高级语言,我们不可能过多地去了解它的原理,至少在新手阶段没有必要。用迭代的方式更新你的知识,而不是死抠一个知识点。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 00:23

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表