Android面试题(四)数据保存和网络

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1.常用的数据持久化(长久保存数据)方式有哪些?答:1、SharedPreference,共享参数形式,一种以Key-Value的键值对形式保存数据的方式,Android内置的,一般应用的配置信息,推荐使用此种方式保存,不能存文件也不适合。其存储的位置在/data/data/packageName/shared_prefs文件夹下面。2、InternalStorage:把数据存储到手机内部的存储空间,主要用来保存私有数据/data/data/packageName/files文件夹下面3、ExternalStorage:把数据存储到手机的外部存储SD卡中,主要用来保存非私有和大型数据,它有应用程序专用的文件夹,也有所有程序公用的文件夹(这个文件夹不会随着应用程序的卸载而卸载),需要赋予应用程序访问Sdcard的权限,Android的权限控制尤为重点,在Android程序中,如果需要做一些越界的操作,均需要对其进行授权才可以访问。在AndroidManifest.xml中添加代码:uses-permissionandroid:name=android.permission.WRITE_EXTERNAL_STORAGE/4、SQLiteDatabases:以表格形式存储信息的一个轻量级的小型数据库5、NetworkConnection:将数据存储到网络服务器上6、ContentProvider:他提供一种方式实现两个不同应用程序之间的通讯2.ShareedPrefrence的读写数据的基本方法?答:它保存的数据主要是简单类型的Key-value对。并且Value部分只能是一些基本数据类型:boolean、float、int、long、String等。1、得到SharedPreference对象的方法有:a、Context类中的getSharedPreference(Stringname,intmode)方法,name:存储的文件名,如果不存在会自动创建一个mode:访问模式,一般有两个参数MODE_PRIVTE(私有,只有当前应用程序才能进行读写)和MODE_MULTI_PROCESS(多个进程对同一个文件进行读写)b、Activity类中的getSharedPreference(intmode)方法,自动将当前活动的类名作为文件名c、PreferenceManager类的getDefaultSharedPreferences(Contextcontext)方法,这是一个静态方法,接收Context参数,会自动将应用程序的包名作为前缀去命名文件2、读常用方法:a、booleancontains(StringKey):判断SharedPreferences是否包含特定Key的数据b、abstractMapString,?getAll():获取SharedPreferences数据里全部的Key-Value对。c、booleangetXxx(Stringkey,XxxdefValue):获取SharedPreferences数据里指定Key对应的value。如果该Key不存在,返回默认值defValue。3、写常用方法(通过SharedPreferences的内部接口Editor实现,edit()方法即可得到Editor对象)a、abstractSharedPreferences.Editorclear():清空SharedPreferences里所有的数据b、abstractSharedPreferences.EditorputXxx(Stringkey,xxxvalue):向SharedPreferences中插入指定的Key-Value对。c、abstractSharedPreferences.Editorremove(Stringkey):从SharedPreferences中移除指定Key的数据。d、booleancommit():当Editor编辑完成后,调用该方法提交修改,切记不可忘记调用此方法,否则不能储存数据3.SQLite的基本语句:建表、增删改查分别是怎么样的?答:建表:CREATETABLEtableName(column1INTEGERPRIMARYKEYAUTOINCREMENT,column2VARCHAR(num),.....);添加:INSERTINTOtableNamevalues(value1,value2);添加所有字段INSERTINTOtableName(column1,column2)values(value1,value2);添加字段column1和字段column2删除:DELETETABLEtableName删除全部DELETETABLEtableNameWHEREcolumn2=vaule2按条件查询(字段column2的值为vaule2的这一行,如果value2为字符串则需要用单引号括起来)更新:UPDATEtableNameSETcolumn1=value1,column2=value2,...;所有数据都这样更新UPDATEtableNameSETcolumn1=value1,column2=value2WHEREcolumn3=value3;更新column3=value3这一行的column1和column2的值查询:SELECT*FROMtableName;查询所有的数据SELECTcolumn1,column3FROMtableName;查询所有数据,但是只显示column1,column3这两个字段的所有值SELECT*FROMtableNameWHEREcolumn2someValue;查询column2字段的值大于someValue的所有字段SELECT*FROMtableNameWHEREcolumn1=value1ORDERBYcolumn2ASC;按条件查询结果以column2的升序排列SELECT*FROMtableNameWHEREcolumn1=value1ORDERBYcolumn2DESC;按条件查询结果以column2的降序排列SELECT*FROMtableNameWHEREcolumn2LIKE'%key%'ORDERBYcolumn2ASC;//模糊查找4.SQLiteOpenHelper的作用是什么?答:SQLiteOpenHelper主要是用来创建数据库和表格,以及为数据库升级的作用。在Android系统中,既然可以通过Context类的openOrCreateDatabase()函数打开或创建SQLite数据库,并且可以通过其返回值(即SQLiteDatabase对像)调用execSQL()函数对数据库做任何的操作(CRUD),那么还需要SQLiteOpenHelper这个类有什么意义呢?例如:db=openOrCreateDatabase(DB_NAME,this.MODE_PRIVATE,null);db.execSQL(DROPTABLEIFEXISTSstudents);db.execSQL(CREATETABLEIFNOTEXISTSstudents(_idINTEGERPRIMARYKEYAUTOINCREMENT,name,ageINTEGER));实际上,直接操作数据库的语句和其他的语句混在一起,不利于程序的模块化。而SQLiteOpenHelper是一个抽象类,通过它的名字可以看出来,是一个帮我们打开数据库的小助手:1、当newSQLiteOpenHelper子类对象时,就会通过其构造函数创建数据库文件(当然如果数据库如果存在,就不用创建了,并且自动调用onCreate(SQLiteDatabasedb)创建数据表;2、当要对数据库读操作时,只需调用其子类的getReadableDatabase()返回SQLiteDatabase实例,通过该实例来执行SQL语句;3、当要对数据库写操作时,只需调用其子类的getWritableDatabase()返回SQLiteDatabase实例,通过该实例来执行SQL语句;4、当通过构造函数传进来的数据库版本高于之前的版本时,系统会调用onUpgrade()函数来更新数据库。于是,对APP而言,就屏蔽了数据库创建的过程,将数据表的创建独立出来了。SQLiteOpenHelper只是一个数据库管理的帮助类,让使用者不直接操作数据库而是通过操作这个类的对象来实现各种数据库操作。这个类就是给数据库操作搭了个架子,使用者根据需求去填充那些架子。5.什么是回调CallBack,回调的作用是什么?常见的回调使用场景?答:定义:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方法直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。有点多态的意思在里面,不知道具体的实现,所以只定义一个规范(接口),实现的时候自己实现该方法。定义在接口里,调用在一个地方(什么时候调用)(),具体实现又在另一个地方(触发调用的时机(具体实现))回调机制:我这个类实现了一个接口里的方法doSomething,然后注册到你这里,然后我就去做别的事情去了,你在某个触发的时机回头来调用我doSomething的方法。好比,我给你打电话问某个难题,你电话里想不出来,于是说等想到了再回我电话。(当想到答案后,调用回调方法,该方法的参数就是问题的答案,问问题就是将要问的问题和接口对象(即将想到的答案)作为参数注册到你的一个方法里那里(该方法里就是接受注册this.mcallback==mcallback,并将具体的问题在这方法中展现(其它参数拼接)),但是该方法在什么时候调用呢?当你遇到问题的时候调用该方法,接口方法的参数就是你想要的答案即该接口方法将答案告诉了你,而接口方法的实现就是你收到答案后要做的事)。函数的参数其实就是指针,就是引用,指向你调用方法时传进来的参数值,建立方法的时候是形式参数,而调用函数时的就是实参作用:1、可以节省时间,不用长久的等待,充分利用了资源2、把接口方法的定义和调用给封装起来,让工具类的使用变得简单易用。用户不需要关心接口方法的定义以及调用,只需要关注方法的具体实现功能即可。使用场景:1、事件监听器,这其实就是回调最常见的应用场景之一2、生命周期函数3、当方法的具体实现不确定的时候可以设置回调函数让清楚的人自己去实现,而我们只是提供一个实现的接口出去,而其它的别人不需要知道的东西都封存起来,这也体现了封装和面向对象的思想,你问我问题,而我想到了答案告诉你,至于你拿到答案后干什么,我怎么想到的答案都不需要对方知道6.TCP和UDP的区别是什么?答:TCP:传输控制协议。a、面向连接,靠三次握手来完成b、速度相对较慢,因为连接的过程会耗时间和资源c、可靠的协议,数据不会丢失d、数据大小没有限制e、耗用系统资源相对较多UDP:用户数据报文协议a、面向无连接的b、高效的、速度快c、不可靠的协议,容易丢失数据d、数据包大小有限制,小于64Ke、耗用系统资源相对较少7.Http的get和post方法的区别什么?答:get方法:原理上:主要用来获取或者查询资源信息,是安全的和幂等的。就是说不修改信息表面上:a、GET请求的数据会附在URL之后(就是把数据放在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连b、GET方式提交的数据较小(浏览器和操作系统对URL长度的限定),一般1024字节c、GET的安全性相对较弱,可能会造成信息泄露(信息会明文出现在URL上,其他人可能会通过浏览器的缓存查看到历史记录,从而得到信息)d、服务器端用Request.QueryString获取变量的值e、GET请求用起来比比较方便post方法:原理上:根据Http规范,POST表示可能修改服务器上资源的请求表面上:a、POST

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功