Android应用开发基础教程(微课版) 课件 第5、6章 数据存储、ContentProvider_第1页
Android应用开发基础教程(微课版) 课件 第5、6章 数据存储、ContentProvider_第2页
Android应用开发基础教程(微课版) 课件 第5、6章 数据存储、ContentProvider_第3页
Android应用开发基础教程(微课版) 课件 第5、6章 数据存储、ContentProvider_第4页
Android应用开发基础教程(微课版) 课件 第5、6章 数据存储、ContentProvider_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Andriod应用开发基础教程第5章数据存储应用程序在Android系统运行过程中产生的用户数据、日志、下载的图片、文件等都需要存储在Android系统提供的存储空间里,系统提供了SharePreferences、应用专属存储、数据库、共享存储等方式来存储这些产生的数据。(1)SharePreferences:将数据以键值对形式存储在XML文件中;(2)应用专属存储:此种存储方式仅供应用使用,可以将应用数据存储到内部存储空间的专属目录或外部存储空间中的私有目录。(3)共享存储:存储应用间能共享的文件,包括媒体、文档和其他文件;(4)数据库:将结构化数据存储在专用数据库中。表5-1数据存储方式特点存储方式存储内容类型其它应用可否访问卸载应用是否移除SharePreferences键值对否是应用专属存储仅供应用使用文件否是数据库结构化数据否是媒体可共享的媒体文件(图片、音频文件、视频)是,但其他应用需要READ_EXTERNAL_STORAGE权限否文档和其他文件其他类型的可共享内容,包括已下载的文件是,可以通过系统文件选择器访问否5.1SharePreferencesSharePreferences是一种轻量级的存储方式,适合单进程、小批量的数据存储与访问,可用于保存应用的配置信息,大数据不合适采用SharedPreferences存放,SharedPreferences用xml文件存放数据,文件目录位于/data/data/包名/shared_prefs下。SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences的实例,只能通过Activity的getSharedPreferences()方法、Context的getPreferences()方法和PreferenceManager的getDefaultSharedPreferences()方法来获取SharedPreferences的实例,这些方法中第一个参数用于指定SharedPreferences文件的名称(格式为xml文件),如果指定的文件不存在则会创建一个,第二个参数用于指定存储模式。有下面的一些模式:1、MODE_PRIVATE:默认模式,创建的文件只能由调用应用程序(或共享相同用户ID的所有应用程序)访问;2、MODE_WORLD_READABLE:允许所有其它应用程序对创建的文件具有读取权限,AndroidAPI17之后不再赞成此模式。创建所有应用程序可读的文件非常危险,并可能在应用程序中造成安全漏洞,应用程序应该使用更正式的交互机制,如ContentProvider、BroadcastReceiver和Service。3、MODE_WORLD_WRITEABLE:允许其它所有应用程序对创建的文件进行读写,AndroidAPI17之后不再赞成此模式。同MODE_WORLD_READABLE一样,创建所有应用程序可读写的文件非常危险,并可能在应用程序中造成安全漏洞。4、MODE_MULTI_PROCESS:允许在应用程序有多个进程的情况下,所有进程都写入同一SharedPreferences文件,AndroidAPI23之后不再赞成此模式。在一些版本的Android中工作不可靠,而且没有提供任何机制来协调进程之间的并发修改,应尽量避免使用。5、MODE_APPEND:如果文件已存在,则将数据写入现有文件的末尾,而不是擦除它。得到SharedPreferences实例后,需要调用SharedPreferences实例的edit()方法来获取一个SharedPreferences.Editor实例来完成数据操作。表5-2SharedPreferences.Editor实例常用方法方法作用clear()从SharedPreferences文件中移除保存的所有值putBoolean(String

key,

booleanvalue)putFloat(String

key,

floatvalue)putInt(String

key,

intvalue)putLong(String

key,

longvalue)putString(String

key,

String

value)putStringSet(String

key,

Set<String>values)向SharedPreferences文件中添加不同类型数据:布尔型、浮点型、整型、长整型、字符串、字符串列表remove(String

key)从SharedPreferences文件中移除键值相关联数据commit()apply()向SharedPreferences文件提交修改。commit()方法是同步的,会返回一个布尔值表示是否成功提交;apply()方法是异步的,没有返回值,适用于对性能有较高要求的情况。保存在SharedPreferences文件中的数据可直接通过SharedPreferences实例来获取。表5-3SharedPreferences实例获取存储数据常用方法方法作用abstractboolean

