• Android——数据存储(一)(二十一)


    1. 数据存储

    1.1 知识点

    (1)掌握Android数据存储的分类;

    (2)可以使用SharedPreferences存储数据。

    1.2 具体内容

    对于我们数据的存储而言,Android一共提供了5个数据存储的方式:SharedPreferences存储、文件存储方式、Sqlite存储、Content Provider存储、网络存储。

    在Android之中操作,都需要使用Activity程序进行支持,本次课程我们只关注操作方法,所有不做过多的页面展示。

    1. <LinearLayout
    2. xmlns:android="http://schemas.android.com/apk/res/android"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. android:layout_width="match_parent"
    5. android:layout_height="match_parent"
    6. android:orientation="vertical">
    7. <LinearLayout
    8. android:layout_width="match_parent"
    9. android:layout_height="wrap_content"
    10. android:orientation="horizontal"
    11. >
    12. <TextView
    13. android:layout_width="wrap_content"
    14. android:layout_height="wrap_content"
    15. android:text="请输入键:"
    16. />
    17. <EditText
    18. android:id="@+id/usernameKey"
    19. android:layout_width="200px"
    20. android:layout_height="wrap_content" />
    21. </LinearLayout>
    22. <LinearLayout
    23. android:layout_width="match_parent"
    24. android:layout_height="wrap_content"
    25. android:orientation="horizontal"
    26. >
    27. <TextView
    28. android:layout_width="wrap_content"
    29. android:layout_height="wrap_content"
    30. android:text="请输入值:"
    31. />
    32. <EditText
    33. android:id="@+id/username"
    34. android:layout_width="200px"
    35. android:layout_height="wrap_content" />
    36. </LinearLayout>
    37. <Button
    38. android:id="@+id/mybut"
    39. android:layout_width="match_parent"
    40. android:layout_height="wrap_content"
    41. android:text="保存"
    42. />
    43. </LinearLayout>

    现在的关键问题就在于编写Activity程序。

    1. package com.example.sharedpreferences;
    2. import android.app.Activity;
    3. import android.content.SharedPreferences;
    4. import android.os.Bundle;
    5. import android.widget.TextView;
    6. public class SharedPreferencesActivity extends Activity {
    7. private TextView username = null;
    8. private TextView age = null;
    9. public static final String FILMNAME = "wanczy";
    10. @Override
    11. protected void onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. super.setContentView(R.layout.activity_shared_preferences);
    14. this.age = (TextView) super.findViewById(R.id.age);
    15. this.username = (TextView) super.findViewById(R.id.username);
    16. SharedPreferences share = super.getSharedPreferences(FILMNAME, Activity.MODE_PRIVATE);
    17. this.username.setText("用户名:"+ share.getString("username", "无所谓默认值"));//根据键取得值并放入到TextView中
    18. this.age.setText("年龄:"+ share.getInt("年龄",0));
    19. }
    20. }

    和在Java中使用属性存储操作上有相似之处,但是Java中的属性存储已经过时,现在存储比较流行的是xml存储。此时程序就已经完成了,默认情况下,存储文件都会保存在手机里面,后缀为.xml,现在程序已经可以保存,当然也可以读取咯。

    1. "http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical" >
    6. android:id="@+id/username"
    7. android:layout_width="wrap_content"
    8. android:layout_height="wrap_content" />
    9. android:id="@+id/age"
    10. android:layout_width="wrap_content"
    11. android:layout_height="wrap_content"/>
    1. package com.example.sharedpreferences;
    2. import android.app.Activity;
    3. import android.content.SharedPreferences;
    4. import android.os.Bundle;
    5. import android.widget.TextView;
    6. public class SharedPreferencesActivity extends Activity {
    7. private TextView username = null;
    8. private TextView age = null;
    9. public static final String FILMNAME = "wanczy";
    10. @Override
    11. protected void onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. super.setContentView(R.layout.activity_shared_preferences);
    14. this.age = (TextView) super.findViewById(R.id.age);
    15. this.username = (TextView) super.findViewById(R.id.username);
    16. SharedPreferences share = super.getSharedPreferences(FILMNAME, Activity.MODE_PRIVATE);
    17. this.username.setText("用户名:"+ share.getString("username", "无所谓默认值"));//根据键取得值并放入到TextView中
    18. this.age.setText("年龄:"+ share.getInt("age",0));
    19. }
    20. }

    对于SharedPreferences存储而言,并没有太多复杂操作,实际应用当中,使用SharedPreferences可以保存一些配置信息:例如,你正在看小说,希望关闭之后,下次打开能够在你最后浏览的进度点,那么这种情况下就可以使用SharedPreferences进行保存 。

    1.3 小结

    (1)SharedPreferences可以实现简单的数据存储功能实现,可以利用super.getSharedPreferences()方法取得实例;

    2. 文件存储

    2.1 知识点

    (1)掌握Activity对文件存储的若干操作;

    (2)可以实现文件的保存和读取操作。

    2.2 具体内容

    对于文件存储这块,必须要先掌握IO的基本操作,InputStream,OutputStream。

    了解一下IO流对文件的操作:

    ·使用File找到一个指定的文件

    ·使用字节流或者字符流的子类为父类进行实例化

    ·完成输入/输出的操作

    ·关闭流

    举例:向文件中写入内容—输出,我们的输入输出是对于程序而言。

    范例:本次还是以文件保存为主,不再进行页面的编写。

    1. package com.example.filesave;
    2. import java.io.FileOutputStream;
    3. import java.io.PrintStream;
    4. import android.app.Activity;
    5. import android.os.Bundle;
    6. public class FileSaveActivity extends Activity {
    7. public static final String FILENAME = "wanczy.txt";
    8. @Override
    9. protected void onCreate(Bundle savedInstanceState) {
    10. super.onCreate(savedInstanceState);
    11. super.setContentView(R.layout.activity_file_save);
    12. FileOutputStream output = null;
    13. PrintStream out = null;
    14. try {
    15. output = super.openFileOutput(FILENAME, Activity.MODE_PRIVATE);//使用Activity提供的方法创建了一个文件字节输出流
    16. //在IO操作中,打印流操作是最方便的
    17. out = new PrintStream(output);
    18. out.print("姓名:毛栗子");
    19. out.print("年龄:30");
    20. out.print("地址:兰州市庆阳路128号");
    21. } catch (Exception e) {
    22. } finally{
    23. out.close();
    24. }
    25. }
    26. }

    那么现在既然可以写入内容到文件,当然我们也可以将内容从文件中拿出来,那么对于读取文件,那肯定需要将文件内容放入到TextView中显示。

    1. "http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical">
    6. android:id="@+id/msg"
    7. android:layout_width="match_parent"
    8. android:layout_height="match_parent"/>

    以后的读取的内容就放在msg这个文本显示组件上,如果大家学习过Java的话,应该很清楚,使用PrintStream对于输出来说很方便,对于输入呢,使用什么最方便呢?使用扫描类肯定是最方便的,就是Scanner

    1. package com.example.filesave;
    2. import java.io.FileInputStream;
    3. import java.util.Scanner;
    4. import android.app.Activity;
    5. import android.os.Bundle;
    6. import android.widget.TextView;
    7. public class FileSaveActivity extends Activity {
    8. private static final String FILENAME = "wanczy.txt";
    9. private TextView msg = null;
    10. @Override
    11. protected void onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. super.setContentView(R.layout.activity_file_save);
    14. this.msg = (TextView) super.findViewById(R.id.msg);
    15. FileInputStream input = null;
    16. Scanner sc = null;
    17. try {
    18. input = super.openFileInput(FILENAME);//使用Activity提供的方法创建了一个文件字节输出流
    19. //在IO操作中,打印流操作是最方便的
    20. sc = new Scanner(input);
    21. String content = sc.next();//读取数据
    22. this.msg.setText("读取的信息为:"+content);
    23. } catch (Exception e) {
    24. } finally{
    25. sc.close();
    26. }
    27. }
    28. }

    以上的这种写法就是比较标准的程序。

    范例:向SD卡上保存文件

    1. package com.example.filesave;
    2. import java.io.File;
    3. import java.io.FileOutputStream;
    4. import java.io.PrintStream;
    5. import android.app.Activity;
    6. import android.os.Bundle;
    7. public class FileSaveActivity extends Activity {
    8. public static final String FILENAME = "/mnt/sdcard/wanczy/jjm/wanczy.txt";
    9. @Override
    10. protected void onCreate(Bundle savedInstanceState) {
    11. super.onCreate(savedInstanceState);
    12. super.setContentView(R.layout.activity_file_save);
    13. FileOutputStream output = null;
    14. PrintStream out = null;
    15. try {
    16. File file = new File(FILENAME);
    17. if(!file.getParentFile().exists()){//如果文件夹不存在
    18. file.mkdirs();
    19. }
    20. output = new FileOutputStream(file,true);//表示创建了一个文件的字节输出流 ,这种写法不能进行文件内容的追加
    21. //在IO操作中,打印流操作是最方便的
    22. out = new PrintStream(output);
    23. out.print("姓名:毛栗子");
    24. out.print("年龄:30");
    25. out.print("地址:兰州市庆阳路128号");
    26. } catch (Exception e) {
    27. } finally{
    28. if(null != out){
    29. out.close();
    30. }
    31. }
    32. }
    33. }

    范例:向SD卡上保存文件

    现在虽然程序写好了,既然是对SD card的操作,那么一定需要具备操作sdcard的权限。

    "android.permission.WRITE_EXTERNAL_STORAGE"/>

    现在我们只需要使用此类去判断sdcard是否存在。

    1. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){//表示存储目录能够进行你读写操作
    2. System.out.println("表示sdcard存在");
    3. }
    1. package com.example.filesave;
    2. import java.io.File;
    3. import java.io.FileOutputStream;
    4. import java.io.PrintStream;
    5. import android.app.Activity;
    6. import android.os.Bundle;
    7. import android.os.Environment;
    8. import android.widget.Toast;
    9. public class FileSaveActivity extends Activity {
    10. public static final String FILENAME = "/mnt/sdcard/wanczy/jjm/wanczy.doc";
    11. @Override
    12. protected void onCreate(Bundle savedInstanceState) {
    13. super.onCreate(savedInstanceState);
    14. super.setContentView(R.layout.activity_file_save);
    15. if (Environment.getExternalStorageState().equals(
    16. Environment.MEDIA_MOUNTED)) {// 表示存储目录能够进行你读写操作
    17. FileOutputStream output = null;
    18. PrintStream out = null;
    19. try {
    20. File file = new File(FILENAME);
    21. if (!file.getParentFile().exists()) {// 如果文件夹不存在
    22. file.mkdirs();
    23. }
    24. output = new FileOutputStream(file, true);// 表示创建了一个文件的字节输出流
    25. // ,这种写法不能进行文件内容的追加
    26. // 在IO操作中,打印流操作是最方便的
    27. out = new PrintStream(output);
    28. out.print("《幽窗小记》 宠若不惊 闲看庭前花开花落 去留无意 漫随天外云卷云舒");
    29. } catch (Exception e) {
    30. } finally {
    31. if (null != out) {
    32. out.close();
    33. }
    34. }
    35. }else{
    36. Toast.makeText(this, "sdcard不存在,请使用其他保存路径", Toast.LENGTH_SHORT).show();
    37. }
    38. }
    39. }

    这个程序更加适合在真机上进行操作。现在已经完成输出的功能,现在进行一些输入的显示。

    1. package com.example.filesave;
    2. import java.io.File;
    3. import java.io.FileInputStream;
    4. import java.util.Scanner;
    5. import android.app.Activity;
    6. import android.os.Bundle;
    7. import android.os.Environment;
    8. import android.widget.TextView;
    9. import android.widget.Toast;
    10. public class FileSaveActivity extends Activity {
    11. private static final String FILENAME = "wanczy.doc";
    12. private static final String DIR = "CSDN/mlz";
    13. private TextView msg = null;
    14. @Override
    15. protected void onCreate(Bundle savedInstanceState) {
    16. super.onCreate(savedInstanceState);
    17. super.setContentView(R.layout.activity_file_save);
    18. this.msg = (TextView) super.findViewById(R.id.msg);
    19. if (Environment.getExternalStorageState().equals(
    20. Environment.MEDIA_MOUNTED)) {
    21. FileInputStream input = null;
    22. Scanner sc = null;
    23. try {
    24. File file = new File(Environment.getExternalStorageDirectory().toString()+File.separator+DIR+File.separator+FILENAME);
    25. input = new FileInputStream(file);
    26. sc = new Scanner(input);
    27. while(sc.hasNext()){
    28. this.msg.append( sc.next());
    29. }
    30. } catch (Exception e) {
    31. } finally {
    32. sc.close();
    33. }
    34. }else{
    35. Toast.makeText(this, "sdcard不存在,请使用其他保存路径", Toast.LENGTH_SHORT).show();
    36. }
    37. }
    38. }

    以上保存在sdcard的程序与之前的不保存在sdcard并没有本质的区别。

    1. package com.example.filesave;
    2. import java.io.InputStream;
    3. import java.util.Scanner;
    4. import android.app.Activity;
    5. import android.content.res.Resources;
    6. import android.os.Bundle;
    7. import android.widget.TextView;
    8. public class FileSaveActivity extends Activity {
    9. private TextView msg = null;
    10. @Override
    11. protected void onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. super.setContentView(R.layout.activity_file_save);
    14. this.msg = (TextView) super.findViewById(R.id.msg);
    15. Resources res = super.getResources();//取得Resources对象
    16. InputStream in = res.openRawResource(R.raw.wanczy);//将资源文件加入到字节输入流、
    17. Scanner sc = null;
    18. StringBuffer sb = new StringBuffer();
    19. try {
    20. sc = new Scanner(in);
    21. while(sc.hasNext()){
    22. sb.append(sc.next()+"\n");
    23. }
    24. }catch(Exception e){
    25. }finally{
    26. sc.close();
    27. }
    28. this.msg .setText(sb.toString());
    29. }
    30. }

    2.3 小结

    (1)使用文件存储可以保存更加丰富的数据;

    (2)在Android之中可以使用XML的DOM和SAX解析方式进行文件操作;

    (3)在Android之中提供了PULL解析用于完成XML解析;

    (4)JSON可以进行简便的信息传送,性能更高;

    (5)可以将要读取的文件配置到项目的res文件目录之中,这样可以采用Resource直接进行资源文件的读取。

  • 相关阅读:
    解析分布式系统的缓存设计
    Pytorch 实战 LESSON 5 基本优化方法与最小二乘法
    创建最基本的web服务器-http模块
    从 PI Message Mapping 实时捕获错误信息
    PLC案例集合
    PCM格式图解
    网络安全(黑客)自学
    【独家揭秘】面试题:如何高效查询主表一千万,从表一亿的数据?
    水库自动化监测系统包括哪些内容
    关于安卓实现通用权限库的封装
  • 原文地址:https://blog.csdn.net/weixin_41830242/article/details/132646696