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









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