zoukankan      html  css  js  c++  java
  • 【Android学习专题】数据存储篇:SharedPreferences/Files/SDCard

    【数据存储概述 】

    Ⅰ Android的5种方式存储数据

      1.使用SharedPreferences存储数据;

      2.使用Files存储数据;

      3.使用SQLite数据库存储数据;

      4.使用ContentProvider存储数据;

      5.网络存储数据;

    Ⅱ 测试界面

     ----------------------------------------------------------------------------------------------------------------------------------------------------------

    【SharedPreferences】

    Ⅰ 概述:用来存储"Key"-"Value"格式的数据,主要针对系统配置信息的保存,如用户登录时,输入了用户名密码,下次登录时保留这一次的输入内容。

    Ⅱ 操作

    * 1 存:

      *  SharedPreferences mPre = Context.getPreferences(0); // 取得活动的preferences对象

      *  SharedPreferences.Editor editor = mPre.edit();  // 取得编辑对象

      *  editor.putString(KEY, value);       // 添加值  

      *  editor.putBoolean(KEY, value);  

      *  editor.commit();         // 提交保存

    * 2 取:  

      *  SharedPreferences mPre = getPreferences(Activity.MODE_PRIVATE); // 取得活动的preferences对象  

      *  String value = mPre.getString(KEY, "默认值");      // 取得值  

      *  Boolean value = mPre.getBoolean(KEY, false);  

    * 3 存取时间:主要有下面三种情况,其它也可以根据实际来操作  

      *  protected void onPause() //系统通知暂停,可以保存设置  

      *  public void onDestroy()  //系统通知关闭,可以保存设置  

      *  public void onCreate(Bundle savedInstanceState) //系统启动,可以打开设置  

    * 4 保存:  

      * ①保存后生成的是XML文件,内容是以节点的形势保存在文件中  

      * ②位置:/data/data/package/shared_prefs  

      * ③权限:本地程序所拥有,其它程序无法获得操作,无法实现共享

    Ⅲ 常用方法参考

    Ⅳ 实例源码

    1 java源码

    View Code

    2 XML配置文件

    View Code

    Ⅴ 效果

    -----------------------------------------------------------------------------------------------------------------------------------------------------------

    【Files】

    Ⅰ 应用:文件存储(应用程序内存中)。

    Ⅱ 操作  

    * 1 写入:FileOutputStream fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);(如果文件不存在会自动创建)  

    *   fos.write(str);  

    * 2 读取:FileInputStream fis = openFileInput(FILE_NAME);  

    *   fis.read(buf);  

    * 3 清除:采用写入空str的方式  

    * 4 删除:super.deleteFile(FILE_NAME);

    Ⅲ 常用方法

    Ⅳ 实例源码

    1 java源码

    复制代码
      1 public class files extends Activity
    2 {
    3 // 文件名字符串常量
    4 private static final String DATASTORAGE_FILE_FILE_NAME="filesTest.txt";
    5 // file中储存数据的路径
    6 public final static String DATASTORAGE_FILE_FILE_URL = "/data/data/";
    7 // 按钮和编辑框对象
    8 private Button mBtn1,mBtn2,mBtn3,mBtn4;
    9 private EditText mEt1,mEt2;
    10
    11 @Override
    12 protected void onCreate(Bundle savedInstanceState)
    13 {
    14 // TODO Auto-generated method stub
    15 super.onCreate(savedInstanceState);
    16 setContentView(R.layout.mydatastorage_files);
    17
    18 String content = readFile(DATASTORAGE_FILE_FILE_NAME);
    19 if (TextUtils.isEmpty(content))
    20 {
    21 content = "上次输入内容为空,请输入内容!";
    22 }
    23 String str2 = "上次输入的内容为("+content+")";
    24 String str1 = "请在此输入内容!";
    25
    26 mEt1 = (EditText)findViewById(R.id.mydatastorage_files_ET01);
    27 mEt1.setHint(str1);
    28 mEt2 = (EditText)findViewById(R.id.mydatastorage_files_ET02);
    29 mEt2.setHint(str2);
    30
    31 mBtn1 = (Button)findViewById(R.id.mydatastorage_files_Btn01);
    32 mBtn2 = (Button)findViewById(R.id.mydatastorage_files_Btn02);
    33 mBtn3 = (Button)findViewById(R.id.mydatastorage_files_Btn03);
    34 mBtn4 = (Button)findViewById(R.id.mydatastorage_files_Btn04);
    35
    36 mBtn1.setOnClickListener(new OnClickListener()//写入
    37 {
    38 @Override
    39 public void onClick(View v)
    40 {
    41 String content = mEt1.getText().toString();
    42 saveToFile(DATASTORAGE_FILE_FILE_NAME,content,5);
    43 showInfo("写入成功");
    44 }
    45 });
    46
    47 mBtn2.setOnClickListener(new OnClickListener()//读取
    48 {
    49 @Override
    50 public void onClick(View v)
    51 {
    52 String content = readFile(DATASTORAGE_FILE_FILE_NAME);
    53 mEt2.setText(content);
    54 showInfo("读取成功");
    55 }
    56 });
    57
    58 mBtn3.setOnClickListener(new OnClickListener()//清除
    59 {
    60 @Override
    61 public void onClick(View v)
    62 {
    63 clearFile(DATASTORAGE_FILE_FILE_NAME);
    64 String content = readFile(DATASTORAGE_FILE_FILE_NAME);
    65 mEt2.setText(content);
    66 showInfo("清除成功");
    67 }
    68 });
    69
    70 mBtn4.setOnClickListener(new OnClickListener()//删除
    71 {
    72 @Override
    73 public void onClick(View v)
    74 {
    75 deleteSDFile(DATASTORAGE_FILE_FILE_NAME);
    76 }
    77 });
    78 }
    79
    80 // ////////////////////////////////////////////////////////////////////////////////////
    81 /* 文件写入(文件保存至手机File) */
    82 public void saveToFile(String filename, String content, int method)
    83 {
    84 try
    85 {
    86 FileOutputStream fos = null;
    87 switch (method)
    88 {
    89 case 1:// MODE_PRIVATE
    90 // ①以默认私有方式保存文件内容,存放在手机存储空间中(Context.MODE_PRIVATE)
    91 fos = this.openFileOutput(filename, this.MODE_PRIVATE);// 获取输出流
    92 break;
    93 case 2:// MODE_APPEND
    94 // ②以追加的方式保存文件内容 (Context.MODE_APPEND)
    95 fos = this.openFileOutput(filename, this.MODE_APPEND);
    96 break;
    97 case 3:// MODE_WORLD_READABLE
    98 // ③以允许其他应用从该文件中读取内容的方式保存文件(Context.MODE_WORLD_READABLE)
    99 fos = this.openFileOutput(filename, this.MODE_WORLD_READABLE);
    100 break;
    101 case 4:// MODE_WORLD_WRITEABLE
    102 // ④以允许其他应用往该文件写入内容的方式保存文件(Context.MODE_WORLD_WRITEABLE)
    103 fos = this.openFileOutput(filename, this.MODE_WORLD_WRITEABLE);
    104 break;
    105 case 5:// MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE
    106 // ⑤以允许其他应用对该文件读和写的方式保存文件(MODE_WORLD_READABLE与MODE_WORLD_WRITEABLE)
    107 fos = this.openFileOutput(filename, this.MODE_WORLD_READABLE
    108 + this.MODE_WORLD_WRITEABLE);
    109 break;
    110 default:
    111 fos = this.openFileOutput(filename, this.MODE_PRIVATE);
    112 break;
    113 }
    114 fos.write(content.getBytes());
    115 fos.close();
    116
    117 } catch (FileNotFoundException e)
    118 {
    119 e.printStackTrace();
    120 } catch (IOException e)
    121 {
    122 e.printStackTrace();
    123 }
    124 }
    125 // ////////////////////////////////////////////////////////////////////////////////////
    126 /*清除记录 */
    127 public void clearFile(String filename)
    128 {
    129 String cleanStr = "";
    130 try
    131 {
    132 FileOutputStream outStream = this
    133 .openFileOutput(filename, this.MODE_WORLD_READABLE);
    134 outStream.write(cleanStr.getBytes());
    135 outStream.close();
    136 } catch (FileNotFoundException e)
    137 {
    138 } catch (IOException e)
    139 {
    140 }
    141 }
    142 // ////////////////////////////////////////////////////////////////////////////////////
    143 /* 文件删除 */
    144 public void deleteSDFile(String filename)
    145 {
    146 File file = new File(DATASTORAGE_FILE_FILE_URL + getPackageName().toString()
    147 + "/files", filename);
    148 if (file.exists())
    149 {
    150 file.delete();
    151 }
    152 showInfo("删除成功");
    153 }
    154 // ////////////////////////////////////////////////////////////////////////////////////
    155 /*文件读取(文件加载)*/
    156 public String readFile(String filename)
    157 {
    158 try
    159 {
    160 // 实例化文件输入流对象
    161 FileInputStream inStream = this.openFileInput(filename);
    162 // 定义缓存数组
    163 byte[] buffer = new byte[inStream.available()];
    164 // 读到缓存区
    165 inStream.read(buffer);
    166 inStream.close();
    167 return new String(buffer);
    168 } catch (FileNotFoundException e)
    169 {
    170 e.printStackTrace();
    171 } catch (IOException e)
    172 {
    173 e.printStackTrace();
    174 }
    175 return null;
    176 }
    177
    178 // ////////////////////////////////////////////////////////////////////////////////////
    179 /*显示子函数*/
    180 private void showInfo(String str)
    181 {
    182 // new AlertDialog.Builder(files.this).setMessage(str).show();
    183 Toast.makeText(files.this, str, Toast.LENGTH_LONG).show();
    184 }
    185 // ////////////////////////////////////////////////////////////////////////////////////
    186
    187 }
    复制代码

    2 xml布局文件

    View Code

    Ⅴ 实例效果

    -----------------------------------------------------------------------------------------------------------------------------------------------------------

    【SDCard】

    Ⅰ 应用:文件存储(SD卡中)。

    Ⅱ 操作:  

    * 1 在AndroidManifest文件中加入sdcard操作权限  

    *  <!--在SDCard中创建与删除文件权限 -->  

    *  <uses-permissioandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  

    *  <!--往SDCard写入数据权限 -->  

    *  <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  

    * 2 确认sdcard的存在  

    *  android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)  

    * 3 获取扩展存储设备的文件目录  

    *  android.os.Environment.getExternalStorageDirectory();

    Ⅲ 常用方法参考

    Ⅳ 实例源码

    1 java源码

    复制代码
      1 public class sdcard extends Activity
    2 {
    3 // 文件名字符串常量和目录
    4 public final static String DATASTORAGE_SDCard_FILE_NAME = "sdcardTest.txt";
    5 // 按钮和编辑框对象
    6 private Button mBtn1, mBtn2, mBtn3, mBtn4;
    7 private EditText mEt;
    8
    9 @Override
    10 protected void onCreate(Bundle savedInstanceState)
    11 {
    12 // TODO Auto-generated method stub
    13 super.onCreate(savedInstanceState);
    14 setContentView(R.layout.mydatastorage_sdcard);
    15
    16 String content = readSDCard(DATASTORAGE_SDCard_FILE_NAME);
    17 if (TextUtils.isEmpty(content))
    18 {
    19 content = "上次输入内容为空,请输入内容!";
    20 }
    21
    22 mEt = (EditText) findViewById(R.id.mydatastorage_sdcard_ET01);
    23 mEt.setHint("上次输入SD卡的内容的为:"+content );
    24
    25 mBtn1 = (Button) findViewById(R.id.mydatastorage_sdcard_Btn01);
    26 mBtn2 = (Button) findViewById(R.id.mydatastorage_sdcard_Btn02);
    27 mBtn3 = (Button) findViewById(R.id.mydatastorage_sdcard_Btn03);
    28 mBtn4 = (Button) findViewById(R.id.mydatastorage_sdcard_Btn04);
    29
    30 mBtn1.setOnClickListener(new OnClickListener()// 写入
    31 {
    32 @Override
    33 public void onClick(View v)
    34 {
    35 String content = mEt.getText().toString();
    36 saveToSDCard(DATASTORAGE_SDCard_FILE_NAME, content);
    37 }
    38 });
    39 mBtn2.setOnClickListener(new OnClickListener()// 读取
    40 {
    41 @Override
    42 public void onClick(View v)
    43 {
    44 String content = readSDCard(DATASTORAGE_SDCard_FILE_NAME);
    45 if(TextUtils.isEmpty(content))
    46 showInfo("读取文件为空!");
    47 mEt.setText(content);
    48 }
    49 });
    50
    51 mBtn3.setOnClickListener(new OnClickListener()// 清除
    52 {
    53 @Override
    54 public void onClick(View v)
    55 {
    56 clearSDFile(DATASTORAGE_SDCard_FILE_NAME);
    57 String content = readSDCard(DATASTORAGE_SDCard_FILE_NAME);
    58 mEt.setText(content);
    59 }
    60 });
    61
    62 mBtn4.setOnClickListener(new OnClickListener()// 删除
    63 {
    64 @Override
    65 public void onClick(View v)
    66 {
    67 deleteSDFile(DATASTORAGE_SDCard_FILE_NAME);
    68 }
    69 });
    70 }
    71
    72 // ////////////////////////////////////////////////////////////////////////////////////
    73 /* 文件写入(文件保存到SDCard中) */
    74 public void saveToSDCard(String filename, String content)
    75 {
    76 try
    77 {
    78 // Log.d(LOG_TAG, "Start Write");
    79 // ①获取扩展SD卡设备状态
    80 String SDCardState = android.os.Environment.getExternalStorageState();
    81 if (SDCardState.equals(android.os.Environment.MEDIA_MOUNTED)) // 判断sdcard是否存在(可读可写权限)
    82 {
    83 // ②获取扩展存储设备的文件目录
    84 File SDFile = android.os.Environment.getExternalStorageDirectory();
    85 // ③打开文件
    86 // File file = new File(SDFile,filename);
    87 File file = new File(SDFile.getAbsolutePath() + File.separator + filename);
    88 // 判断是否存在,不存在则创建
    89 if (!file.exists())
    90 {
    91 file.createNewFile();
    92 }
    93 // ④写数据
    94 FileOutputStream fos = new FileOutputStream(file); // 获取输出流
    95 fos.write(content.getBytes());
    96 fos.close();
    97 showInfo("文件写入成功!");
    98 } else
    99 {
    100 showInfo("文件写入失败!");
    101 }
    102
    103 } catch (FileNotFoundException e)
    104 {
    105 e.printStackTrace();
    106 } catch (IOException e)
    107 {
    108 e.printStackTrace();
    109 }
    110 }
    111
    112
    113 // ////////////////////////////////////////////////////////////////////////////////////
    114 /* 文件读取(文件加载) */
    115 public String readSDCard(String filename)
    116 {
    117 try
    118 {
    119 String SDCardState = android.os.Environment.getExternalStorageState();
    120 if (SDCardState.equals(android.os.Environment.MEDIA_MOUNTED)) // 只读权限
    121 {
    122 // 获取扩展存储设备的文件目录
    123 File SDFile = android.os.Environment.getExternalStorageDirectory();
    124 // 创建一个文件
    125 File file = new File(SDFile.getAbsolutePath() + File.separator + filename);
    126 // 判断文件是否存在
    127 if (file.exists())
    128 {
    129 // 读数据
    130 FileInputStream fis = new FileInputStream(file);
    131 byte[] buffer = new byte[1024];// 定义缓存数组
    132 // byte[] buffer = new byte[fis.available()];
    133 fis.read(buffer);// 读到缓存区
    134 fis.close();
    135 showInfo("文件读取成功!");
    136 return new String(buffer);
    137 }
    138 else
    139 {
    140 showInfo("文件不存在,读取失败!");
    141 return null;
    142 }
    143 }
    144 else
    145 {
    146 showInfo("无操作权限,文件读取失败!");
    147 return null;
    148 }
    149 } catch (FileNotFoundException e)
    150 {
    151 e.printStackTrace();
    152 } catch (IOException e)
    153 {
    154 e.printStackTrace();
    155 }
    156 return null;
    157 }
    158
    159 // ////////////////////////////////////////////////////////////////////////////////////
    160 // ////////////////////////////////////////////////////////////////////////////////////
    161 /* 清除记录 */
    162 public void clearSDFile(String filename)
    163 {
    164 String cleanStr = "";// 如果只须要删除文件中的一部分内容则须要在这里对字符串做一些操作
    165 FileOutputStream fos = null;
    166 File file = new File(Environment.getExternalStorageDirectory(),
    167 filename);
    168 try
    169 {
    170 fos = new FileOutputStream(file);
    171 fos.write(cleanStr.getBytes());
    172 fos.close();
    173 } catch (FileNotFoundException e)
    174 {
    175 e.printStackTrace();
    176 } catch (IOException e)
    177 {
    178 e.printStackTrace();
    179 }
    180 }
    181
    182 // ////////////////////////////////////////////////////////////////////////////////////
    183 /* 文件删除 */
    184 public void deleteSDFile(String filename)
    185 {
    186 String path = Environment.getExternalStorageDirectory() + "/"
    187 + filename;
    188 File file = new File(path);
    189 boolean isDelte = file.delete();
    190 if (isDelte)
    191 {
    192 showInfo("删除SD卡成功");
    193 } else
    194 {
    195 finish();
    196 }
    197 }
    198
    199 // ////////////////////////////////////////////////////////////////////////////////////
    200 /* 显示子函数 */
    201 private void showInfo(String str)
    202 {
    203 // new AlertDialog.Builder(sdcard.this).setMessage(str).show();
    204 Toast.makeText(sdcard.this, str, Toast.LENGTH_LONG).show();
    205 }
    206 // ////////////////////////////////////////////////////////////////////////////////////
    207 }
    复制代码

    2 xml布局文件

    复制代码
     1 <?xml version="1.0" encoding="utf-8"?>
    2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3 android:layout_width="fill_parent"
    4 android:layout_height="fill_parent"
    5 android:orientation="vertical" >
    6
    7 <TextView
    8 android:layout_width="fill_parent"
    9 android:layout_height="wrap_content"
    10 android:text="SDCard Test"
    11 android:textSize="25dp" />
    12
    13 <EditText
    14 android:id="@+id/mydatastorage_sdcard_ET01"
    15 android:layout_width="fill_parent"
    16 android:layout_height="wrap_content"
    17 android:height="200px">
    18 </EditText>
    19
    20 <LinearLayout
    21 android:layout_width="fill_parent"
    22 android:layout_height="wrap_content" >
    23
    24 <Button
    25 android:id="@+id/mydatastorage_sdcard_Btn01"
    26 android:layout_width="wrap_content"
    27 android:layout_height="wrap_content"
    28 android:text="Write" >
    29 </Button>
    30
    31 <Button
    32 android:id="@+id/mydatastorage_sdcard_Btn02"
    33 android:layout_width="wrap_content"
    34 android:layout_height="wrap_content"
    35 android:text="Read" >
    36 </Button>
    37
    38 <Button
    39 android:id="@+id/mydatastorage_sdcard_Btn03"
    40 android:layout_width="wrap_content"
    41 android:layout_height="wrap_content"
    42 android:text="Clear" >
    43 </Button>
    44
    45 <Button
    46 android:id="@+id/mydatastorage_sdcard_Btn04"
    47 android:layout_width="wrap_content"
    48 android:layout_height="wrap_content"
    49 android:text="Delete" >
    50 </Button>
    51 </LinearLayout>
    52
    53 </LinearLayout>
    复制代码

    Ⅴ 实例效果

    -----------------------------------------------------------------------------------------------------------------------------------------------------------

    Refs:

    1 http://blog.csdn.net/jiahui524

    2 http://blog.csdn.net/xys289187120/article/details/6645629

    3 http://www.moandroid.com/?p=319

    4 http://blog.csdn.net/rhljiayou/article/details/7100840

     

     


    作者:skyseraph
    出处:http://www.cnblogs.com/skyseraph/
    Email/GTalk: zgzhaobo@gmail.com QQ:452728574
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    c/c++中两颗璀璨的明珠
    deepin软件中心打不开
    shell之rm -rf的别名设置
    历史命令脚本
    mysql之7xtrabackup
    python之3内置容器
    python之第一个例子hello world
    python之安装
    shell脚本练习(autocert)
    【转】nginx之逻辑运算
  • 原文地址:https://www.cnblogs.com/qingblog/p/2518136.html
Copyright © 2011-2022 走看看