day04_01

文件

android单元测试

Logcat

Log.v(tag,msg)

Log.d

Log.i

Log.w

Log.e

登陆案例

data/data/包名

写死路径

通过api获取私有目录路径

Context 上下文 跟当前应用相关的全局信息(获取系统的服务 获取系统提供的资源) 可以获取应用相关的私有的资源 操作系统级的调用

getFilesDir(); data/data/包名/files

openFileOutput();->FileOutputStream(文件名,访问的模式); Mode private, append , world readable world writable

openFileInput();->FileInputStream

10位二进制数表示文件的权限

每三位二进制数 代表了一种用户的权限

前三位二进制数 代表当前用户权限 rwx 111->7

中间三位二进制数 代表同组用户权限

最后三位二进制数 代表其他用户权限

adb shell

chmod 777 文件的名字

sd卡 日志

路径的获取 mnt/sdcard/

Enviroment.getExternalStorgeDirectory();

SharedPreferences 6种 int long float boolean String Set 保存软件的配置信息

获取对象 getSharedPreferences(文件名字,mode); ->sp

sp.getXXX(key,defValue);

获取编辑器 sp.edit()->Editor->putXXXX(key,value);->commit();

xml文件的形式 data/data/包名/shared_prefs/

xml的序列化 Xml.newSeralizer();<?xml version=''1.0" encoding="utf-8"?>

xml的解析 pullparser.setInput() asset

1数据库简介

什么时候使用数据库

有大量的结构相似的数据需要保存的时候 短信 联系人 聊天记录 好友的信息

常见数据库分类

网状的数据库

层次型数据库

关系型数据库 使用比较多

关系型的数据 数据可以用一个二维表来表示

①需求分析 E-R 图 entity relationship 博客的系统

常用关系型数据库产品

sql server 微软 中小型数据库产品 收费 asp.net

oracle 甲骨文 大型数据库产品 银行 通信公司 收费

db2 IBM 大型数据库

mysql 6.0之前 免费的 6.0之后 被甲骨文收购 百度 阿里 LAMP Linux Apache Mysql Php/python

SQLite android

2mysql的安装

3mysql数据存储结构

Mysql server client 当前电脑安装了mysql服务端软件 那么这台电脑就是mysql的服务器

4 sql语言简介

结构化语言 每一个单独的语句 都会返回一个结果

过程性语言 int i = 0; int j = 3; int result = i+j;

DDL (数据定义语言)

数据定义语言 - Data Definition Language

用来定义数据库的对象,如数据表、视图、索引等

DML (数据操纵语言)

数据处理语言 - Data Manipulation Language

在数据库表中更新,增加和删除记录

如 update, insert, delete

DCL (数据控制语言)

数据控制语言 – Data Control Language

指用于设置用户权限和控制事务语句

如grant,revoke,if…else,while,begin transaction

DQL (数据查询语言)

数据查询语言 – Data Query Language

select

±-------------------+

| Database |

±-------------------+

| information_schema | 保存了跟mysql相关的元数据 (meta data) 表名字 字段名字…

| mysql | 保存了mysql 的用户信息 权限相关的信息

| performance_schema | 保存了mysql再运行的时候产生的一些日志

| test | 测试的数据库

±-------------------+

前三个数据库 不要手动修改或者删除

5使用sql对数据库进行操作

1.连接数据库

mysql -u root -p 密码

2.创建数据库

create database 要创建数据库的名称;

3.查看所有的数据库

show databases; 

4.删除数据库

drop database 要删除数据库的名称;

5.切换数据库

use 要切换的数据库的名称;

6.显示当前使用的数据库

select database();

6 使用sql对表进行操作

1.创建表

create table 表名称 (

	字段 类型,

	字段 类型

)

create table info(id int,name varchar(20));

2.查看表结构

desc 表名称;

desc info;

3.删除表

drop table 要删除的表名称;

drop table info;

4.查看当前数据库所有表

show tables;

字符串型

VARCHAR variable varchar(20) zhangsan 如果输入的字段内容 没有达到声明长度的上限这个时候 只占用当前字符串长度所占的长度

CHAR CHAR(20) zhangsan 直接分配20个字节

大数据类型

BLOB、非文本类型比较长的数据

TEXT 比较长的文本

数值型

TINYINT 、 byte

SMALLINT、 short

INT、 int

BIGINT、 long

FLOAT、float

DOUBLE double

逻辑性

BIT boolean

