|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
当时要是有人告诉我这些估计少走不少弯路还有提醒各位初学者刚开始学的时候会有几个月的低谷期很容易放弃如果挺过最开始的几个月后来就越学越容易了数据存储
Andoid中的数据存储和我们平常见到的纷歧样,大概说挪动设备的存储战争时纷歧样。Andoid中的存储体例有五种,单把存储拎出来,是由于我们后续的开辟会常常用到,主要性不问可知,多样的存储体例让我们选择时加倍天真,但每种体例都有各自的使用场景,不成互相替换,请看:
体例一:SharedPreferences
你能够叫它用户偏好参数,望文生义,就是用来存储一些用户的自界说设置,或别的“微型"用户数据
等等,仿佛忘了一件事,很主要,很主要!上面请按我说的做:
- 拿出你的Android手机
- 翻开R.E办理器(甚么?没有,还不快戳我)
- 检察文件
假如常常检察文件的同砚一定发明了这么一个奇异的征象
<br>
这三个路径里的文件居然千篇一律,弄毛啊!
实在原形是如许的
<br>
这个观点必定要明白,接着前往根目次,在/data/data/<包名>/...中(任意翻开一个包),会看到有/lib,/shared_prefs,/files,等几个文件夹,我们的sharedPreferencesfan体例所存储的文件地位就在/shared_prefs中,读写例子人人就本人找吧,对不住了!
这内里提到的这几个文件夹会常常用到,人人必定要熟习!
体例二:文件存储
这里的文件存储实在又能够分为两种
存储到体系默许地位
先看代码
<br>- /*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>- 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>- 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路径全体给注册上,以下:- //常量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部分,它有两个对照有用的办法:
•withAppendedId(uri,id)用于为路径加上ID部分
•parseId(uri)办法用于从路径中猎取ID部分ContentResolver:当内部使用必要对ContentProvider中的数据举行增加、删除、修正和查询操纵时,可使用ContentResolver类来完成,要猎取ContentResolver对象,可使用Activity供应的getContentResolver()办法。ContentResolver利用insert、delete、update、query办法,来操纵数据。
接上去看个例子吧:
Step1:界说你的Provider类- publicclassMyContentProviderextendsContentProvider{privateDbOpenHelerdbOpenHeler;//之前的SqlLitehelper类}
复制代码 Step2:界说你的Uri
<br>- 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傍边举行声明- <providerandroid:name=".MyContentProvider"android:authorities="com.letchoice.providers.personprovider"></provider>
复制代码 Step4:完成CURD办法(只贴一个query的)
<br>- @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>- 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 |
|