Android移动应用基础学习——第四章数据存储

第四章 数据存储

一、数据存储方式

1、文件存储

2、shared Preference 本质就是一个xml文件

3、sqlite 有大量相似的结构的数据需要存储的时候

4、内容提供者 content Provider

5、网络存储数据

二、文件存储

  • 授予读写权限:Manifest–>Permissions–>add–>User Permission–>Name为android.permission.WRITE_EXTERNAL_STORAGE
    在这里插入图片描述
  public class MainActivity extends Activity {
  	private static final String tag = "MainActivity";
  	private EditText et_qq;
  	private EditText et_pwd;
  	private CheckBox cb_remember;
  	@Override
  	protected void onCreate(Bundle savedInstanceState) {
  		super.onCreate(savedInstanceState);
  		setContentView(R.layout.activity_main);
  		et_qq = (EditText) findViewById(R.id.et_qq);
  		et_pwd = (EditText) findViewById(R.id.et_pwd);
  		cb_remember = (CheckBox) findViewById(R.id.cb_remember);
  		// 读取用户保存密码的文件
  		try {
  			File file = new File(Environment.getExternalStorageDirectory(),
  					"info.txt");
  			FileInputStream fis = new FileInputStream(file);
  			BufferedReader br = new BufferedReader(new InputStreamReader(fis));
  			String info = br.readLine();
  			String qq = info.split("##")[0];
  			String pwd = info.split("##")[1];
  			et_qq.setText(qq);
  			et_pwd.setText(pwd);
  		} catch (Exception e) {
  			// TODO Auto-generated catch block
  			e.printStackTrace();
  		}
  	}
  	public void login(View view) {
  		String qq = et_qq.getText().toString();
  		String pwd = et_pwd.getText().toString();
  		if (TextUtils.isEmpty(qq) || TextUtils.isEmpty(qq)) {
  			Toast.makeText(this, "用户名密码不能为空", Toast.LENGTH_SHORT).show();
  		} else {
  			// 登录操作
  			// 判断用户是否勾选了记住密码
  			if (cb_remember.isChecked()) {
  				// 记住密码
  				Log.i(tag, "记住密码");
  				// 保存用户qq和密码
  				try {
  					//判读sd卡状态是否有,是否可以被读写
  					String status = Environment.getExternalStorageState();
  					Environment.getExternalStorageDirectory().getFreeSpace();
  					if (Environment.MEDIA_MOUNTED.equals(status)) {
  						File file = new File(
  								Environment.getExternalStorageDirectory(),
  								"info.txt");
  						FileOutputStream fos = new FileOutputStream(file);
  						// 用##作分隔符
  						String info = qq + "##" + pwd;
  						fos.write(info.getBytes());
  						fos.close();
  						Toast.makeText(this, "保存密码成功", 0).show();
  					} else {
  						Toast.makeText(this, "sd卡不可写,请检查sd卡状态", 0).show();
  					}
  				} catch (Exception e) {
  					e.printStackTrace();
  					Toast.makeText(this, "保存密码失败", 0).show();
  				}
  			} else {
  				// 不需要记住密码
  				Log.i(tag, "不需要记住密码");
  			}
  		}
  	}
  }

三、存储用户信息案例

在这里插入图片描述

  • OnCreate方法

在这里插入图片描述

  • 存储按钮

在这里插入图片描述

  • 读取按钮

在这里插入图片描述

四、XML序列化

  • 解析xml

在这里插入图片描述

  • 代码(xml序列化:加密qq与pwd)

在这里插入图片描述

习题:

Android中使用serializer对象生成xml 文档开头的方法是( start Document )

五、XML解析

  • 文件访问权限

在这里插入图片描述

  • 解析xml之预报–MainActivity
  public class MainActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		TextView tv_info=(TextView)findViewById(R.id.tv_info);
    		ImageView iv_info=(ImageView)findViewById(R.id.iv_info);
    		// 上下文,实际上就是一个环境
    		AssetManager am = this.getAssets();
    		try {
    			WeatherInfo weatherInfo=new WeatherInfo();
    			// 得到文件的输入流
    			InputStream is = am.open("weather.xml");
    			// 解析xml文件(sax dom dom4j pull解析)
    			// 声明一个pull解析器
    			XmlPullParser parser = Xml.newPullParser();
    			// 初始化解析器,设置解析哪个流,用什么样的编码
    			parser.setInput(is, "utf-8");
    			// 获取事件的类型
    			int type = parser.getEventType();
    			while(type!=XmlPullParser.END_DOCUMENT){
    				if(type==XmlPullParser.START_TAG){
    					if("name".equals(parser.getName())){
    						String name=parser.nextText();
    						weatherInfo.setName(name);
    					}else if("weather".equals(parser.getName())){
    						String weather=parser.nextText();
    						weatherInfo.setWeather(weather);
    					}else if("temp".equals(parser.getName())){
    						String temp=parser.nextText();
    						weatherInfo.setTemp(temp);
    					}else if("info".equals(parser.getName())){
    						String info=parser.nextText();
    						weatherInfo.setInfo(info);
    					}
    				}
    				type=parser.next();
    			}
    //			Toast.makeText(this, weatherInfo.toString(), 1).show();
    	        tv_info.setText(weatherInfo.toString());
    	        //根据天气类型,设置图片weatherInfo.getweather()
    	        iv_info.setImageResource(R.drawable.ic_launcher);       
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }
  • assets目录下WeatherInfo.xml(一般是在服务器获取)
<?xml version="1.0" encoding="utf-8"?>
<city id='2'>
    <name>郑州</name>
    <weather>多云</weather>
    <temp>20</temp>
    <info>请穿个大棉袄</info> 
</city>

六、Shared Preferences

在这里插入图片描述

  • 实例

在这里插入图片描述

  • 存数据

在这里插入图片描述

  • 取数据

在这里插入图片描述

习题:

Android获取到SharedPreferences对象sp后,保存数据正确的逻辑是(  sp.edit().putString("name","zhangsan").commit(); )

七、QQ登录案例

  • onCreate方法

在这里插入图片描述

  • 点击事件

在这里插入图片描述

发布了11 篇原创文章 · 获赞 3 · 访问量 291

猜你喜欢

转载自blog.csdn.net/weixin_44367041/article/details/104521497