跟我學Android之十三 SQLite數據庫操做

視頻課:https://edu.csdn.net/course/play/7621
html

本章內容android

 1 節  SQLite 數據庫概述sql

 2 節  SQLite 建庫建表shell

 3 節 管理數據庫鏈接數據庫

 4    操做數據庫數據數組

 5    數據綁定服務器

本章目標網絡

掌握 SQLite 數據的基本特色與工具使用。ide

熟練掌握 SQLite 建庫建表的方法。工具

熟練掌握鏈接 SQLite 數據庫的方法。

熟悉 SQLite 數據庫的升級與創建方法。

掌握經過數據綁定完成數據顯示的方法。

SQLite數據庫簡介

SQLite是一種很是流行的嵌入式數據庫,是由C語言編寫而成,是一款輕型關係型數據庫,支持SQL,支持多種操做系統,徹底獨立運行,沒有依賴性,Android內嵌了SQLite數據庫。 


SQLite數據庫工具是用來操做數據庫文件的工具,官方網站提供了命令行工具的下載。 


http://www.sqlite.org/download.html


下載sqlite-shell-******.zip文件

解壓縮後只有一個文件sqlite3,將sqlite3所在的路徑加入path環境變量,Sqlite3工具的使用,鏈接數據庫文件。

$ sqlite3 <數據庫文件路徑>

SQLite數據庫工具是用來操做數據庫文件的工具

uSqlite3工具的使用

Ø數據庫的相關管理命令都是以.開頭,經常使用命令以下

 

SQLite數據庫工具是用來操做數據庫文件的工具

sqlite3工具的使用,在sqlite3的命令行下能夠直接輸入標準sql語句,除了sqlite3之外,還有不少非官方的可視化管理工具

SQLite Database Browser

SQLite Expert Professional

SQLite Develope

SQLite與大型數據庫的區別

二者都是支持關係的關係型數據庫,SQLite是一個嵌入型的輕量級數據庫,適合小數據量,大型數據庫獨立運行在數據庫服務器上,適合大數據量級別,大型數據庫一般以網絡的方式對外提供服務。



建立 SQLite 數據庫 


$ sqlite3test.db


直接在命令行輸入上面的命令,若是test.db不存在,則預建立(直到執行相關sql才建立文件),若是test.db存在,則鏈接數據庫 


$ sqlite3test.db <sql.script


上述命令能夠在建立數據庫的同時使用sql.script進行初始化 


SQLite數據庫的數據類型

SQLite數據中的列能夠存儲任意數據類型的數據


爲了與其餘數據庫兼容,能夠爲字段指定默認的類型

NULL:空值

INTEGER: 帶符號的整數,具體取決於存入數字的範圍大小

REAL:浮點數,存儲爲8-bytes的浮點數

TEXT:字符串文本

BLOB:二進制對象

同時還接受以下一些類型:

smallint 16位整數

int 32位整數

float 32位浮點數

double 64位浮點數

SQLite數據庫的數據類型

爲了與其餘數據庫兼容,能夠爲字段指定默認的類型

同時還接受以下一些類型:

char(n) n不能炒做254

varchar(n) n不能超過4000

date

time

limestamp

建立SQLite數據表,經過SQL語句建立表 

create table books (id integer primary key autoincrement,name varchar(128) not null unique,author varchar(128) not null,price double not null);

建立表間關聯(也就是經過外鍵創建關係)

create table groups(id integer primary key autoincrement,name varchar(128) not null unique);crate table users(id integer primary key autoincrement,group_id integer constraint fk_users_group_id references groups(id),username varchar(128) not nullpassword varchar(128) not null);

事務控制

SQLite支持數據庫事務

sqlite> begin;sqlite> insert into ……sqlite> commit;sqlite> rollabck;

Android系統中SQLite數據庫文件的保存位置

默認狀況下,數據庫文件保存在以下目錄中:

/data/data/<應用程序包>/databases

用戶也能夠指定將文件保存在任意有權限的目錄中,一般SD卡中的目錄均可以,在Android系統中鏈接數據庫,使用SQLiteDatabase類鏈接數據庫

SQLiteDatabase  db = SQLiteDatabase.openOrCreateDatabase(dbFile, null);


經過SQLiteOpenHelper類來鏈接數據庫

public class MyHelper extends SQLiteOpenHelper {public static final int VERSION = 1;public static final String DATABASE_NAME = 「test.db」;public MyHelper(Context context) {super(context, DATABASE_NAME, null, VERSION);}}


SQLiteDatabase  db = helper.getWritableDatabase();


數據庫升級與存在性檢測,當應用升級的時候,須要檢測數據庫是否存在,或者是否要升級,SQLiteOpenHelper提供了建立與升級的能力



public MyHelper(Context context) {super(context, DATABASE_NAME, null, VERSION);}



覆蓋onCreate(SQLiteDatabase db)方法,完成建立任務





public void onCreate(SQLiteDatabase db) {String str_sql = "CREATE TABLE " + TABLE_NAME+ "(」 + ID                 + " INTEGER PRIMARY KEYAUTOINCREMENT,」+ TEXT + " text);";db.execSQL(str_sql);}



數據庫升級與存在性檢測,覆蓋onUpdate方法,完成升級任務




public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//這裏填寫數據庫升級操做的代碼}



合理關閉數據庫鏈接

