Android中的持久化方式主要有三种:
- 文件存储
- SharedPreference存储
- 数据库存储
一、文件存储
文件存储是将数据原封不动地保存到文件中,适用于一些简单的额文本数据或者二进制数据。
存数据
/*
* 该方法可以利用指定context,将数据保存到指定文件中
* */
public static void saveDataToFile(Context context,String fileName, String data){
FileOutputStream outputStream = null;
BufferedWriter writer = null;
try {
outputStream = context.openFileOutput(fileName,Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(outputStream));
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
存数据主要用到了Context的openFileOutput(String fileName,int mode)方法,该方法可以在底层产生一个FileOutputStream对象,然后用BufferedWriter等包装类对其进行包装后,就可以对指定文件进行写数据了。其中的mode是 文件操作模式,有MODE_PRIVATE和MODE_APPEND两种模式,前者是默认的,后者是当文件存在的时候,数据以追加的方式写入文件。
当在一个Context调用该方法时,会在 data/data/工程包名/files 目录下发现保存刚刚数据的文件。
从文件中读取数据
public static String readDataFromFile(Context context,String fileName){
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = context.openFileInput(fileName);
reader = new BufferedReader(new InputStreamReader(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();
}
读数据也是去data/data/工程包名/files 目录下寻找名为fileName的文件读取数据。
二、SharedPreference存储
SharedPreferences是用 键值对 的方式存储数据的,并且保存的当保存一条数据的时候,需要给这条数据提供一个对应的key,然后在读取该数据的时候通过该key读取。
1、存数据到SharedPreferences中
首先,得获取 SharedPreferences对象,获取该对象有3种方式:
- Context类的 getSharedPreferences(String fileName,int mode) 方法
- Activity类的 getPreferences() 方法 (会以当前app的包名命名文件)
- PreferenceManager类的 getDefaultSharedPreferences() 方法 (静态方法)
然后,利用它的edit()方法产生Editor对象,利用 editor对象 添加数据,最后提交
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",25);
editor.putBoolean("married",false);
editor.apply();
2、利用SharedPreferences从文件中读取数据
读取数据只需用到SharedPreferences对象
SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE);
String name = pref.getString("name","");
int age = pref.getInt("age",0);
boolean married = pref.getBoolean("married",false);
三、SQLite存储
SQLite是Android中内置的一款轻量级的关系型数据库,它的运算速度非常快,占用资源少。Android中提供了一个SQLiteOpenHelper帮助抽象类,借助这个类可以对数据库进行创建和升级。利用SQLiteOpenHelper中的getReadableDatabase()和getWritableDatabase()方法可以获取对数据库进行读和写的对象。
1、利用原生sqlite操作数据库
操作步骤:
- 创建一个类MyDatabaseHelper继承SQLiteOpenHelper
- 当想访问或者创建某个数据库的时候,new MyDatabaseHelper()创建一个Helper,让Helper与某个数据库相关联
-
SQLiteDatabase db= helper.getWritableDatabase();或者SQLiteDatabase db= helper.getReadableDatabase();可以获取数据库对象
- 利用db.execSQL()或者db.rawQuery(),可以执行sql语句
2、利用LitePal框架操作数据库
LitePal框架对原生sqlite进行了封装,它是一个ORM框架,使得对数据库的操作更加方便,可直接使用java bean
操作步骤:
- 在app/build.gradle文件中的dependencies中添加依赖 implementation 'org.litepal.android:core:1.3.2'
- 在main/assets目录下创建litepal.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<litepal>
//数据库名
<dbname value="Books"></dbname>
//数据库版本号
<version value="1"></version>
//待映射的Java对象
<list>
<mapping class="com.example.yy.demos.Litepal.Book"></mapping>
</list>
</litepal>
- 创建Java Bean类
public class Book extends DataSupport {
private int id;
private String author;
private double price;
private int pages;
private String name;
/************getters and setters***********/
/....../
}
- 在AndroidManifest.xml文件的<application>标签下添加item:
android:name="org.litepal.LitePalApplication"
- 然后就可以使用litepal操作数据库了
- 获取/创建数据库:
SQLiteDatabase db = Connector.getDatabase();
- 插入数据
Book book = new Book();
book.setName("The Da Vinci Code");
book.setAuthor("zz");
book.setPages(454);
book.setPrice(16.23);
book.save();//插入
- 修改数据
book.setPrice(10.66);
book.save();
- 删除数据
DataSupport.delete(Book.class,3);//删除id为3的Book记录
DataSupport.deleteAll(Book.class,"price < ?","17");//删除price<17的所有Book记录
- 查询数据
//select * from book
List<Book> books = DataSupport.findAll(Book.class);
//查询第一条记录
Book firstBook = DataSupport.findFirst(Book.class);
//查询最后一条记录
Book lastBook = DataSupport.findLast(Book.class);
//查询name和author两列
List<Book> bookList = DataSupport.select("name","author").find(Book.class);
//条件查询,pages>400的Book
List<Book> list = DataSupport.where("pages > ?","400").find(Book.class);