contains(String

key)从SharedPreferences文件查找是否包含键值关联的数据abstractMap<String,?>getAll()从SharedPreferences文件中遍历所有数据abstractboolean

getBoolean(String

key,

booleandefValue)abstractfloat

getFloat(String

key,

floatdefValue)abstractint

getInt(String

key,

intdefValue)abstractlonggetLong(String

key,

longdefValue)abstract

String

getString(String

key,

String

defValue)abstract

Set<String>getStringSet(String

key,

Set<String>defValues)返回SharedPreferences文件中各种类型数据:布尔型、浮点型、整型、长整型、字符串、字符串列表。"key"是存储数据时使用的键,"defValue"是一个默认值,如果该键不存在,则会返回这个默认值。案例5.1

使用SharedPreferences存取数据(参考代码见:SharedPreferencesActivity)运行SharedPreferencesActivity在模拟器生成应用,在应用界面中文本输入框输入姓名和年龄信息,点击“向SharedPreferences存数据”按钮,将姓名和年龄信息保存到SharedPreferences,返回AndroidStudio在菜单栏中依次点开视图>工具窗口>DeviceExplore,在打开的DeviceExplore窗口中,依次点开data>data

>com.example.datastorage(本项目的包名)>shared_prefs,在shared_prefs目录下则可看见新生成的SharedPreferences文件MySharedPreferencesFile.xml,该文件内容如下:1<?xmlversion='1.0'encoding='utf-8'standalone='yes'?>2<map>3<stringname="name">啄木鸟</string>4<intname="age"value="18"/>5</map>返回模拟器应用,点击应用界面“从SharedPreferences取数据”按钮,从SharedPreferences获取到的姓名年龄信息5.2内部和外部存储在Android开发常涉及到以下三个几个概念:内存,内部存储,外部存储。英文中内存为Memory,内部存储为InternalStorage,外部存储为ExternalStorage,当我们翻译为中文之后,前两个都简称为内存,容易产生混淆,这三者到底有什么区别呢?1、内存:手机内存用于暂时存放CPU中的运算数据以及与硬盘等外部存储器交换的数据。手机内存越大越能流畅地运行多个应用。2、内部存储:内部存储用目录来区分的话就是/data目录下的data文件夹:/data/data,普通用户是无权访问的,用户需要手机ROOT权限才可以查看。开发者可以通过AndroidStudio在菜单栏中依次点开视图>工具窗口>DeviceExplore,在打开的DeviceExplore窗口中,依次点开data>data来查看该目录。每个应用在安装成功后,会在/data/data目录下面创建以该应用的包名为名称的目录,这个目录即为应用专属的内部存储目录,当应用被卸载后,该目录会被系统自动删除。将数据存储于内部存储中,其实就是把数据存储到自己应用包名对应的内部存储目录中。每个应用的内部存储目录都是私有的,也就是说内部存储目录下的文件只能被该应用访问到,其他应用是没有权限访问的。应用访问自己的内部存储目录时不需要申请任何权限。3、外部存储:外部存储是我们平时操作最多的,外部存储目录就是DeviceExplore窗口中看见的/storage文件夹,也有可能是/mnt文件夹,不同厂家有可能不一样。外部存储根据存储特点不同分为两种类型,外部私有存储和外部共有存储。私有目录属于外部存储的私有存储空间,该目录为/storage/emulated/0/Android/data下的以包名为名称的文件夹,这些文件夹是应用的外部存储私有目录。公共目录属于外部存储的共享空间,在/storage/emulated/0目录下看见的DCIM、Download、Music、Movies、Pictures等系统为我们创建的目录里面的文件所有应用可以共享,这些目录为外部存储公共目录。应用的配置信息、数据库信息、缓存文件等应用相关数据在应用被卸载后,这些信息也应该被随之删除,避免占用存储空间产生不必要的浪费,这些应用相关数据应当放到外部私有存储目录下。用户在使用应用的过程中产生的图片、文件等其它应用无关数据一般用户希望与其他应用共享,在应用被删除后仍然保存在设备中,适合存放在外部存储空间的公共目录。应用可以无需权限访问自己的外部存储私有目录,应用访问其它应用的外部存储私有目录在Android7.0前可通过file://这种形式的Uri直接读写该目录下的文件内容,Android7.0开始需要通过FileProvider访问。应用在访问外部公有目录之前需要申请外部存储权限,在Android6.0以后,外部存储权限还要动态申请。表5-4外部存储和内部存储比较表5-5访问内部和外部存储目录的方法方法访问路径内部存储目录context.getDataDir()/data/data/包名,应用内部存储的根目录context.getFilesDir()/data/data/包名/files,应用内部存储的files目录context.getCacheDir()/data/data/包名/cache,应用内部存储的cache目录context.getDir(Stringname,intmode)/data/data/包名/name,如果该目录不存在,系统会自动创建该目录。mode取值可为MODE_APPEND、MODE_PRIVATE、MODE_WORLD_READABLE、MODE_WORLD_WRITABLE。外部私有存储目录context.getExternalCacheDir()/storage/emulated/0/Android/data/包名/cacheContext.getExternalFilesDir(Stringtype)1、type=””:/storage/emulated/0/Android/data/package_name/files2、type=”xxx”:(xxx表示目录名)/storage/emulated/0/Android/data/package_name/files/xxx外部共有存储目录Environment.getExternalStorageDirectory()/storage/emulated/0,外部共有存储目录的根目录Environment.getExternalStoragePublicDirectory(Stringtype)1、type=””:/storage/emulated/02、type=”xxx”:(xxx表示目录名)/storage/emulated/0/xxx3、type=”Environment.DIRECTORY_PICTURES”|”Environment.DIRECTORY_MUSIC”|”Environment.DIRECTORY_DICM”|”Environment.DIRECTORY_ALARM”等:/storage/emulated/0/(系统自己创建的Pictures、Music等目录)无论内部还是外部存储空间,只要路径中有包名,那么就是应用私有的存储路径,存放应用相关数据,随着应用的的卸载而被删除,可通过调用Context里面的方法获取路径位置,而路径中不含包名的路径为应用公共存储空间,存放应用无关数据,可通过Environment里面的方法来获取路径位置。案例5.2

