数据存储(读、写)
1.分类
1.共享参数存储
2.file存储 内部存储和外部存储(sd卡)
3.数据库存储
4.内容提供者ContextProvider
5.网络存储
2.共享参数存储 Shared Preferences
1.特征
1.存放轻量级的数据的存储方式
2.本质上是以xml的格式存在的,通过键值对的方式对数据进行读取
3.通常用于存储简单的数据信息
4.应用程序卸载后,文件也会被删除
2.存储数据的类型
boolean int string long float
3.存放数据的路径
4.存储数据
5.读取数据
package com.qf.day42_01;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextView tv;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
sp = getSharedPreferences("MySet", Context.MODE_PRIVATE);
}
//共享参数存储数据
public void write(View v){
//得到共享参数对象
//getPreferences(mode) 文件名称会以当前activity的类名来命名 这个也可以使用
//name 文件的名称,不需要拓展名
//mode 文件操作模式
//(context.MODE_PRIVATE 文件只能被当前的应用程序访问,覆盖的模式,替换掉之前的内容,写入时如key相同则value值会覆盖之前的内容)
//
//得到编辑对象
Editor editor = sp.edit();
//向共享参数中写入数据
editor.putString("msg", "你已经更改了TextView的设置");
editor.putInt("color", Color.RED);
editor.putInt("fontSize", 25);
//提交数据
editor.commit();
Toast.makeText(this, "succes",1).show();
}
//以共享参数读取数据
public void read(View v){
//得到共享参数的对象
String msg = sp.getString("msg","读取数据失败");
int color = sp.getInt("color", 0);
int fontSize = sp.getInt("fontSize", 20);
//读取数据
tv.setText(msg);
tv.setTextColor(color);
tv.setTextSize(fontSize);
}
}
实现记住密码登录
package com.qf.day42_02;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private CheckBox cb;
private EditText pwd;
private EditText user;
private SharedPreferences sp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
user = (EditText) findViewById(R.id.user);
pwd = (EditText) findViewById(R.id.pwd);
cb = (CheckBox) findViewById(R.id.cb);
sp = getSharedPreferences("Login", Context.MODE_PRIVATE);
// ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, resource)
if (!"".equals(sp.getString("pwd", ""))&!"".equals(sp.getString("user", ""))) {
user.setText(sp.getString("user", ""));
pwd.setText(sp.getString("pwd", ""));
cb.setChecked(true);
}else {
user.setText("");
pwd.setText("");
}
}
public void submit(View v){
if (cb.isChecked()) {
Editor editor = sp.edit();
editor.putString("user", user.getText().toString().trim());
editor.putString("pwd", pwd.getText().toString().trim());
editor.commit();
}else {
Editor editor = sp.edit();
editor.clear();
editor.commit();
}
}
}
3.file 存储
内部存储 Internal Storage
1.特点
文件只能被当前应用程序访问,其他应用程序不能访问
应用程序卸载后 内部存储文件也会被删除
2.路径
3.核心代码 FileOutPutStream | FileInputStream
1.存入数据
2.读取数据
package com.qf.day42_03;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private EditText ed1;
private EditText ed2;
private AlertDialog.Builder builder;
private ArrayAdapter<String> adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed1 = (EditText) findViewById(R.id.ed1);
ed2 = (EditText)findViewById(R.id.et2);
init();
}
public void write(View v){
//得到输入框的内容
String fileName = ed1.getText().toString().trim();
String content = ed2.getText().toString().trim();
//存入数据
//打开内部文件存储的输出流
//写入数据
//关闭流
try {
FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE);//第一个参数文件名称第二个参数模式
fos.write(content.getBytes());
fos.flush();
fos.close();
Toast.makeText(MainActivity.this, "success", 1).show();
} catch (Exception e) {
e.printStackTrace();
}
}
public void read(View v){
String fileName = ed1.getText().toString().trim();
try {
FileInputStream fis = openFileInput(fileName);
byte[] buf = new byte[fis.available()];
fis.read(buf);
fis.close();
ed2.setText(new String(buf));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO Auto-generated method stub
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch (item.getItemId()) {
case R.id.action_select:
//获取内部存储中所有的文件名称
String[] data = fileList();
adapter.clear();
adapter.addAll(data);
//删除某个指定的文件deleteFile(name)
//获得一个文件路径getFilesDir()
adapter.notifyDataSetChanged();
builder.show();
break;
}
return super.onOptionsItemSelected(item);
}
public void init(){
builder = new AlertDialog.Builder(MainActivity.this);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("请选择文件名称");
adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1);
builder.setAdapter(adapter, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
//将选中的文件名称设置到文件名的输入框中
String fileName = adapter.getItem(which);
ed1.setText(fileName);
//设置点击事件
read(null);
}
});
}
}
![](0f9aba82-636d-48f4-8c71-d8bf860c6e75_files/6d5d5c1f-a5cf-4ad7-9532-1c281adb5263.jpg)
4.外部存储 External Storage【SD卡存储】
1.特点
1.插入sd卡
2.目录结构分为两部分:sd卡的公共目录、sd卡的私有目录 公共目录内的文件其他程序也可以访问,当程序卸载后公共目录中的文件不会删除。 私有目录下的文件只有本程序才能使用,私有目录下的文件会被清除。
2.路径
mut/sdcard 4.0 之前的目录
storage/sdcard 4.0 之后的目录 公共目录
storage/sdcard/Android/data/应用程序包名...私有目录
3.读写sd卡权限
WRITE_EXTERNAL_STORAGE 写权限
READ_EXTERNAL_STORAGE 读权限
4.获取一下扩展卡的目录
getDownloadCacheDirectory() 下载目录中的缓存目录
getExternalStorageDirectory() 获取拓展卡的根目录
5.获取当前拓展卡的状态
getExternalStorageState() 得到拓展卡的状态 MEDIA_MOUNTED 已经被装载好可以使用的状态(挂载的状态) 判断存储的状态符合这个条件那么可以存取文件
package com.qf.day42_04.tools;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;
public class SDCardUtils {
//保存图片的目录
private static final String PATH = Environment.getExternalStorageDirectory()+"/1614/img/";
public static boolean isMounted(){
//得到当前sd卡的状态
String state = Environment.getExternalStorageState();
//跟系统提供的挂载状态进行比较
return state.equals(Environment.MEDIA_MOUNTED);
}
public static String getfileName(String path){
return path.substring(path.lastIndexOf("/")+1);
}
/**
* 保持到sd卡的公共目录中
* @param path 用于截取图片名称
* @param data 图片内容
*/
public static void saveImg(String path,byte[] data){
//判断sd卡是否可以使用
//判断当前缓存的目录是否存在
//将图片的字节写入到指定的文件中
if (isMounted()) {
File dir = new File(PATH);
if (!dir.exists()) {
dir.mkdirs();//级联创建
}
try {
FileOutputStream fos = new FileOutputStream(new File(dir,getfileName(path)));
fos.write(data);
fos.flush();
fos.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else {
return;
}
}
/**
* 根据图片的名称,从sd卡的公共目录中读取图片
* @param path
* @return
*/
public static Bitmap getBitmap(String path){
if (isMounted()) {
File file = new File(PATH, getfileName(path));
if (file.exists()) {
//把绝对路径的图片转成bitmap
return BitmapFactory.decodeFile(file.getAbsolutePath());
}
return null;
}else {
return null;
}
}
public static void savePrivate(Context context,String fileName,String content){
if (isMounted()) {
//sd卡的私有目录 Environment.DIRECTORY_DOWNLOADS
File file = new File(context.getExternalFilesDir(null), fileName);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write(content.getBytes());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
if (fos!=null) {
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}else {
return;
}
}
public static String openPrivate(Context context,String fileName){
if (isMounted()) {
String result = null;
File file = new File(context.getExternalFilesDir(null), fileName);
FileInputStream fis = null;
BufferedReader reader = null;
String line = null;
StringBuilder sBuilder = new StringBuilder();
try {
fis = new FileInputStream(file);
reader = new BufferedReader(new InputStreamReader(fis));
while((line = reader.readLine())!=null){
sBuilder.append(line);
}
result = sBuilder.toString();
return result;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if (fis!=null) {
try {
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}if (reader!=null) {
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}else {
return null;
}
return null;
}
//清除sd卡指定目录下的数据
public static void clearCardCaches(){
if (isMounted()) {
//得到缓存目录中的文件
File file = new File(PATH);
if (file.exists()) {
//列出指定目录中的所有文件
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
files[i].delete();
}
}
}else {
return;
}
}
//判断sd卡的可用空间
public static boolean isAvailable(){
if (isAvailable()) {
//实例化文件管理系统的状态对象 StatFs
StatFs statFs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
long size = 0; //字节为单位的
if (Build.VERSION.SDK_INT>=18) {
size = statFs.getFreeBytes();
}else {
//计算可用的代码块*每个块的大小
size = statFs.getFreeBlocks()*statFs.getBlockSize();
}
//sd卡的可用空间必须大于10M 则表示可以使用
if (size>1*1024*1024*10) {
return true;
}else {
return false;
}
}else {
return false;
}
}
}