标签:
在上课学习时也学了,虽然大概知道如何用,项目中都在用,但总感觉“不系统”,因此看看大牛的博客,根据自己理解与之前所学,在总结一下,心里有个底。
第一,存储位置:内部存储 ,外部存储 和 apk内部资源
内部存储(internal storage :由android系统分配给app的空间)
外部存储(external storage:开发中通常指sd卡)
apk内部资源(这是我自己的归类,指的是开发时工程目录下的文件,主要为Assets目录,这样归类只是便于记忆)
以下解释来自:http://blog.csdn.net/androidwifi/article/details/17725989 1.内部存储: 内部存储不是内存。内部存储位于系统中很特殊的一个位置,如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建 的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。当一个应用卸载之后,内部存储中的这些文件也被删除。从技术上来 讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么 即使知道包名其他应用也无法访问。 内部存储空间十分有限,因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无 法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一般用Context来获取和操作。 2.外部存储:最容易混淆的是外部存储,如果说pc上也要区分出外部存储和内部存储的话,那么自带的硬盘算是内部存储,U盘或者移动硬盘算是外部存储,因此我们很容 易带着这样的理解去看待安卓手机,认为机身固有存储是内部存储,而扩展的T卡是外部存储。比如我们任务16GB版本的Nexus 4有16G的内部存储,普通消费者可以这样理解,但 是安卓的编程中不能,这16GB仍然是外部存储。
第二,内部存储路径:/data/data/<package>/ 操作方法或形式有:
1. SharedPreferences :/data/data/<package>/shared_pref/ 读:Context.getSharedPreferences(String name,int mode) 写:通过Edit
2. SQLite: /data/data/<package>/<dbname> 通过ContentProvider操作
3. IO流: /data/data/<package>/files/
如:FileOutputStream fos = context.openFileOutput(file,Context_MODE_WORLD_WRITEABLE);
4. Context: /data/data/<package>/files/
如:获取目录 getFilesDir() String[] files = Context.fileList();
(小结:其实以上四种方法都是通过Context操作。)
第三,外部存储路径:/mnt/sdcard/
外部存储虽然概念上有点复杂,但也很好区分,你把手机连接电脑,能被电脑识别的部分就一定是外部存储。
1. 公共文件Public files: /mnt/sdcard/ [当应用被卸载之后,其卸载前创建的文件仍然保留. ]
getExternalStoragePublicDirectory()
Environment.getExternalStorageDirectory() [如果api 版本低于8]
2. 私有文件Private files: /mnt/sdcard/Android/data/ [卸载之后,这些文件也会被删除]
Context.getExternalFilesDir()
Environment.getExternalStorageDirectory() [api 版本低于8,而是用它获得根路径之后,自己再想办法操作/Android/data//下的文件]
第四,apk内部资源: /apk安装路径的apk中:
InputStream is = getAssets().open("xxx.xx");
InputStream is = resources.openRawResource.(R.raw.xxx);
原文地址:http://blog.csdn.net/casun_li/article/details/47318797
参考文档:
1.http://blog.csdn.net/androidwifi/article/details/17725989
2.http://blog.csdn.net/heng615975867/article/details/9019633
-------------------------------------------------------------------附学习笔记------------------------------------------------------------------------------------------
写入文件
通过Context.openFileOutput(Stringname,int mode)可以获取一个文件输入流
name为文件名,mode为文件模式,有4种模式
输出流指向路径为:/data/data/包名/files/
文件模式在Context中有定义常量
MODE_PRIVATE私有
MODE_WORLD_READABLE其他程序可读(不可写)
MODE_WORLD_WRITEABLE其他程序可写(不可读)
模式可以组合使用,例如:MODE_WORLD_READABLE+ MODE_WORLD_WRITEABLE
MODE_APPEND追加
读取文件
通过Context.openFileInput(Stringname)可以获取一个文件输入流
该输入流可以读取/data/data/包名/files/路径下的文件
获取当前程序Files文件路径
ContextWrapper.getFilesDir()
写入文件到SD卡
需要在清单文件中注册权限
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.1版本以下的SDCard位置和2.2之后版本不同
可以通过Environment.getExternalStorageDirectory()获取当前SDCard位置,兼容所有版本
获取SDCard状态
通过Environment.getExternalStorageState()方法获取SDCard当前状态
常量Environment.MEDIA_MOUNTED为已安装
Pull简介
常见的XML解析方式有三种,DOM、SAX、Pull,Android系统中推荐使用Pull
Pull解析器是一个开源的Java项目,Android系统内部解析XML文件均为此种方式,也可用于JavaEE项目
AndroidSDK中已经集成了Pull解析器,无需添加任何jar文件
Pull解析器运行方式与SAX类似,提供各种事件的判断
官方网站:http://xmlpull.org/
使用Pull解析器解析XML文件
Xml.newPullParser()获得解析器
parser.setInput(in,"UTF-8")设置输入流以及编码
parser.next()获取下一个解析事件,得到一个事件代码
XmlPullParser中定义了常量来标识各种解析事件
START_DOCUMENT、END_DOCUMENT、START_TAG、END_TAG、TEXT
使用XmlSerializer写出XML
使用以下方法生成XML,和XML文档顺序类似
startDocument
startTag
attribute
text
endTag
endDocument
在程序中保存一些配置参数的时候我们经常使用SharedPreferences
Context.getSharedPreferences(Stringname,int mode)
该方法可以在/data/data/<package>/shared_pref/目录下创建一个以name命名的xml文件,mode文件为模式
存储偏好
调用edit()方法可以获取一个Editor对象,对数据进行存储,存储之后需要调用commit()保存到文件
读取偏好
获得SharedPreferences之后调用getString()、getInt()等方法获取其中设置的值
在Activity中获取SharedPreferences
在Activity中可以调用getPreferences(intmode)方法获得一个SharedPreferences,文件名和Activity名一致
Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型
例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数。
除非是主键被定义为Integer,这时只能存储64位整数
创建数据库的表时可以不指定数据类型,例如:
CREATETABLE person(id INTEGER PRIMARY KEY, name VARCHAR(20))
CREATETABLE person(id INTEGER PRIMARY KEY, name)
SQLite支持大部分标准SQL语句,增删改查语句都是通用的,分页查询语句和MySQL相同
SELECT* FROM person LIMIT 20 OFFSET 10
SELECT* FROM person LIMIT 10,20
定义类继承SQLiteOpenHelper
声明构造函数,4个参数
重写onCreate()方法
重写upGrade()方法
注意:SQLite数据库中列一旦创建不能修改,如果一定要修改,需要重新创建表,拷贝数据
和JDBC访问数据库不同,操作SQLite数据库无需加载驱动,不用获取连接,直接可以使用
获取SQLiteDatabase对象之后通过该对象直接可以执行SQL语句
SQLiteDatabase.execSQL()
SQLiteDatabase.rawQuery()
getReadableDatabase()和getWritableDatabase()的区别
查看源代码后我们发现getReadableDatabase()在通常情况下返回的就是getWritableDatabase()拿到的数据库
只有在抛出异常的时候才会以只读方式打开
数据库对象缓存
getWritableDatabase()方法最后会使用一个成员变量记住这个数据库对象,下次打开时判断是否重用
SQLiteDatabase封装了insert()、delete()、update()、query()四个方法也可以对数据库进行操作
这些方法封装了部分SQL语句,通过参数进行拼接
在使用SQLite数据库时可以用SQLiteDatabase类中定义的相关方法控制事务
beginTransaction()开启事务
setTransactionSuccessful()设置事务成功标记
endTransaction()结束事务
endTransaction()需要放在finally中执行,否则事务只有到超时的时候才自动结束,会降低数据库并发效率
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/casun_li/article/details/47318797