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的不同之處
主鍵自增長:SQLite是autoincrement,MySql是auto_increment
主鍵:SQLite主鍵一般定義爲_id,在做查詢時要求主鍵列名必須是_id(本身是_id,可以起別名),不然拿不到主鍵值。
- 獲取可讀數據庫、可寫數據庫的區別
可讀的數據庫也有可能可以寫,可讀的數據庫在獲取實例時有可能拿到上一次可寫的數據庫
02--創建數據庫
- 定義類繼承SQLiteOpenHelper
- 聲明構造函數,4個參數 //context 上下文對象 name 數據庫名稱 factory遊標結果集工廠,如果需要使用則需要自定義結果集工廠,null值代表使用默認結果集工廠 version 數據庫版本號,必須大於等於1
- 重寫onCreate()方法 //數據庫第一次被創建時調用該方法,這裏面主要進行對數據庫的初始化操作
- 重寫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--事務管理
- beginTransaction(): 開啓一個事務
- setTransactionSuccessful():設置事務成功標記
- 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 視圖(展示數據) : ListViewcontroller控制層(把數據展示到空間上) : 適配器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對象封裝地址,打開一個HttpURLConnection2. 設置頭信息之後獲取響應碼,如果成功返回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方式提交數據
- new Thread 開啓線程
- 獲取需要提交的數據
- 創建提交路徑
- 提交數據
- 創建url對象
- 獲取HttpUrlConnection鏈接對象
- 發送請求
- 設置網絡超時時間
- 獲取服務器返回的狀態碼
- 獲取服務器返回的數據:服務器以流的方式返回數據,用工具類轉換成String
- 開源項目方式提交數據(post)
- 創建AsyncHttpClient對象
- 準備請求體內容
- 進行post請求,封裝請求參數params