持久化技术
持久化技术就是将那些在内存中的瞬时数据存储到存储设备中,使其成为持久数据
- 文件存储
- SharedPregerences存储
- 数据库存储
文件存储
数据存储到文件中
Context类中提供了openFileOutput()方法将数据存储到指定的文件里面,默认会把所有文件存储到/data/data//file/目录下。
有两个参数:
- 文件名,
- 文件的操作模式(有两种操作模式):
MODE_PRIVATE
(默认就是):表示当指定相同文件夹的时候,所写入的内容会覆盖原文件的内容MODE_APPEND
:表示存在就在之后追加,不存在就创建
注意:其实还有两种操作模式,但是过于危险,很容易引起安全漏洞,所以在Android4.后被废除MODE_WORLD_READABLE
MODE_WORLD_WRITEABLE
这两种模式表示允许其他应用程序对我们程序中的文件进行读写操作
实践出真知
可以编写一个输入框,然后把输入框里的内容保存下来
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
···>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:hint="写点什么"/>
···
</LinearLayout>
class MainActivity : AppCompatActivity() {
···
override fun onDestroy() {
super.onDestroy()
/*确保在程序销毁前会把数据保存到储存设备里面*/
val inputText=editText.text.toString()
save(inputText)
}
private fun save(inputText: String) {
try {
/*通过openFileOutput打开一个文件输出流,得到一个FileOutStream对象*/
val output=openFileOutput("data",Context.MODE_PRIVATE)
/*接着使用FileOutStream对象构建出一个BufferedWriter对象*/
val write=BufferedWriter(OutputStreamWriter(output))
/*用BufferedWriter对象把文字写到文件里面*/
write.use {
//use函数是kotlin提供的一个内置扩展函数,他确保表达式中的代码全部执行完了之后自动将外层的流关闭
//这样就不需要自己手动去关闭流了
it.write(inputText)
}
}catch (e:IOException){
//异常处理
e.printStackTrace()
}
}
}
读取文件中的数据
Context类中还提供了一个OpenFileInPut()方法读取数据只有一个参数
- 参数:要读取的文件的文件名字
- 系统会自动去默认保存位置加载文件,并且返回一个FileInputStream对象
- 得到对象之后就可以读取数据了
实践出真知
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val inputText=load()
if(inputText.isNotEmpty()){
editText.setText(inputText)
/* 不太明白为什么这里不能用editText.text=inputText*/
Log.d("MainActivity","inputText=${
inputText}")
editText.setSelection(inputText.length)//这个是把输入光标移动到文本的末尾
Toast.makeText(this,"加载数据成功",Toast.LENGTH_LONG).show()
}
}
private fun load(): String {
val content=StringBuilder()
try {
val input=openFileInput("data")
val reader=BufferedReader(InputStreamReader(input))
reader.forEachLine {
//输入流读取文件的每一行回调到lambda表达式
content.append(it)
}
}catch (e:IOException){
e.printStackTrace()
}
return content.toString()
}
···
}
SharedPreferences存储
- SharedPreferences存储使用键值对的方式来存储数据
- 也就是说,当存储一条数据的时候,需要给这个数据踢狗一个对应的键,这样就可以通过键把值取出来
- 而且存储的是什么数据类型,读出来的就是什么数据类型
将数据存储到SharedPreferences中
Context类中的getSharedPreferences()方法
两个参数
- 第一个用于指定SharedPreferences文件的名称,不存在就创建,SharedPreferences的文件都是存储在/data/data//shared_prefs/目录下
- 第二个用于指定操作模式
MODE_PRIVATE
他和直接传入0的效果一样,表示当前的应用程序才可以对这个SharedPreferences文件读写- 废弃的操作模式
MODE_WORLD_READABLE
在Android4.2被废弃MODE_WORLD_WRITEABLE
在Android6.0被废弃
Activity类中的getPreferences()方法
- 一个参数 :操作模式参数
- 因为使用这个方法会自动将当前的Activity的类名作为SharedReferences的文件名
- 得到SharedPreferences对象后就可以向SharedPreferences文件中存储数据了
- 调用SharedPreferences对象的edit()方法获取一个SharedPreferences.Editor对象
- 向SharedPreferences.Editor对象中添加数据,比如添加Boolean数据就用putBollean()等等
实践出真知
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
···>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/saveButton"
android:text="保存数据"/>
···
</LinearLayout>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
saveButton.setOnClickListener {
var editor= getSharedPreferences("data", Context.MODE_PRIVATE).edit()
editor.putString("name","波")
editor.putInt("age",21)
editor.putBoolean("married",false)
editor.apply()//用apply()完成提交
}
···
}
}
从SharedPreference中读取数据
SharedPreferences对象中提供了一系列的get方法用来读取数据,每种都对应getSharedPreferences().edit中的put()方法
实践出真知
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
···>
···
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id=