日期型

DATE、日期

TIME、时间

DATETIME、日期和时间

TIMESTAMP 时间戳

7使用sql对表中的记录进行操作 CRUD ☆ ☆ ☆ ☆ ☆

create table info(id int,name varchar(20));

插入一条数据 insert into 表名 values (字段的值)

insert into 表名(字段名,字段名) values(对应字段的值,对应字段的值)

insert into info values(1,‘zhangsan’);

insert into info values(2,‘zhangsan’);

insert into info values(3,‘lisi’);

insert into info values(4,‘zhaosi’);

修改数据

update 表名字 set 字段名= 值 where 条件

update info set name=‘zhaosi’ where id = 3;

删除数据

delete from 表名字 where 条件;

delete from info where name = ‘zhaosi’;

delete from 表名 删除所有记录

查询

select 字段名字(* 查询所有字段) from 表名字 where 条件

select * from info;(谨慎使用) select id,name from info;

通过 distinct可以去除重复的记录

select distinct name from info;

MySQL的约束

a.非空约束  not  null

	* 表示数据不能为空

b.唯一性约束  unique

	* 表中的记录不能重复的

c.主键约束  primary key

	* 表示非空,唯一性

d. 自动增长 auto_increment

create table student(id int primary key auto_increment,name varchar(20),age int);

primary key auto_increment; 说明当前这个字段是主键(不能为空 不能重复) 并且自增长

8where条件的使用以及排序

a. 运算符 <, >,  >=,  <=   

select * from stu where android>70;

b. in 在范围内

需要注意 不是指定一个起始到结束的范围 而是具体的值

select * from stu where java in (70,90);

这句sql要查询的是 java成绩是 70分和90分的人 不是查询 >70,<90的人

c. and  条件同时满足

想要查询成绩在一个范围之内 比如>70 <90要使用and条件

select * from stu where java>=70 and java<=90;

d. like 模糊查询

select * from stu where name like ‘%si%’;

把名字中包含’si’这个字符串的结果查询出来 %可以用来替换一个字符串

对查询的结果排序

order by 默认是升序排列

select * from stu order by android;

如果要降序排列 关键字 asc(升序) desc(降序)

select * from stu order by android desc;

9聚合函数,分组查询&limit关键字

1.count()函数

select count(*) from ...where....

select count(*) from stu where android>60;

计算android成绩>60的记录有几条

2.sum()函数

select sum(要进行求和字段) from ...where.... 

select sum(android) from stu;

计算android成绩的总和

  1. avg()函数

    select avg(要计算平均数的字段名称) from …

select avg(java) from stu;

计算java成绩的平均值

  1. max()函数

    select max(字段) from…

select max(java) from stu;

计算java成绩的最高分

  1. min()函数

    select min(字段) from…

select min(java) from stu;

计算java成绩最小值

create table orders(id int, name varchar(20), price int);

insert into orders values(1,‘iphone7’,5999);

insert into orders values(2,‘iphone7’,6999);

insert into orders values(3,‘pc’,3999);

insert into orders values(4,‘pc’,2999);

insert into orders values(5,‘tv’,1999);

insert into orders values(6,‘tv’,2999);

分组查询 group by

select sum(price),name from orders group by name;

查出所有商品价格的总和 按照商品的名字进行分组

在group by后面 如果要加条件 不能使用where 而是要使用having

select sum(price),name from orders group by name having sum(price)>7000;

select * from orders limit 3; 从第一条查询结果开始显示 展示3条数据

select * from orders limit 3,3; 从第3+1条数据开始展示,展示3条数据

通过limit关键字 可以控制查询结果返回的条目数量 实现分页查询.

10jdbc简介

jdbc Java DataBase Connectivity 一套接口

通过java代码访问关系型数据库

11jdbc_helloworld

