安卓学习之七----数据存储

348 阅读4分钟

安卓学习之七----数据存储

数据持久化就是把一些瞬时数据保存到内存设备中去,保证在手机或者电脑关机后,数据也不会消失。

安卓中提供了三种简单的实现数据持久化功能:

文本储存

它是安卓最基本的数据存储方式,不对储存的内容有任何格式化处理,都是原封不动的保存,比较适合储存一些简单的文本数据和一些二进制数据。

将数据储存到文件中去

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效果如下

截屏2021-05-12 下午6.40.35.png