内部存储目录写入读取数据(参考代码见:InternalStorageActivity)运行InternalStorageActivity在模拟器生成应用,在应用界面编辑框输入数据,点击“保存”按钮,在DeviceExplore窗口中,依次点开data>data>com.example.datastorage>files,发现内部存储files目录下确实生成一个名为InternalStorageFile.text的文本文件,打开该文本文件,文本文件保存数据正为文本框中输入内容。返回应用,点击应用界面“读取”按钮,读取到了应用内部存储目录files下的InternalStorageFile.text文件内容向外部存储私有目录读写数据时,只需要在案例5-2基础上在创建File实例时将getApplicationContext().getFilesDir()改为getApplicationContext().getExternalFilesDir(“”),文件存储位置变为/storage/emulated/0/Android/data/com.example.datastorage/files,过程和结果与案例5-2类似案例5.3

向外部存储公有目录读写数据(参考代码见:ExternalStorageActivity)运行ExternalStorageActivity在模拟器生成应用,应用界面弹出动态申请外部存储公共目录访问权限的对话框,对话框点击“允许”进入应用界面,在辑框输入数据,点击“保存”按钮,在DeviceExplore窗口中,依次点开/storage/emulated/0,发现该外部存储公有目录下确实生成一个名为ExternalStorageFile.text的文本文件,打开该文本文件,文本文件保存数据正为文本框中输入内容。返回应用,点击应用界面“读取”按钮,读取外部存储公有目录下ExternalStorageFile.text文件内容5.3数据库存储SQLite是Android内置的一个小型、关系型、属于文本型的数据库,是一种轻量级的嵌入式关系型数据库管理系统,广泛应用于Android应用开发中。Android提供了SQLiteOpenHelper类和SQLiteDatabase类来管理SQLite数据库。SQLiteOpenHelper类用于创建和管理数据库以及版本控制,SQLiteDatabase类用于执行创建表、数据增删改查更新等操作。表5-6SQLiteOpenHelper类操作数据库方法方法作用abstractvoidonCreate(SQLiteDatabasedb)数据库第一次被创建时调用。在该方法中,可以执行创建数据库表的SQL语句voidclose()数据库关闭前调用voidonOpen(SQLiteDatabasedb)数据库打开后调用voidonConfigure(SQLiteDatabasedb)数据库被配置时调用,以启用如写日志、外键支持等功能。abstractvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)当数据库需要升级时调用此方法。在该方法中,可以执行升级数据库表的SQL语句voidonDowngrade(SQLiteDatabasedb,intoldVersion,intnewVersion)当数据库需要降级时调用此方法。在该方法中,可以执行降级数据库表的SQL语句href="/reference/android/database/sqlite/SQLiteDatabase"SQLiteDatabasegetWritableDatabase()获取一个可读/写的数据库实例,如果数据库不存在,则会调用onCreate()方法创建href="/reference/android/database/sqlite/SQLiteDatabase"SQLiteDatabasegetReadableDatabase()获取一个可读的数据库实例,如果数据库不存在,则会调用onCreate()方法创建表5-7SQLiteDatabase类操作数据库方法方法作用voidexecSQL(Stringsql)执行SQL语句,如创建表、插入数据、更新数据、删除数据等,不能进行查询操作longinsert(Stringtable,StringnullColumnHack,ContentValuesvalues)插入数据int

