Android_02--SQLite数据库+ListView控件+Android网络编程+多线程断点下载

01-数据库(SQLite)特点

  •  创建数据库的表时可以不指定数据类型,例如:
CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20))
CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT,name)
  •  SQLite支持大部分标准SQL语句,增删改查语句都是通用的,分页查询语句和MySQL相同
SELECT * FROM person LIMIT 20 OFFSET 10
SELECT * FROM person LIMIT 10,20
  •  SQLite与MySql的不同之处
主键自增长:SQLiteautoincrementMySqlauto_increment
主键:SQLite主键一般定义为_id,在做查询时要求主键列名必须是_id(本身是_id,可以起别名),不然拿不到主键值。
  •  获取可读数据库、可写数据库的区别  
可读的数据库也有可能可以写,可读的数据库在获取实例时有可能拿到上一次可写的数据库  

02--创建数据库

  1. 定义类继承SQLiteOpenHelper
  2. 声明构造函数,4个参数        //context 上下文对象 name 数据库名称 factory游标结果集工厂,如果需要使用则需要自定义结果集工厂,null值代表使用默认结果集工version 数据库版本号,必须大于等于1
  3. 重写onCreate()方法 //数据库第一次被创建时调用该方法,这里面主要进行对数据库的初始化操作
  4. 重写upGrade()方法 //数据库更新的时候调用该方法

03--使用SQLiteDatabase操作数据库

  • SQLiteDatabase   该类封装了一些操作数据库的API,使用该类可以完成对数据进行添加(Create)、查询(Retrieve)、更新(Update)和删除(Delete)操作(这些操作简称为CRUD) ,和JDBC访问数据库不同,操作SQLite数据库无需加载驱动,不用获取连接,直接可以使用

  • 使用方法:获取SQLiteDatabase对象之后通过该对象直接可以执行SQL语句。封装了insert()、delete()、update()、query()四个方法也可以对数据库进行操作

  • 执行SQL语句来操作数据库使用占位符”?”来执行SQL语句能够防止SQL注入攻击;execSQL(String sql):Cursor rawQuery(String sql, String[] selectionArgs):查询(拼串方式,第二个参数传null即可)。
  •  SQLiteDataBase自带的增删改查:

insert("表名",nullColumnHack,"",contentValue)
update("表名",contentValues(更新列、值),条件,条件值),返回受影响的行数
query("表名", 查询的字段, 条件, 条件值);
delete("表名",条件,条件值),返回受影响的行数

04--事务管理

  1. beginTransaction(): 开启一个事务
  2. setTransactionSuccessful():设置事务成功标记
  3. endTransaction(): 结束事务,包括提交和回滚,需要放在finally中执行,否则事务只有到超时的时候才自动结束,会降低数据库并发效率
执行过程:使用beginTransaction开启一个事务,程序执行到endTransaction方法时会检查事务的标志是否为成功,如果程序执行到endTransaction之前调用了setTransactionSuccessful方法设置事务的标志为成功,则提交事务;如果没有调用setTransactionSuccessful方法则回滚事务。
事务对效率的提高:在批量修改数据的时候,由于事务是在进行事务提交时将要执行的SQL操作一次性打开数据库连接执行,其执行速度比逐条执行SQL语句的速度快了很多倍。因此当我们开发中遇到对数据库的批量操作那么,使用事务是提高效率的重要原则。

05--查看SQLite数据库文件

通过SQLite Expert工具 或 通过Android sqlite3工具
sqlite3.exe程序常用命令:
 sqlite3 数据库名称: 进入数据库操作模式eg: sqlite3 contacts.db
 tables:  查看所有的表 eg: .tables
 schema:  查看查看库中所有表的DDL语句 eg: .schema
 help :  查看帮助 eg: .help
 headers on/off :  显示表头,默认off  eg: headers on
 mode list|column|insert|line|tabs|tcl|csv:改变输出格式。eg: .mode column
 nullValue:  NULL空值数据显示问题eg: .nullValue NULL
 dump表名 :  生成形成表的SQL脚本eq: .dump person
 dump : 生成整个数据库的SQL脚本eq: .dump
 exit : 退出sqlite操作模式 eq: .exit

06--ListView控件  

  • 屏幕上可以展示几个控件,ListView就初始化几个,节省内存,防止内存溢出。
  • 通过使用convertView对创建的视图对象进行复用,ListView始终保持创建的对象个数为: 屏幕显示的条目的个数 + 1。
  • ListView自带ScrollView的功能,可以实现界面滚动。
  • ListView控件的设计遵循MVC设计模式:
    mode 数据模型(数据) :要被显示到ListView上的数据集合
    view 视图(展示数据) : ListView
    controller控制层(把数据展示到空间上) : 适配器Adapter