1.public void jdbcHello(){
2. //注册驱动 注册mysql驱动
3. try {
4. //DriverManager.registerDriver(new Driver());
5. //通过查看mysql Driver类的代码 发现 Driver类中有static代码块
6. //静态代码块中 包含了DriverManager.registerDriver(new Driver()); 所以只需要加载一下这个类就可以注册驱动
7. //如果再调用一次DriverManager.registerDriver(new Driver()); 相同的代码会执行两次
8. Class.forName(“com.mysql.jdbc.Driver”);
9. //mysql服务端的地址 jdbc:自协议(mysql,oracle)😕/服务端ip:端口(默认3306)/数据库的名字
10. String url =“jdbc:mysql://localhost:3306/itheima”;
11. //访问mysql服务端的用户名
12. String user = “root”;
13. //访问mysql服务端的密码
14. String password = “123”;
15. //connection代表了一个跟mysql服务端的链接
16. connection = DriverManager.getConnection(url, user, password);
17. //通过connection可以获取statement对象 这个statement可以执行sql语句
18. statement = connection.createStatement();
19. String sql = “select * from student”;
20. //通过statment执行查询语句 返回结果集
21. resultSet = statement.executeQuery(sql);
22. //调用next()方法移动光标到下一行
23. while(resultSet.next()){
24. //获取第2列的内容
25. String name = resultSet.getString(2);
26. System.out.println(name);
27. }
28. } catch (Exception e) {
29. // TODO Auto-generated catch block
30. e.printStackTrace();
31. }finally {
32. //使用完数据库释放资源
33. JDBCUtils.releaseResource(resultSet,statement,connection);
34. }
35. }

12DriverManager Connection Statement ResultSet

DriverManger 可以加载jdbc驱动 可以获取一个Connection对象

Connection 代表了一个跟关系型数据库服务端的链接 通过connection 可以获取一个statement对象

Statement 通过这个对象可以执行sql语句

executeQuery(sql);执行查询 返回结果集

executeUpdate(sql);执行更新操作 INSERT DELETE UPDATE 返回值是执行sql之后影响到的数据条目数

ResultSet :代表了执行查询之后返回的结果

里面封装了一个游标 默认游标是指向所有结果的第一条数据之前

next(); 向下移动一行; 没调用一次next游标就会指向下一行 如果没有下一行数据了 会返回false 其他情况返回true

getXXXX(列的索引); 列的索引从1开始 1对应第一列 2对应第二列

使用之后 ResultSet Statement Connection对象要立即释放掉 close方法

13 使用jdbc实现增删改查

