一、文件存储
1.将数据存储到文件中
Android中的文件存储机制是一种基本的存储数据的方式,其不对数据进行任何格式化的处理,所以这种方式适用于存储一些简单的文本数据或者二进制数据。
Context中提供一个openFileOutput()的方法,将数据存储在指定的文件下;该方法实现传入两个数据参数,
其中一个是参数是文件名,注意这里的文件名不可以包含路径,它的默认讯储存位置是、data/datta/<package>files/下面 的。
第二个是文件的操作模式,其数值有两种,默认的是MODE_PRIVATE表示当指定的文件名相同时,写入的数据会覆盖源文件中的内容;另一个是MODE_APPEND表示的是如果文件夹下存在相同的文件名,则是往文件里追加内容;其实本来是的操作,模式有四个,其他两个MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE,由于这两个模式允许其他的程序操作文件,所以在以前的版本就取消了。
2.从文件中读取数据
类似于将数据存储到文件中,Context 类中还提供了一个openFileInput()方法,用于从文件中读取数据。这个方法要比openFile0utput()简单- -些,它只接收-一个参数, 即要读取的文件名,然后系统会自动到/data/data/files/目录 下去加载这个文件,并返回一个FileInputStream对象,得到了这个对象之后再通过Java流的方式就可以将数据读取出来了。以下是一段简单的代码示例,展示了如何从文件中读取文本数据:
public String load() {
FileInputStream in = null;
BufferedReader reader = null;
St ringBuilder content = new St ringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader (new InputSt reamReader(in));
String line = "";
while ((line = reader. readLine()) != null) {
content . append(line);
} catch (IOException e) {
e, printStackTrace();
} finally {
if (reader != null} {
try {
reader . close();
} catch (IOException e) {
e. printStackTrace();
}
return content. toString();
在这段代码中,首先通过openFileInput()方法获取到了一个FileInputStream对象,然后借助它又构建出了一个InputStreamReader对象,接着再使用InputStreamReader构建出一个BufferedReader对象,这样我就可以通过BufferedReader 进行- -行行地读取,把文件中所有的文本内容全部读取出来,并存放在一一个StringBuilder对象中,最后将读取到的内容返回就可以了。
二、SharedPreferences存储
1.将数据存储到SharePreferences中
首先需要拿到SharedPreferences对象
主要有三种方法:
(1)Context类通过getSharedPreferences()方法
第一个参数指定了文件名,如果不存在则会创建一个SharedPreferences所有的文件都是存放在 /data/data/包名/shared_prefs/ 目录下,第二个参数指定操作模式,MODE_PRIVATE和0效果一样,代表只允许当前程序进行读写
(2)Activity类中getPreferences()方法
只接收一个操作模式作为参数,因为使用这个方法会自动将当前类名作为SharedPreferences文件名
(3)PreferenceManager类中的getDefaultSharedPreferences()方法
这是一个静态方法,接收一个Context参数,并自动使用当前包名作为前缀来命名SharedPreferences。
保存数据主要分三步:
(1)调用SharedPreferences对象的edit()方法来得到SharedPreferences.Editor对象
(2)向SharedPreferences.Editor添加数据
字符串类型用putString() 、布尔类型用putBoolean(),以此类推
(3)调用apply()提交,完成保存操作
2.从SharePreferences中读取数据
SharedPreferences读取数据更为简单
SharedPreferences提供了一系列get方法,每种都对应了SharedPreferences.Editor中的一种put方法
读取字符串可以用getString()
读取布尔型数据可以用getBoolean()
接收2个参数:
第一个参数是键值,与保存传入的键值对应
第二个参数是默认值,当传入的键值读取不到数据的时候,就用默认值
三、SQLite存储
1.创建数据库
Android 提供了SQLiteOpenHelper帮助我们对数据库进行创建和升级,它是一个抽象类,我们需要创建一个类去继承它,同时重写OnCreate和onUpgrade方法,用于创建和升级数据库。
SQLiteOpenHelper有两个重要的实例方法:
都是用于创建一个数据库 或者 打开一个现有的数据库并返回一个可对数据库进行读写操作的对象。
区别在于:
getReadableDatabase()在数据库不可写入的时候,如磁盘空间已满,则返回的对象将以只读的方式去打开数据库
而getWritableDatabase()将会出现异常(我们常用后者,即getWritableDatabase)。
SQLiteOpenHelper有两个构造方法可供重写,一般使用参数少一点的那个构造方法,有4个参数:
第一个参数是 Context
第二个参数是 数据库名,创建数据库的时候将使用这个名字命名
第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般传入null
第四个参数是 数据库版本号,可用于对数据库进行升级操作。
构建出SQLiteOpenHelper的实例后,再调用它的getReadableDatabase()或getWritableDatabase()就完成了创建数据库,且重写的onCreate()方法也会被一起执行。
2.升级数据库
主要利用onUpgrade()方法进行数据库升级。
3.添加数据库
在布局文件中加入一个按钮用于添加数据。
<Button
android:id="@+id/add_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="添加数据" />
接着在MainActivity里加入点击事件
1 首先拿到SQLiteDatabase 对象。
2 然后使用ContentValues 提供的put方法来组装每一条数据(组装多条数据的时候,记得每次使用完毕后使用clear()清理values,然后继续使用)。
3 最后调用SQLiteDatabase 的insert()方法插入到表中。
第一个参数是要插入的表名。
第二个参数用于在未指定添加数据的情况下可以给某些可以为空的列自动赋值NULL,一般我们用不到这个功能,直接传入null即可。
第三个参数是我们组装好的ContentValues。
4.更新数据库
在布局中加入一个按钮用于更新数据
然后在MainActivity里加入更新数据的点击事件。
使用SQLiteDatabase 的update()方法来用于更新操作。
第一个参数指定表名。
第二个参数是我们组装好的ContentValues。
第三个参数是占位符,对应SQL的where语句,表示所有name等于?的行,而?是一个占位符,由第四个参数去指定
第四个参数即用数组来指定限制内容,即name = "The Da Vinci Code"的所有数据。
5.删除数据库
在布局中加入一个按钮用于更新数据。
然后在MainActivity里加入更新数据的点击事件。
直接调用SQLiteDatabase 的delete()方法
第一个参数表名
第二个和第三个参数为约束条件
这里指明想要删除pages>500的所有数据
6.查询数据
首先在布局里加入一个按钮用来查询数据。
接着在MainActivity里加入查询点击事件。
1 首先使用SQLiteDatabase 的query()方法,第一个参数指明去查询Book表,后面的参数全设置为null,则代表查询这个表的所有数据。
2 查询完以后后得到一个Cursor对象,接着我们调用它的moveToFirst()将数据指针移动到第一行,然后一行一行去查询数据,而cursor.getColumnIndex()是去拿指定列的索引,然后拿到对应的值。
完成后,记得关闭Cursor。