1. 文件存储
文件存储是Android中最基本的一种数据存储方式,它不对存储的内容进行任何的格式化处理,所有数据都是原封不到能搞到保存到文件当中的,因而它比较是用于存储一些简单的文本数据或者二进制数据。如果想使用文件存储的方式来保存一些较为复杂的文本数据,就需要定义一套自己的格式规范,这样可以方便之后将数据从文本中重写解析出来。
Content类中提供了一个openFileOutput()方法,可以用于江数据保存到指定的文件中。这个方法接收两个参数,第一个参数是文件名,在文件创建是时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<packagename>/files/目录下的。第二个参数是文件的操作模式,主要有两种模式可选。MODE_PRIVATE和MODE_APPEND。其中MODE_PRIVATE是默认的操作模式,表示当指点同样文件名的时候,所写入的内容将会覆盖原文件中的内容。而MODE_APPEND则表示如果该文件已存在,就往文件里追加内容,不存在就创建新文件,其实文件的操作模式本来还有另外两种,MODE_WORLD_READABLE和MODE_WORLD_WEITEABLE.这两种模式表示允许其他的应用程序对我没的程序中的文件进行读写操作,不过由于这两种模式过于危险,很容易引起应用的安全性漏洞。所以早在android4.2版本中已废弃。
1.文件存储
文件存储的核心技术就是Context类中提供的openFileInput()和openFileOuput()方法,之后就利用java的各种流来进行读写操作。
2. SharedPreferences存储
不同于文件存储方式,SharedPreferences是使用键值对的方式来存储数据的。也就是说,当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把对应的值取出来。而且SharedPreferences还支持多种不同的数据类型存储,如果存储的数据类型是整形,那么读取出来的数据也是整形的,以此类推。
这样应该就明显感觉到,使用SharedPreferences来进行数据持久换要比使用文件存储方便很多。
获取Sharedpreferences对象共三种方式
(1) Context类中的getSharedPrefernces()方法:
此方法接收两个参数,第一个参数用于指定SharedPrefernces文件的名称,如果指定的文件不存在这会创建一个,SharedPrefernces文件都是存放在/data/data/<package name>/shared_prefs/目录下的。第二个参数用于指定操作模式,目前只有MODE_PRIVATE这一种模式可选,它是默认的操作模式,和直接传入0先哦过是相同的,表示只有当前的应用程序才可以对这个SharedPrefernces文件进行读写,其他操作模式均已被废除。MODE_WORLD_READABLE和MODE_WOELD_WRITEABLE这两种模式在安卓4.2版本中已被废弃,MODE_MULTI_PROCESS模式是在Android6.0版本中已被废弃。
(2) Activity类中发getPrefernces()方法
这个方法和Context中的getSharedPrefernces()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences的文件名。
(3) PrefernceManager类中的getDefaultSharedPrefernces()方法:
这是一个静态方式,它只接收一个Context参数,并自动使用当前的应用程序的包名作为前缀来命名SharedPreferences文件,得到了SharedPrefernces对象之后,就可以开始向SharedPreferences文件中存储数据了,主要分为三部实现
(1) 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
(2) 向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用putString()方法,以此类推。
(3) 调用apply()方法将添加的数据提交,从而完成数据存储操作。
3. 3.SQLite数据库存储
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源少,通常只需要几百KB的的内存就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,所以只要以前使用过其他关系型数据库,就上手很快SQLite,而SQLite又比一般的数据库简单得多,它甚至不用设置用户名和密码就可以使用,Android正是把这个功能极为强大的数据库嵌入到了系统当中,使得本地持久化的功能有了一次质的飞跃。
文件存储和SharedPreferences存储毕竟只适用于保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据库的时候,以上两种很难去实现,这时需要用SQLite关系型数据库去存储。
1. 创建数据库
Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。
SQLiteOpenHelper是一个抽象类,这意味着如果我们想使用她的话,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper中的两个抽象方法,分别是onCreate()和onUpgrade(),必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。
SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWriteableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库)。并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象将以只能读的方式开大数据看,而getWritableDatabase()方法则将出现异常。
SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可。这个构造方法中接收4个参数,第一个参数是Context,必须要有它才能对数据库进行操作。第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数也许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入bull,第四个参数表示当前数据库版本号,可用于对数据进行升级操作。构建出SQLiteOpenHelper的实例之后,在调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了,数据库文件会存放在/data/data/<package name>/databases/目录下。此时重写onCreate()方法会得到执行,所以通常会在这里去处理一些创建表的逻辑。
2. 升级数据库
Public void onUpgrade(SQLiteDatabase db,int oldVersion,intnewVersion){
}
onUpgrade()方式用于对数据库进行升级的,它在整个数据库管理工作中起着非常重要的作用。
建表语句:
create table category(
id integerprimary key autoincrement,
category_nametext,
category_codeinteger
)