安卓学习之七----数据存储
数据持久化就是把一些瞬时数据保存到内存设备中去,保证在手机或者电脑关机后,数据也不会消失。
安卓中提供了三种简单的实现数据持久化功能:
文本储存
它是安卓最基本的数据存储方式,不对储存的内容有任何格式化处理,都是原封不动的保存,比较适合储存一些简单的文本数据和一些二进制数据。
将数据储存到文件中去
Context类中提供一个openFileoutput()方法将数据存储到指定文件中去
//第一个参数就是传入文件名,注意不要包含文件名的路径
//第二个参数文件操作模式,可以传两种:
//MODE_PRIVATE:如果指定相同的文件名的话,新传入的数据会把原来的数据覆盖
//MODE_APPEND:如果指定的文件以存在,就在文件里面追加内容不会覆盖,没有就会新建
val output=openFileoutout("文件名",文件操作模式)
实例代码如下:
fun sava(inputext:String){
val output=openFileoutput("data",MODE_PRIVATE)
val writer=BufferedWirter(OutputStreamWirter(output)){
wirter.use{
it.write(inputex)
}
}catch (e:IOException){
e.printStackTrace()
}
}
现在实战,新建一个项目,并修改activity.man.xml代码,这里我们就加了一个EditText,输入文本内容
<?xml version="1.0" encoding="utf-8"?>
<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/editTest"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Type something here"/>
</LinearLayout>
这个时候如果运行了程序就会有一个文本框,你输入一些内容,按下Back键,这些数据就会丢失,因为这些数据存储在内存里是瞬时数据,所以我们就要在数据回收之前把数据存储到文件当中。
接下来修改ManActivity的代码,首先我们重写onDestroy这个方法,保证在Activity销毁前一定会调用,
package com.example.activitytest
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.EditText
import android.widget.Toast
import java.io.*
import java.lang.StringBuilder
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
override fun onDestroy() {
super.onDestroy()
val editText:EditText=findViewById(R.id.editTest)
//这里吧文本框写的内容读取出来
val inputText=editText.text.toString()
//储存
sava(inputText)
}
private fun sava(outext:String){
try {
val puttex=openFileOutput("data",Context.MODE_PRIVATE)
val writer=BufferedWriter(OutputStreamWriter(puttex))
writer.use {
it.write(outext)
}
}catch (e:IOException){
e.printStackTrace()
}
}
}
这时候在运行程序,在文本框输入一些内容,按下Back键关闭程序,如何查看是否成功了,借助Device File Explorer查看,一般在data/data/com.example.(项目名).file/目录,查看,生成一个data文件。
从文件中读取数据
Context类中提供了一个openFileInput方法读取,它接受一个参数就是要多去的文件名,然后系统会自动到data/data//file/目录下加载文件,并且会返回一个FileInputStream对象,得到这个对象,然后通过流的方式读取数据
package com.example.activitytest
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.EditText
import android.widget.Toast
import java.io.*
import java.lang.StringBuilder
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val inputext=load()
if (inputext.isNotEmpty()){
val editText:EditText=findViewById(R.id.editTest)
editText.setText(inputext)
editText.setSelection(inputext.length)
Toast.makeText(this,"Restoring ",Toast.LENGTH_SHORT).show()
}
}
private fun load():String{
val content=StringBuilder()
try {
val intput=openFileInput("data")
val read=BufferedReader(InputStreamReader(intput))
read.use {
read.forEachLine {
content.append(it)
}
}
}catch (e:IOException){
e.printStackTrace()
}
return content.toString()
}
}
现在重新运行程序,例如在文本框输入Hello,World,然后按下Back键退出,在重新运行程序Hello,World依然存在
ShardPreferences储存
ShardPreferences是通过键值来储存数据,没保存一条数据,都会给相应的键值,读取数据时候通过键值读取,并且支持不同数据类型存储,如果储存的是String那么读取的也是String,如果是整形读取得也是整形。
实例如下
首席新建一个项目,然后修改activity.man.xml代码,添加一个Button控件
<?xml version="1.0" encoding="utf-8"?>
<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/savabutton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Sava Data"/>
</LinearLayout>
然后在ManActivity中为button设置一个点击事件
package com.example.activitytest2
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val savabutton:Button=findViewById(R.id.savabutton)
savabutton.setOnClickListener {
val edior=getSharedPreferences("data",Context.MODE_PRIVATE).edit()
edior.putString("name","Tom")
edior.putInt("Int",232)
//添加数据提交,完成数据库储存操作
edior.apply()
}
}
}
运行程序,点击一下Sava Data按钮保存数据,保存的数据,而且SharedPreferences文件使用XML格式对数据进行管理
从ShardPreferences读取数据
在原先的项目上修改activity.man.xml代码,添加一个按钮,通过这个按钮来从ShardPreferences文件中读取数据
<?xml version="1.0" encoding="utf-8"?>
<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/savabutton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Sava Data"/>
<Button
android:id="@+id/retoreButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Restore Data"/>
</LinearLayout>
接下来修改ManActivity的代码
package com.example.activitytest2
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import java.time.LocalDate
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val savabutton:Button=findViewById(R.id.savabutton)
savabutton.setOnClickListener {
val edior=getSharedPreferences("data",Context.MODE_PRIVATE).edit()
edior.putString("name","Tom")
edior.putInt("age",23)
//添加数据提交,完成数据库储存操作
edior.apply()
}
val restrictTo:Button=findViewById(R.id.retoreButton)
restrictTo.setOnClickListener {
//通过这个方法来获取SharedPreferences对象
val read=getSharedPreferences("data",Context.MODE_PRIVATE)
//这里调用他们getString,getInt方法去获取前面储存的值
val name=read.getString("name","")
val age=read.getInt("age",0)
//打印
Log.d("MainActivity","name is $name")
Log.d("ManinActivity","age is $age")
}
}
}
运行程序,点击按钮RESTORE DATA效果如下