update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)更新数据int

delete(Stringtable,StringwhereClause,String[]whereArgs)删除数据long

replace(Stringtable,StringnullColumnHack,ContentValuesinitialValues)替换数据库中一行数据Cursor

query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)查询数据table:表名;columns:列名称数组,指定从哪些列寻找;selection:查询的条件,相当于where后的内容;selectionArgs:查询条件的参数;groupBy:分组列;having:分组条件;orderBy:排序列;Cursor

rawQuery(Stringsql,String[]selectionArgs)执行一条SQL查询语句void

beginTransaction()开启事务void

setTransactionSuccessful()标记事务成功void

endTransaction()结束事务Cursor

rawQueryWithFactory(SQLiteDatabase.CursorFactorycursorFactory,Stringsql,String[]selectionArgs,StringeditTable)执行一条SQL查询语句,并使用指定的CursorFactory创建Cursorclose()关闭数据库String

getPath()获取数据库文件路径表5-8Cursor类常用方法方法作用abstractintgetCount()获得游标总项abstractintgetColumnIndexOrThrow(StringcolumnName)由列名称获得列索引abstractString[]

getColumnNames()获得列名称abstractintgetPosition()获得游标位置abstractbooleanisFirst()判断游标是否在第一行abstractbooleanisLast()判断游标是否在最后一行abstractbooleanmoveToFirst()移动游标到第一行abstractbooleanmoveToLast()移动游标到最后一行abstractbooleanmoveToNext()移动游标到下一行abstractbooleanmoveToPrevious()移动游标到上一行abstractbooleanmoveToPosition(intposition)移动游标到指定位置在Android中查询数据是通过Cursor类来实现的,当我们使用query()或rawQuery()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据Android中SQLite数据库的使用一般分为以下几步:(1)创建数据库:创建一个继承自SQLiteOpenHelper的类,在该类中通过onCreate()方法创建一个数据库;(2)创建表:通过SQLiteDatabase类的execSQL()方法直接执行sql语句创建表;(3)操作表:通过SQLiteDatabase类的方法执行数据库中的数据增删改查等操作,建议增删改操作通过execSQL()方法直接执行sql语句,因为使用insert()、delete()、query()方法具备多个参数,使用较为复杂;(4)关闭数据库:调用SQLiteDatabase类的close()方法释放数据库连接,否则容易出现SQLiteException案例5.4