007--读取数据库的数据并显示到ListView上 

1、创建ListView展示样式布局文件,文件名为listview_item.xml 2、创建业务类操作数据库,在该工程中新创建PersonDao 3、修改main_activity.xml布局文件 4、使用并修改该工程默认的Activity类,MainActivity

MainActivity类的主要业务功能有
调用Dao获取数据库的全部数据;
获取ListView控件的实例;
自定义适配器,继承BaseAdapter,重写getCount以及getView方法  

//int getCount():用于获取要展示的数据的总条数,即ListView的总长度;view getView(int position,View convertView,ViewGroupparent)   //position:当前要显示的项在ListView的索引; convertView:就是被拖出去的View对象,getView的返回值,可以利用这个对象使得拖出去即将销毁的条目重用,即缓存对象 //代码表示 : View view =convertView==null?View.inflate(MainActivity.this,R.layout.item, null):convertView;

008--ListView常见方法

  • ListView的OnItemClickListener条目点击监听器:
实现此接口,重写的方法:条目点击事件
public void onItemClick(AdapterView<?> parent, View view, int position,long id)
//parent:就是listview对象:可以通过parent.getItemAtPosition(position);获取ListVIew适配器BaseAdapter的public Object getItem(intposition)的返回值
  • ListView定位item:listview.setselection(item索引);//这样可以定义到某个索引的item的位置
  • ListView的item条目数:listView.getCount();

009--Android网络编程

  • 访问网络的Android应用都必须加上访问互联网的权限: android.permission.INTERNET  
  •  开启子线程执行网络或者耗时的操作:         
在Android中凡是对UI的更新、“耗时”操作等都需要在子线程中进行
Android4.0以上版本求访问网络的操作不允许在主线程中执行,只能在子线程中进行,在主线程请求网络时,会报如下错误:android.os.NetworkOnMainThreadException
  • ANR异常Application Not Response,应用程序无响应。在主线程中做一些耗时的操作,阻塞了主线程,当用户点击其时,主线程无法响应,这是就会出ANR异常
  • 子线程不能修改UI:主线程也叫UI线程,Activity中的onCreate方法和点击事件的方法都是运行在主线程中的;否则会报如下错误:CalledFromWrongThreadException: Only the original thread thatcreated a view hierarchy can touch its views.
  • 子线程如果需要修改UI解决方式使用Handler实现子线程与主线程之间的通信。消息处理机制原理:所有使用UI界面的操作系统,后台都运行着一个死循环(Looper),在不停的监听和接收用户发出的指令,一旦接收指令就立即执行;
  • Handler具体用法:直接new,在主线程实例化。然后在新线程中,使用handler向主线程发送一段代码。通过handler.post(Runnable对象);向创建Handler的线程发一个runnable,重写run方法,run方法中写入需要传递的代码。run方法传递的代码,由主线程来执行。
  • Handler传输数据:主线程中创建Handler,重写handleMessage()方法。新线程中使用Handler的sendMessage方法发送消息,主线程即可收到消息,并且执行handleMessage方法。

010--案例-获取文本数据

1. 通过URL对象封装地址,打开一个HttpURLConnection
2. 设置头信息之后获取响应码,如果成功返回200即可从HttpURLConnection中获取输入流读取数据
3. 代码过长屏幕显示不全可以使用<ScrollView>进行显示
4. 需要访问网络的权限

011--案例-网页源码查看器

012--案例-新闻客户端

1. 创建一个新工程,工程名为《新闻客户端》,包名为com.itheima.news,在清单文件中添加访问网络权限。
2. 使用并编辑默认布局文件activity_main.xml,添加ListView控件
3. 在res/layout目录下创建item.xml文件,作为第二步骤中ListView的item布局文件。该布局文件采用相对布局
4. 编写一个JavaBean用于封装新闻对象。类名:News
5. 在本地tomcat的webapps目录下创建news文件夹,然后将news.xml和image文件添加到改文件夹中。查看本机的IP地址,并修改news.xml文件。然后启动tomcat
6. 使用并编辑默认MainActivity.java,在该类中实现所有方法。

013--HttpUrlConnection方式提交数据

基于http协议
  • get方式提交数据

  1. new Thread 开启线程
  2. 获取需要提交的数据
  3. 创建提交路径
  4. 提交数据
    1. 创建url对象
    2. 获取HttpUrlConnection链接对象
    3. 发送请求
    4. 设置网络超时时间
    5. 获取服务器返回的状态码
    6. 获取服务器返回的数据:服务器以流的方式返回数据,用工具类转换成String

  • 开源项目方式提交数据(post)
  1. 创建AsyncHttpClient对象
  2. 准备请求体内容
  3. 进行post请求,封装请求参数params









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章