SharedPreferences去保存登录的密码和状态

来源:互联网 发布:哪些软件可以赚集分宝 编辑:程序博客网 时间:2024/06/06 03:35
SharedPreferences

1.使用sp完善登录案例

package com.itheima.login;
public class MainActivity extends AppCompatActivity {
    private EditText et_name;
    private EditText et_pwd;
    private CheckBox cb_islogin;
    private SharedPreferences sp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.先找到用户名密码
        et_name = (EditText) findViewById(R.id.et_name);
        et_pwd = (EditText) findViewById(R.id.et_pwd);
        cb_islogin = (CheckBox) findViewById(R.id.cb_login);
        //2.把name 和 pwd 取出来
        sp = getSharedPreferences("config", 0); //:使用sp 系统会生成一个xml格式的文件
        //参数2:默认值 如果根据name找不到对应的值 就是使用默认值
        boolean state = sp.getBoolean("isChecked", false);
        String name = sp.getString("name", "");
        String pwd = sp.getString("pwd", "");
        if (state){
            //设置checkbox为勾选状态
            cb_islogin.setChecked(true);
            //3.设置数据 (EditText)
            et_name.setText(name);
            et_pwd.setText(pwd);
        }else{
            cb_islogin.setChecked(false);
            et_name.setText("");
            et_pwd.setText("");
        }
    }
    //1.实现按钮点击事件
    public void click(View view) {
        //1.获取用户输入的用户名和密码
        String pwd = et_pwd.getText().toString().trim();
        String name = et_name.getText().toString().trim();
       //2.判断用户名密码是否为空 如果什么也不输入 给用户友好提示
        if (TextUtils.isEmpty(name) ||TextUtils.isEmpty(pwd) ){  //如果if条件成立 就说明用户名为空
            Toast.makeText(this,"用户名或者密码为空",Toast.LENGTH_LONG).show();
        }else{
            if (cb_islogin.isChecked()){
                //说明cb已经勾选
                //3.说明用户名密码不为空 使用sp来存数据  获取sp的实例
                //3.1 获取sp的编辑器
                SharedPreferences.Editor edit = sp.edit();
                //3.2 存数据 用户名 和密码
                edit.putString("name",name);
                edit.putString("pwd",pwd);
                //3.3记录checkbox状态
                edit.putBoolean("isChecked",true);
                //3.4 调用commit方法提交数据
                edit.commit();
            }else{
                //3.5 使用sp在获取一个edit实例
                SharedPreferences.Editor edit = sp.edit();
                edit.putBoolean("isChecked",false);
                edit.commit();
            }
        }

2.xml序列化 

  
实现思路 通过程序生成一个xml文件来备份手机短信.  先获取手机短信的内容 --->通过xml备份.
  
 
String 和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。
接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。
StringBuffer sbf = new StringBuffer();  
for(int i=0;i<100;i++)
{
sbf.append(i);
}
上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。
String str = new String();  
for(int i=0;i<100;i++)
{
str = str + i;
}
在讲两者区别时,应把循环的次数搞成10000,然后用endTime-beginTime来比较两者执行的时间差异,最后还要讲讲StringBuilder与StringBuffer的区别。
String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

StringBuffer 代码如下
 
 public void click1(View view) {
        //1.创建StringBuffer实例
        StringBuffer  sb = new StringBuffer();
        //2.文档声明
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        //3.拼xml的根标签
        sb.append("<smss>");
        //4.根据短信个数  拼sms标签
        for (Sms list : lists) {
            sb.append("<sms>");
            //5.拼 address标签
            sb.append("<address>");
            sb.append(list.getAddress());
            sb.append("</address>");
            //5.拼 body标签
            sb.append("<body>");
            sb.append(list.getBody());
            sb.append("</body>");
            //6.拼 date标签
            sb.append("<date>");
            sb.append(list.getDate());
            sb.append("</date>");
            sb.append("</sms>");
        }
        //7.拼sms标签
        sb.append("</smss>");
        //8 把sb里面拼的数据取出来 生成一个xml文件就可以了  //把xml放到手机内部存储目录 //data/data/当前包名/files
        try {
            File file = new File(getFilesDir().getPath(),"smsbackup.xml");
            //9.创建文件输出流
            FileOutputStream fos = new FileOutputStream(file);
            //10.把刚刚组拼好的数据写到smsbackup文件中
            fos.write(sb.toString().getBytes());
            fos.close();
            Toast.makeText(this, "sucess", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "fail", Toast.LENGTH_SHORT).show();
        }
    }
 
通过官方提供序列化类实现xml序列化(通过程序生成一个xml)
public void click2(View view) {
        try {
            //1.获取xml 工厂
//            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            //2.通过工厂获取序列化器
//            XmlSerializer serializer = factory.newSerializer();
            //通过xml工具类来获取xml的序列化器
            XmlSerializer serializer = Xml.newSerializer();
            //3 创建一个文件对象 指定文件生成目录
            File file = new File(getFilesDir().getPath(),"smsbackup3.xml");
            //4.创建文件输出流
            FileOutputStream fos = new FileOutputStream(file);
            //5.告诉序列化器要生成一个xml文件
            serializer.setOutput(fos,"utf-8");
            //6.安装xml的语法生成xml文件  首先文档声明   参数2:生成的这个xml文件是否是独立
            serializer.startDocument("utf-8",true);
            //7.生成xml的根标签 参数1:命名空间 不带   参数2:代表标签名
            serializer.startTag(null,"smss");
            //8.循环生成sms标签
            for (Sms list : lists) {
                serializer.startTag(null,"sms");
                //9.生成body标签
                serializer.startTag(null,"body");
                serializer.text(list.getBody());
                serializer.endTag(null,"body");
                //10.生成address标签
                serializer.startTag(null,"address");
                serializer.text(list.getAddress());
                serializer.endTag(null,"address");
                //11.生成date标签
                serializer.startTag(null,"date");
                serializer.text(list.getDate());
                serializer.endTag(null,"date");
                serializer.endTag(null,"sms");
            }
           //12.生成xml根标签结束
            serializer.endTag(null,"smss");
            //13.代表文档结束
            serializer.endDocument();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

3.数据库

   
数据库 database  什么是数据库:用来存储数据的仓库.
   
软件开发中 存储数据的几种方式.  内存,文件中(.txt xml ....)   网络(百度)   数据库:当有大量相似结构的数据需要存储的时候.比如QQ用户数据 银行的用户数据.icbc 
    
数据库的分类: 网状 层次 关系化   ---->什么是关系化数据---->er模型图 --->研发一个博客系统.
    
常见的关系化数据库 
     [1]sqlserver 2000 2006 2008 微软研发
     [2]mysql 5.x之前是开源免费 6.x之后被oracle 收购了  开始收费
     [3]oracle 甲骨文   收费  
     [4]db2 ibm研发 收费 
     [5]sqlite android中内置的数据库 
     [6]hsql java框架使用的

4.mysql服务器

  
硬件(服务器就是一台高配置电脑)    软件 :电脑上安装了服务器软件 这台电脑就称之为服务器了. 
  
安装就按照我给大家的笔记装上就行了  
  
卸载:
   [1]来到控制面板卸载
   [2]来到你自己mysql的安装目录 把没有卸载干净的目录手动清除 
   [3]要来到电脑的注册表 把注册表信息也删除.

5.mysql的存储结构

    

6.sql语言

   
sql 结构化查询语言   show databases;每一句sql语句都可以单独执行 执行后就可以获取一个结果.
   
java 过程化   int i = 10; int j =20; int result = i + j;
   
sql语言是通用的 不管操作什么数据库都要使用sql语句
   
sql分类
   
   
学习步骤 1.使用sql操作数据库  2.使用sql操作表 3.使用sql操作数据


7.使用sql对数据库进行操作
   
首先安装mysql  
   
连接数据库 
 
连接数据库
* 打开cmd窗口,使用命令,连接mysql数据库
 
* 命令:mysql -uroot -p
   
查看所有的数据库
 
* 语句:show databases;
  
创建数据库
 
创建数据库
* 语句:create database 数据库的名称;
* 示例:create database hm104;
  
删除数据库
 
删除数据库
* 语句:drop database 要删除的数据库的名称;
* 示例:drop database hm103;
  数据库切换
 
* 如果想要创建一个数据库表,这个表要在一个数据库里面,所以需要切换到数据库
* 语句:use 要切换的数据库的名称;
* 示例:use hm104;
  
查看当前使用的数据库
 
查看当前使用的数据库
* 语句:select database();

8.使用sql语言操作数据库里面的表  
   创建表
 
语句: create table 表名称 (
示例:创建表 user,字段  id  username  password  sex   create table info(id int,name varchar(20),age int); 
create table info2(id 
 展示数据库中一共有多少个表
  show tables;

 mysql中数据类型 
 
1.字符串型 
VARCHAR、CHAR
当创建表时候,使用字符串类型,name varchar(40),指定数据的长度
varchar和char的区别:
varchar的长度是可变的 变长    20 zhangsan
char的长度是固定的    定长    20 zhangsan+12个空格
2.大数据类型
BLOB(存音频,视频,图片等)、TEXT(存字符类型,文本文件)
* 使用这个类型可以存储文件,一般开发,不会直接把文件存到数据库里面,存视频的路径.
3.数值型
mysql中TINYINT SMALLINTINT BIGINT FLOATDOUBLE
Java中byte    short    int long floatdouble
4.逻辑性 
BIT 占1位,1字节占8位
* 类似java里面的boolean
5.日期型
DATE:用于表示日期 1945-08-15
TIME:用于表示时间 19:10:40
 查询表的结构 
       desc + 表名称    desc info;
  mysql的约束 
 
第一种,非空约束 not null
* 表示数据不能为空
第二种,唯一性约束  unique
* 表中的记录不能重复的
第三种,主键约束  primary key
* 表示非空,唯一性
* 自动增长 auto_increment
一旦字段设置为主键,那么该字段就是非空并且唯一
删除表 
      drop + table + 表名称   drop table info;

9 使用sql操作表里面的记录
  往表里面添加记录
 
语句:insert into 要添加的表名称 values(要添加的值);
示例: insert into info values(2,'zhangsan',17);
  查询表里面的数据 
 
语句:select 要查询的字段的名称 (*) from 表名称 where 条件
示例:select id,name,age from info;  select * from info;
 修改表里面的记录
 
语句:update 表名称 set 要修改的字段的名称1=修改的值2,要修改的字段的名称2=修改的值2 where 条件
示例:update info set age = 27 where id =1;
 删除表里面的记录
 
4.4.3.删除记录 delete
语句:delete from 表名称 where 条件
示例:delete from info where id=2;  删除记录  如果不加where条件代表删除所有的
去除重复的记录
 
4.4.5.去除重复记录 distinct
语句 select distinct * from 表名; select distinct * from info;

where语句的使用 
   创建一张学生表 
 
create table student(
   查询表里面英语成绩大于 80 
 
select * from student where english > 80;
   查询表里面英语成绩是80100的学生信息
 
select * from student where english in(80,100); in里面有谁就查询谁
   查询表里面英语成绩是70,并且数学成绩是80的学生信息
 
select * from student where english = 70 and math=80;
   查询英语成绩是70~100之间的值
 
select * from student where english >= 70 and english <=100;
   模糊查询 like
 
select * from student where name like '%a%';

order by使用
      根据英语成绩 升序
 
select * from student order by english asc; 默认升序
      根据英语成绩 降序   desc
 
select * from student order by english desc;

10.sql中的函数 (聚合函数)

     统计记录数    count
 
select count(*) from student;
     算出英语成绩总和  sum 
 
select sum(math) from student;
    算出英语成绩平均分  avg   总分/数量
 
select sum(english)/count(*) from student;
select avg(english) from student;
   算出最大值  max 
 
select max(english) from student;
  算出最小值 min 
 
select min(english) from student;

11.分组操作 group by

 
1.创建订单表
create table orders (
  练习一:统计orders表里面每类商品的总的价格
 
   select name,sum(price) from orders group by name;
   练习二  对商品进行分类,得到每类商品的总价格大于66的商品  where关键字后面不可以加聚合函数
 
select name,sum(price) from orders group by name having sum(price)>66;

12.limit

   
limit  0 2. 0代表从第几条开始查   2:代表查询的个数.

13.今天总结

  1.sp的使用 ☆☆☆
  2.xml序列化 
      2.1 StringBuffer ☆☆☆
      2.2 XmlSerializer ☆☆☆ 
   3.数据库  今天最重要的sql语句 ☆☆☆ 
      
     
           

      

      
  

      
 
    
   
   
      



 
  






 
   
阅读全文
0 0
原创粉丝点击