1.@Test
2. public void jdbcInsert(){
3. try {
4. connection = JDBCUtils.getConnection();
5.// DriverManager.registerDriver(new Driver());
6.// connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/itheima”, “root”, “123”);
7. statement = connection.createStatement();
8. String sql = “insert into student values(5,‘lisi’,20)”;
9. int result = statement.executeUpdate(sql);
10. System.out.println(“插入了”+result+“条数据”);
11. } catch (Exception e) {
12. e.printStackTrace();
13. }finally {
14. JDBCUtils.releaseResource(resultSet, statement, connection);
15. }
16. }
17.
18. @Test
19. public void jdbcDelete(){
20. try {
21. DriverManager.registerDriver(new Driver());
22. connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/itheima”, “root”, “123”);
23. statement = connection.createStatement();
24. String sql = “delete from student where id = 1”;
25. int i = statement.executeUpdate(sql);
26. System.out.println(“删除了”+i+“条数据”);
27. } catch (Exception e) {
28. e.printStackTrace();
29. }finally {
30. JDBCUtils.releaseResource(resultSet, statement, connection);
31. }
32. }
33.
34. @Test
35. public void jdbcUpdate(){
36. try {
37. DriverManager.registerDriver(new Driver());
38. connection = DriverManager.getConnection(“jdbc:mysql:///itheima”, “root”, “123”);
39. statement = connection.createStatement();
40. String sql = “update student set age = 30 where name = ‘lisi’”;
41. int i = statement.executeUpdate(sql);
42. System.out.println(“修改了”+i+“条数据”);
43. } catch (Exception e) {
44. e.printStackTrace();
45. }finally {
46. JDBCUtils.releaseResource(resultSet, statement, connection);
47. }
48. }

14对jdbc进行封装

1.public class JDBCUtils {
2. private static String driver;
3. private static String url;
4. private static String username;
5. private static String password;
6.
7. static{
8. //加载配置文件信息
9. Properties properties = new Properties();
10. try {
11. properties.load(new FileInputStream(“jdbc.properties”));
12. driver = properties.getProperty(“driver”);
13. url = properties.getProperty(“url”);
14. username = properties.getProperty(“username”);
15. password = properties.getProperty(“password”);
16. } catch (Exception e) {
17. // TODO Auto-generated catch block
18. e.printStackTrace();
19. }
20. }
21.
22. /**
23. * 释放资源的工具方法
24. * @param resultSet 结果集
25. * @param statement
26. * @param connection 链接
27. /
28. public static void releaseResource(ResultSet resultSet, Statement statement, Connection connection) {
29. try {
30. if(resultSet!=null){
31. resultSet.close();
32. }
33. } catch (SQLException e) {
34. e.printStackTrace();
35. }
36. try {
37. if(statement!=null){
38. statement.close();
39. }
40. } catch (SQLException e) {
41. e.printStackTrace();
42. }
43. try {
44. if(connection!=null){
45. connection.close();
46. }
47. } catch (SQLException e) {
48. e.printStackTrace();
49. }
50. }
51.
52. /
*
53. * 从配置文件中获取链接信息 简介到mysql服务端返回一个connection对象
54. * @return 代表链接的connection 对象
55. */
56. public static Connection getConnection() {
57. try {
58. Class.forName(driver);
59. Connection connection = DriverManager.getConnection(url,username,password);
60. return connection;
61. } catch (Exception e) {
62. e.printStackTrace();
63. return null;
64. }
65. }
66.}

15用户登录数据库逻辑演示

16sql注入与预防

1.public class LoginDemo {
2. public static void main(String[] args) {
3. boolean isLogin = login(“zhangsan’ or ‘11", “asdfadsf”);
4.// boolean isLogin = login(“zhangsan”, “123”);
5. System.out.println(isLogin?“登陆成功”:“登陆失败”);
6. }
7.
8. public static boolean login(String username,String password){
9. //获取链接
10. Connection connection = JDBCUtils.getConnection();
11. Statement statement = null;
12. try {
13. statement = connection.createStatement();
14. String sql = “select id from users where username =? and password = ?”;
15. PreparedStatement preparedStatement = connection.prepareStatement(sql);
16. //第一个? 用username去替换
17. preparedStatement.setString(1, username);
18. //第二个? 用password去替换
19. preparedStatement.setString(2, password);
20. ResultSet resultSet = preparedStatement.executeQuery();
21. //“select id from users where name =‘zhangsan’ and password = ‘123’”;
22. //"select id from users where name =‘zhangsan’ or '1
1’ and password = ‘asdfadsf’”;
23. //String sql = “select id from users where username = '”+username+"’ and password = ‘"+password+"’";
24. //ResultSet resultSet = statement.executeQuery(sql);
25. //通过preparedStatement处理后变成了 select id from users where username =‘zhangsan’ or ‘1==1’ and password = ‘asdfadsf’
26. return resultSet.next();
27. } catch (SQLException e) {
28. e.printStackTrace();
29. return false;
30. }
31. }
32.}

排错过程:

① FATAL EXCEPTION: main 致命异常

②找到 caused by 类型转换异常 **** cannot be cast to ***** 一种类型不能被转换成另一种类型

Caused by: java.lang.ClassCastException: android.widget.EditText cannot be cast to android.widget.ImageView

③找到跟当前应用包名相同的信息 知道哪一行出错

at com.itheima.logindemo.MainActivity.onCreate(MainActivity.java:32) 这里说明是MainActivity 32行有错误

debug 两种方法

① 需要加断点的地方记上断点

② 右键debug as android Application

方法二

① 需要加断点的地方记上断点

②ddms device选项卡选中某个进程 点绿虫子

View

看得见

EidtText

TextView

checkBox

Button

看不见的 ViewGroup

LinearLayout RelativeLayout FrameLayout

通用的属性

layout_width

layout_height

layout_margin 上下左右 margin值是一样的

(Left(左), Top(上),Right(右),Bottom(下) start(开始) end(结束)) 外边距

padding 上下左右padding值是一样的

(Left(左), Top(上),Right(右),Bottom(下) start(开始) end(结束));内边距

LinearLayout

orietation 布局的方向 vertical 垂直的 horizontal横的

layout_weight 权重 可以把屏幕按照一定比例分配宽度(orietation= horizontal)(高度 vertical)

android:layout_gravity 当前的控件在父容器中的位置

gravity 控制内容

ReletiveLayout

控制当前的控件针对其他控件的相对位置 后面接控件的id

toleftof 在XXX控件的左边

toRightOf 在XXX控件的右边

above 在XXX控件的上边

below 在XXX控件的下边

针对某个控件的 左上右下进行对其 接控件的id

针对父容器的上右下开始结束左边 传 true false;

在父容器的中间

在父容器中水平居中

在父容器中垂直居中

FrameLayout

layout_gravity 只有这个起作用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值