通过SQLite数据库操作应用存储数据(参考代码见:SQLiteActivity)运行SQLiteActivity在模拟器生成应用,在应用界面选择输入学生信息后,点击“添加”按钮即可向数据库中添加学生信息,数据库文件student位于/data/data/包名/databases目录下,点击“查询”按钮可查看数据库中保存的所有学生信息,在提示“输入要操作的学生ID”的编辑框输入学生id,点击“删除”按钮即可删除该学生所有信息,在提示“输入要操作的学生ID”的编辑框输入学生id,填入学生更改之后的数据即可对该学生的信息进行修改。Andriod应用开发基础教程第6章ContentProvider6.1ContentProvider和URI简介ContentProvider是Android四大组件之一,用于在不同的应用程序之间共享数据。它提供了提供数据访问的接口,例如联系人、媒体文件、日历事件等,使得应用程序可以通过ContentResolver访问和修改其他应用程序中的数据,而不需要了底层数据存储的细节,ContentProvider提供了安全的数据共享机制,可以控制数据的访问权限。ContentProvider本身并不直接存储数据,它只是定义了数据的访问接口,数据的实际存储方式是第五章提过的内部和外部存储、SharedPreferences存储、SQLite数据库存储,ContentProvider能共享的数据包括照片、音频、视频等文件数据,数据库中的结构化数据和网络数据等。图6-1ContentProvider数据共享方式URI是一种用于标识资源的字符串,它可以是一个网址、文件路径或其他形式的资源定位符,通常用于访问ContentProvider提供的数据。URI由Scheme(协议)、Authority(权限)、Path(路径)三部分组成,如图6-2所示。(1)Scheme:采用前缀content://,是由Android规定的ContentProvider的URI前缀;(2)Authority:通常采用应用程序的包名,要确保其唯一性,是ContentProvider的唯一标识符;(3)Path:指定数据或资源的路径,可以包含具体的表名、资源名以及其他标识符。图6-2中data后面的1为ID,是指数据资源的某个记录,若无ID则返回路径data中的全部记录。URI使用涉及到ContentUris和UriMatcher两个类,ContentUris类作用为操作Uri,UriMatcher类作用为在ContentProvider中注册Uri并根据Uri匹配ContentProvider中对应的数据表。表6-1ContentUris、UriMatcher类常用方法方法作用ContentUrisstaticUri

withAppendedId(UricontentUri,longid)在URI末尾追加一个idstaticlongparseId(UricontentUri)从URI中获取idstaticUri

removeId(UricontentUri)从URI中删除idUriMatchervoid

addURI(Stringauthority,Stringpath,intcode)添加要匹配的URI,匹配时添加注册码intmatch(Uriuri)匹配URI中的路径,匹配时返回

addURI()添加的注册码,不匹配返回-16.2ContentProvider共享数据ContentProvider共享数据主要涉及到ContentProvider、ContentResolver和ContentObserver三个类,ContentProvider类并不会直接与外部应用交互,而是通过ContentResolver类与ContentProvider类进行交互,不同的ContentProvider用来标识的Authority也不同,因而ContentResolver可与多个ContentProvider相互操作不同应用的数据。ContentObserver类通过ContentResolver类进行注册并指定需要观察的URI,当观察的URI与之对应的ContentProvider中的数据发生增删改变化操作时,就会触发该ContentObserver。表6-2ContentProvider、ContentResolver和ContentObserver三个类常用方法方法作用ContentProviderpublicUriinsert(Uriuri,ContentValuesvalues)外部应用向ContentProvider添加数据publicintdelete(Uriuri,Stringselection,String[]selectionArgs)外部应用删除ContentProvider中的数据publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs)外部应用更新ContentProvider中的数据publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder)外部应用获取ContentProvider中的数据publicbooleanonCreate()ContentProvider被启动时调用publicStringgetType(Uriuri)得到数据类型,即返回当前Uri所代表数据的MIME类型ContentResolverpublicUriinsert(Uriuri,ContentValuesvalues)外部应用向ContentProvider添

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论