一,持久化技术简介
也就是数据存储在内存中,会丢失。需要存储在存储设备中。而持久化技术,就是提供了手段,让数据再试瞬时状态和持久状态之间转换。
安卓开发提供了三种数据的持久化技术:
二,文件存储
文件存储不对存储内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中,因而它比较适合用于存储一些简单地文本数据。
Context 类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。
这个方法接收两个参数,
第一个参数是文件名,在文件创建的时候使用的就是这个名称,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data/<packagename/files/目录下的。
第二个参数是文件的操作模式,主要有两种模式可选,MODE PRIVATE和MODE APPEND。其中MODE PRIVATE是默认的操作模式,表示当指定同样文件名的时候所写入的内容将会覆盖原文件中的内容,而MODE APPEND 则表示如果该文件已存在,就往文件里面追加内容,不存在就创建新文件。
下面的代码展示了如何将一段文本内容存储道文件中:
public void save(String inputText) {
FileOutputStream out=null;
BufferedWriter writer=null;
try {
out=openFileOutput("data", Context.MODE_PRIVATE);
writer=new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
}catch(IOException e){
e.printStackTrace();
}finally {
try {
if(writer!=null){
writer.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
主要就是这三行代码:
out=openFileOutput("data", Context.MODE_PRIVATE);
writer=new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
构建出writer对象,就可以writer.write(inputText);写入文件。
1,新建FilePersistenceTest项目
修改其中的activity_main.xml文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<EditText
android:id="@+id/edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#00ff00"
android:hint="请输入内容"/>
</LinearLayout>
2,修改MainActivity文件
public class MainActivity extends AppCompatActivity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText) findViewById(R.id.edit);
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText =edit.getText().toString();
save(inputText);
}
public void save(String inputText) {
FileOutputStream out=null;
BufferedWriter writer=null;
try {
//文件名字是:data,文件书写类型是覆盖
out=openFileOutput("data", Context.MODE_PRIVATE);
//将文件写入的参数传入,构建出writer对象
writer=new BufferedWriter(new OutputStreamWriter(out));
//调用writerd的write方法,写入文件。
writer.write(inputText);
}catch(IOException e){
e.printStackTrace();
}finally {
try {
if(writer!=null){
writer.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
在该活动被销毁的时候,就会调用save方法,把文本写入文件中。
3,查看文件内容
书中的查看方法已经被弃用了,新的查看方法是:在Android Studio的顶部栏,View >> Tool Windows >> Device File Explorer;然后再在文件夹data/data中查看即可。
这样就可以在文件中看到。
4,从文件中读取数据
类似于将数据存储到文件中,Context 类中还提供了一个 openFileInput()方法,用于从文件中读取数据。这个方法要比 openFileOutput()简单一些,它只接收一个参数,即要读取的文件名,然后系统会自动到/data/data//files/目录下去加载这个文件,并返回一个FileInputstream 对象,得到了这个对象之后再通过Java流的方式就可以将数据读取出来了。
示例如下:
public String load(){
FileInputStream in=null;
BufferedReader reader=null;
StringBuilder content=new StringBuilder();
try {
//配置读取参数
in = openFileInput("data");
//使用读取参数构建reader
reader=new BufferedReader(new InputStreamReader(in));
String line="";
//一行行读取内容,并且放置到content中
while((line=reader.readLine())!=null){
content.append(line);
}
}catch(IOException e){
e.printStackTrace();
}finally {
try {
if(reader!=null){
reader.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
return content.toString();
}
于是仅需要修改上文的MainActivity中的代码即可:
public class MainActivity extends AppCompatActivity {
private EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText) findViewById(R.id.edit);
String inputText=load();
if(!TextUtils.isEmpty(inputText)){
//读取到内容了就更新
edit.setText(inputText);
//焦点放置到最后位置
edit.setSelection(inputText.length());
Toast.makeText(this, "读取到内容啦", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText =edit.getText().toString();
save(inputText);
}
public void save(String inputText) {
FileOutputStream out=null;
BufferedWriter writer=null;
try {
//文件夹名字是:data,文件书写类型是覆盖
out=openFileOutput("data", Context.MODE_PRIVATE);
//将文件写入的参数传入,构建出writer对象
writer=new BufferedWriter(new OutputStreamWriter(out));
//调用writerd的write方法,写入文件。
writer.write(inputText);
}catch(IOException e){
e.printStackTrace();
}finally {
try {
if(writer!=null){
writer.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
public String load(){
FileInputStream in=null;
BufferedReader reader=null;
StringBuilder content=new StringBuilder();
try {
//配置读取参数
in = openFileInput("data");
//使用读取参数构建reader
reader=new BufferedReader(new InputStreamReader(in));
String line="";
//一行行读取内容,并且放置到content中
while((line=reader.readLine())!=null){
content.append(line);
}
}catch(IOException e){
e.printStackTrace();
}finally {
try {
if(reader!=null){
reader.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
return content.toString();
}
}
实现的效果:
三,SharedPreferences存储
这种存储方案有以下几个特点:
1,以键值对进行存储
2,支持多种数据结构进行存储,存的时候是什么数据结构,取出来的时候就是什么数据结构。
将数据存储到SharedPreferences的第一步是需要获取SharedPreferences对象。有以下三种方法:
1,Context类中的getSharedPreferences()方法
此方法接收两个参数,第一个参数用于指定 SharedPreferences 文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences 文件都是存放在/data/data//shared prefs/目录下的。
第二个参数用于指定操作模式,目前只有 MODE PRIVATE这一种模式可选,它是默认的操作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences 文件进行读写。
2,Activity类中的getPreferences
这个方法和Context中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为SharedPreferences 的文件名。
3,PreferenceManager类中的 getDefaultSharedPreferences()方法
这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences 文件。
4,向SharedPreferences文件中存储数据
(1)调用SharedPreferences 对象的edit)方法来获取一个SharedPreferences.Editor对象。
(2)向 sharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用putBoolean()方法,添加一个字符串则使用 putstring()方法,以此类推。
(3)调用 apply()方法将添加的数据提交,从而完成数据存储操作。
5,第一步:新建项目,修改Main_activity.html
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"/>
</LinearLayout>
6,第二步,修改activity文件
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button saveData =(Button) findViewById(R.id.save_data);
saveData.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",24);
editor.putBoolean("married",false);
editor.apply();
}
});
}
}
点击按钮后,立马就保存了,需要在Android Studio的顶部栏,View >> Tool Windows >> Device File Explorer;然后再在文件夹data/data中查看即可。
7,从SharedPreferences中读取数据
修改xml中代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"/>
<Button
android:id="@+id/restore_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="获取数据"/>
</LinearLayout>
修改活动中的代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button saveData =(Button) findViewById(R.id.save_data);
Button restoreData =(Button) findViewById(R.id.restore_data);
saveData.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",24);
editor.putBoolean("married",false);
editor.apply();
}
});
restoreData.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
SharedPreferences pref=getSharedPreferences("data",MODE_PRIVATE);
String name=pref.getString("name","");
Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
}
});
}
}
四,SQLite数据库
android有提供数据库。现在已经有开源的库LitePal来实现数据的增删改查。
它采用了对象关系映射(ORM)的模式,这是让我们非常好的理解的数据库,一个实体类对应我们数据库中的一个表。该库中还封装了许多的方法,就算对SQL语句的了解很少,也能很好的建立起数据库,以及各种增删改查的操作。
这一节,因为照着书上的方式,会报错。跳过先