<本文学习郭神《第三行代码》总结>
数据存储一共分为五种方式: 1、文件存储 2、SharedPreferences 3、SQLite数据库存储 4、ContentProvider 5、网络存储
文件存储不对存储的内容进行任何格式化处理,所有数据都是原封不动的保存到文件当中,适合存储一些简单的文本数据或二进制数据。如果需要保存一些复杂的数据,就需要自己定义格式,比如保存json数据、加密数据等。 文件存储默认存储路径为:data/data//files/目录下。 文件操作模式分为两种: MODE_PRIVATE:默认方式,当指定相同文件名时,所写入内容会覆盖原文件中的内容。 MODE_APPEND:如果文件已经存在,则往文件里追加内容,不存在就重新创建。
1.1、存储文件Context类中提供了一个方法openFileOutput()方法,用于将数据存储到指定的文件中。接收两个参数:第一个是文件名,在文件创建时使用;第二个是文件操作模式。 openFileOutput()返回一个FileOutputStream对象,得到这个对象之后就可以使用Java流的方式将数据写入文件中。
val input = "" try { val output = openFileOutput("data", Context.MODE_PRIVATE) val write = BufferedWriter(OutputStreamWriter(output)) write.use { it.write(input) } } catch (e: Exception){ e.printStackTrace() }注意:在try…catch…函数中,这里没有使用finally,也没有关闭流,会不会出现一些问题,这里不用担心,在Kotlin提供了一个内置函数use,它会保证在Lambda表达式中的代码全部执行完之后自动将外层流关闭。
- 1.2、读取文件
和存储文件类似,Context类中提供了一个方法openFileInput()方法,用于从指定文件读取数据。接收一个参数:第一个是文件名,即读取的文件名。 openFileInput()会返回FileInputStream对象,得到这个对象之后就可以使用流的方式将数据读取出来。
val content = StringBuilder() try { val input = openFileInput("data") val reader = BufferedReader(InputStreamReader(input)) reader.use { reader.forEachLine { content.append(it) } } } catch (e: Exception){ e.printStackTrace() }注意:这里读取文件中数据时,使用了forEachLine函数,这也是Kotlin提供的内置函数,它会将读到的每行内容都回调到Lambda表达式中。
SharedPreferences是使用键值对的方式存储数据。当保存一条数据时,需要给这条数据提供一个对应的键。SharedPreferences支持多种不同数据类型存储。
2.1、SharedPreferences数据存储首先要获取SharedPreferences对象,主要提供了两种方法获取SharedPreferences对象。 1、Context类中使用getSharedPreferences()方法 接收两个参数:(1)指定SharedPreferences文件名称,如果指定名称不存在则会创建,SharedPreferences存放默认路径data/data//shared_prefs/目录;(2)指定操作模式,默认为MODE_PRIVATE,表示当前应用才可对这个SharedPreferences进行读写。 2、Activity类中使用getPreferences()方法 只接收一个参数:操作模式,因为在Activity中使用,将会自动将该Activity类名作为SharedPreferences的文件名。 3、存储数据 首先得到SharedPreferences对象。 调用SharedPreferences对象的edit方法获取SharedPreferences.Editor对象。 向SharedPreferences.Editor对象中添加数据。 调用apply方法将添加数据提交。
val editor = getSharedPreferences("data", Context.MODE_PRIVATE).edit() editor.putBoolean("boolean", false) editor.putInt("int", 0) editor.putString("string", "string") editor.apply() val editor = getPreferences(Context.MODE_PRIVATE).edit() editor.putBoolean("boolean", false) editor.putInt("int", 0) editor.putString("string", "string") editor.apply() 2.2、SharedPreferences数据读取SharedPreferences对象提供了很多get方法,用于读取数据,每种get方法都对用了SharedPreferences.Editor中的一种put方法。get方法都接收两个参数:(1)键,存储数据时使用的键;(2)默认值,当找不到该键时,返回的默认值
val prefs = getSharedPreferences("data", Context.MODE_PRIVATE) val bool = prefs.getBoolean("boolean", false) val intTxt = prefs.getInt("int", 0) val stringTxt = prefs.getString("string", "string") val prefs = getPreferences(Context.MODE_PRIVATE) val bool = prefs.getBoolean("boolean", false) val intTxt = prefs.getInt("int", 0) val stringTxt = prefs.getString("string", "string")