再也不使用或長時間不用時,應關閉數據庫鏈接

程序退出時

程序暫停時

再也不須要操做數據庫時

使用SQLiteDatabase類中的close方法關閉鏈接




執行查詢(假設已經存在了數據庫鏈接句柄db)

在SQLiteDatabase中提供了以下方法用於查詢




execSQL




insert、insertOrThrow、insertWithOnConflict




query、rawQuery




replace、replaceOrThrow




update、updateWithOnConflict




delete





執行查詢(假設已經存在了數據庫鏈接句柄db),插入記錄示例





//將一條新記錄的各個字段內容裝入一個ContentValues對象ContentValues cv = new ContentValues();cv.put("name",user.getName());cv.put("age",user.getAge());cv.put("remark",user.getRemark());//插入一條新記錄db.insert("users",null, cv);



執行查詢(假設已經存在了數據庫鏈接句柄db)

u刪除記錄示例




//第一個參數爲表名//第二個參數表示where後的條件表達式,可使用?//第三個參數則是一個對應每個?值的數組db.delete("users", "id=?", new String[]{String.valueOf(userId)});


更新記錄示例

ContentValues cv = new ContentValues();cv.put("name", user.getName());cv.put("age", user.getAge());cv.put("remark", user.getRemark());db.update("users", cv, "id=?",new String[]{String.valueOf(userId)});

執行查詢(假設已經存在了數據庫鏈接句柄db)

u單表查詢全部記錄示例

Cursor c = db.query("users", null, null, null, null, null, "name");List<User> users = null;if(c != null) {users = new ArrayList<User>();while(c!=null && c.moveToNext()) {User u = new User();u.setId(c.getInt(0));u.setName(c.getString(1));u.setAge(c.getInt(2));u.setRemark(c.getString(3));users.add(u);}c.close();}




執行查詢(假設已經存在了數據庫鏈接句柄db)

單表條件查詢記錄示例




Cursor c = db.query(「users」,  //表名new String[]{「name」, 「age」}, //select包含的字段 「age > ?」,  //where條件表達式new String[]{「10」},  //條件值null,  //group子句null,  //having子句「name desc」 //排序字段);




執行查詢(假設已經存在了數據庫鏈接句柄db)

任意SQL條件查詢記錄示例

String sql = 「select name, age from users where age > ?」Cursor c = db.query(sqlnew String[]{「10」});


事務是確保數據庫操做原子性的保障

SQLiteDatabase提供了以下方法用於事務處理

beginTransaction 開啓事務

setTransactionSuccessful 提交事務

endTransaction 關閉事務,若是未提交事務,則自動rollback



db.beginTransaction(); //開始事務try {…… //這裏填寫數據庫操做代碼db.setTransactionSuccessful();  //提交事務} finally {db.endTransaction(); //關閉事務}

數據綁定的必要性


數據綁定是指將界面和數據進行綁定,在界面和數據之間創建綁定模式有助於數據的呈現

Adapter其實就是界面和數據之間綁定的橋樑,將視圖和數據綁定後將會下降維護數據的複雜度

SimpleCursorAdapter提供了數據層的數據綁定橋樑

SimpleCursorAdapter能夠將數據庫層的數據提供給列表

一、準備一個列表項的佈局用於ListView的展示



<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal" ><TextView android:id="@+id/nametextview「 android:layout_width="0dp「android:layout_height="40dp「 android:layout_weight="1"/><TextView android:id="@+id/agetextview「 android:layout_width="80dp"android:layout_height="40dp"/></LinearLayout>

SimpleCursorAdapter能夠將數據庫層的數據提供給列表

二、使用SimpleCursorAdapter展示數據 



ListView bookListView = (ListView)findViewById(R.id.booklist);String [] from = new String[] { "_name", "_age「 };int [] to = new int[] { R.id.nametextview, R.id.agetextview };Cursor cursor = db.rawQuery(「select * from books」, null);SimpleCursorAdapter adapter = new         SimpleCursorAdapter(MainActivity.this,                 R.layout.book_list_item, cursor, from, to, 0);bookListView.setAdapter(adapter);


修改綁定數據

有時候直接展示的數據可能不符合要求,須要轉變後展現,能夠經過SimpleCursorAdapter.ViewBinder接口來實現

修改的步驟以下:

一、編寫一個類實現SimpleCursorAdapter.ViewBinder接口

SimpleCursorAdapter.ViewBinder viewBinder = new SimpleCursorAdapter.ViewBinder() {public boolean setViewValue(View view, Cursor cursor, int columnIndex) {if(cursor.getColumnIndex("_name") == columnIndex) {TextView v = (TextView)view;v.setText("N:" + cursor.getString(columnIndex));return true;}return false;}};

修改綁定數據

修改的步驟以下:

二、使用ViewBinder修改數據

ListView bookListView = (ListView)findViewById(R.id.booklist);String [] from = new String[] { "_name", "_age「 };int [] to = new int[] { R.id.nametextview, R.id.agetextview };Cursor cursor = db.rawQuery(「select * from books」, null);SimpleCursorAdapter adapter = new         SimpleCursorAdapter(MainActivity.this,                 R.layout.book_list_item, cursor, from, to, 0);adapter.setViewBinder(viewBinder);bookListView.setAdapter(adapter);
相關文章
相關標籤/搜索