【Android学习专题】数据存储篇:SharedPreferences/Files/SDCard
SkySeraph Feb 2nd 2012 SZTCL
Email: QQ:452728574
-----------------------------------------------------------------------------------------------------------------------------------------------------------
【数据存储概述 】
Ⅰ 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源码
1 public class preference extends Activity 2 { 3 // // 4 private EditText mEditText; 5 private Button mBtn1, mBtn2, mBtn3; 6 private static final String DATASTORAGE_Preference_FILE_NAME="preferenceTest"; //SharedPreferences名称 7 public final static String DATASTORAGE_Preference_TEXT = "sms_content"; //存储信息 8 public final static String DATASTORAGE_Preference_FILE_URL = "/data/data/"; //SharedPreferences中储存数据的路径 9 public final static String DATASTORAGE_Preference_XML = "text.xml"; // 10 SharedPreferences mPre = null; //SharedPreferences对象 11 12 // // 13 @Override 14 protected void onCreate(Bundle savedInstanceState) 15 { 16 // TODO Auto-generated method stub 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.mydatastorage_preference); // 设置Activity界面 19 20 // ①获得SharePreferences实例 21 mPre = getSharedPreferences(DATASTORAGE_Preference_FILE_NAME,this.MODE_PRIVATE);//参数含义:文件名、操作模式(私有、可读、可写) 22 // ②从SharePreferences中获得短信内容 23 String content = mPre.getString(DATASTORAGE_Preference_TEXT, "没编入信息"); 24 // 从EditText中显示短信内容 25 //mEditText.setText(content); 26 27 // 通过findViewById方法实例化对象 28 mEditText = (EditText) findViewById(R.id.mydatastorage_preference_ET01); 29 mEditText.setHint("上次编入的短信内容为:"+content); 30 31 mBtn1 = (Button) findViewById(R.id.preference_Btn01); 32 mBtn1.setOnClickListener(new OnClickListener()//Read 33 { 34 @Override 35 public void onClick(View v) 36 { 37 // TODO Auto-generated method stub 38 String name = mEditText.getText().toString(); //获得数据 39 Editor editor = mPre.edit();//获得编辑器 40 editor.putString(DATASTORAGE_Preference_TEXT, name); //保存入SharedPreferences 41 editor.commit(); //put完毕必需要commit()否则无法保存 42 } 43 }); 44 mBtn2 = (Button) findViewById(R.id.preference_Btn02); 45 mBtn2.setOnClickListener(new OnClickListener()//clear 46 { 47 @Override 48 public void onClick(View v) 49 { 50 Editor editor = mPre.edit(); 51 editor.remove(DATASTORAGE_Preference_TEXT); 52 editor.clear(); 53 editor.commit(); 54 } 55 }); 56 mBtn3 = (Button) findViewById(R.id.preference_Btn03); 57 mBtn3.setOnClickListener(new OnClickListener()//delete 58 { 59 @Override 60 public void onClick(View v) 61 { 62 File file = new File(DATASTORAGE_Preference_FILE_URL + getPackageName().toString() 63 + "/shared_prefs", DATASTORAGE_Preference_XML); 64 if (file.exists()) 65 { 66 file.delete(); 67 } 68 } 69 }); 70 } 71 // // 72 }
2 XML配置文件
1 26 7 12 13 19 20 2124 25 31 32 38 39 45 46 47 48
Ⅴ 效果
-----------------------------------------------------------------------------------------------------------------------------------------------------------
【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布局文件
1 26 7 12 13 19 20 2124 25 31 32 38 39 40 4147 48 4952 53 59 60 66 67 68
Ⅴ 实例效果
-----------------------------------------------------------------------------------------------------------------------------------------------------------
【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 26 7 12 13 18 19 2023 24 30 31 37 38 44 45 51 52 53
Ⅴ 实例效果
-----------------------------------------------------------------------------------------------------------------------------------------------------------
Refs:
1
2
3
4