這篇文章主要介紹了SQLite數據庫怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
1.簡介
SQLite 是一個開源的嵌入式關系數據庫,實現自包容、零配置、支持事務的SQL數據庫引擎。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。 與其他數據庫管理系統不同,SQLite 的安裝和運行非常簡單,在大多數情況下 - 只要確保SQLite的二進制文件存在即可開始創建、連接和使用數據庫。如果您正在尋找一個嵌入式數據庫項目或解決方案,SQLite是絕對值得考慮。
一般的數據庫采用的是固定的靜態數據類型,SQLite采用動態數據類型,創建一個表時,可以在 CREATE TABLE 語句中指定某列的數據類型,但是你可以把任何數據類型放入任何列中。當某個值插入到數據庫時,SQLite將會檢查它的類型,如果該類型與關聯的列不匹配,SQLite則會嘗試將該值轉換成該列的類型,如果不能轉換,則該值將作為本身的類型存儲,比如可以把一個字符串(String)放入 INTEGER 列。SQLite稱這為“弱類型”。但有一個特例,如果是INTEGER PRIMARY KEY,則其他類型不會被轉換,會報一個“datatype missmatch”的錯誤。
在事務處理方面,SQLite通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味著多個進程可以在同一時間從同一數據庫讀取數據,但只有一個可以寫入數據。在某個進程或線程想數據庫執行寫操作之前,必須獲得獨占鎖。在獲得獨占鎖之后,其他的讀或寫操作將不會再發生。
此外,SQLite 不支持一些標準的 SQL 功能,特別是外鍵約束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 還有一些 ALTER TABLE 功能。
除了上述功能外,SQLite 是一個完整的 SQL 系統,擁有完整的觸發器,交易等等。
2.Android 集成了 SQLite 數據庫
Android 在運行時(run-time)集成了 SQLite,所以每個 Android 應用程序都可以使用 SQLite 數據庫。對于熟悉 SQL 的開發人員來時,在 Android 開發中使用 SQLite 相當簡單。但是,由于 JDBC 會消耗太多的系統資源,所以 JDBC 對于手機這種內存受限設備來說并不合適。因此,Android 提供了一些新的 API 來使用 SQLite 數據庫,Android 開發中,程序員需要學使用這些 API。
數據庫存儲在 data/data/<項目文件夾>/databases/ 下。
A.數據類型
1.NULL 空值
2.INTEGER 帶符號的整型
3.REAL 浮點型
4.TEXT 字符串文本
5.BLOB 二進制對象
但實際上,sqlite3也接受如下的數據類型:
smallint 16 位元的整數。
interger 32 位元的整數。
decimal(p,s) p 精確值和 s 大小的十進位整數,精確值p是指全部有幾個數(digits)大小值,s是指小數點後有幾位數。如果沒有特別指定,則系統會設為 p=5; s=0 。
float 32位元的實數。
double 64位元的實數。
char(n) n 長度的字串,n不能超過 254。
varchar(n) 長度不固定且其最大長度為 n 的字串,n不能超過 4000。
graphic(n) 和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。這個形態是為了支援兩個字元長度的字體,例如中文字。
vargraphic(n) 可變長度且其最大長度為 n 的雙字元字串,n不能超過 2000
date 包含了 年份、月份、日期。
time 包含了 小時、分鐘、秒。
timestamp 包含了 年、月、日、時、分、秒、千分之一秒。
datetime 包含日期時間格式,必須寫成'2010-08-05'不能寫為'2010-8-5',否則在讀取時會產生錯誤!
B.簡單使用
Android平臺下數據庫相關類:
SQLiteOpenHelper 抽象類:通過從此類繼承實現用戶類,來提供數據庫打開、關閉等操作函數。
SQLiteDatabase 數據庫訪問類:執行對數據庫的插入記錄、查詢記錄等操作。
SQLiteCursor 查詢結構操作類:用來訪問查詢結果中的記錄。
Activites 可以通過 Content Provider 或者 Service 訪問一個數據庫。
C.創建數據庫
Android不自動提供數據庫。在 Android 應用程序中使用 SQLite,必須自己創建數據庫,然后創建表、索引,填充數據。Android 提供了 SQLiteOpenHelper 幫助你創建一個數據庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建數據庫。
SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新數據庫使用的邏輯。SQLiteOpenHelper 的子類,至少需要實現三個方法:
package com.dandan.fm.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; /** * 可以通過SQLiteOpenHelper的以下兩個方法來或得SQLiteDatabase的對象: * getReadableDatabase() 創建或者打開一個查詢數據庫 * getWritableDatabase() 創建或者打開一個可寫數據庫 */ public class DBHelper extends SQLiteOpenHelper { /** * 構造函數,必須實現 * @param context 上下文路徑 * @param name 數據庫名稱 * @param factory 可選游標工廠,通常為NULL * @param version 當前數據庫版本號 */ public DBHelper(Context context, String name, CursorFactory factory,int version) { super(context, name, factory, version); } //數據庫第一次創建時會調用,一般在其中創建數據庫表 @Override public void onCreate(SQLiteDatabase db) { //使用execSQL()方法執行DDL語句,如果沒有異常,這個方法沒有返回值 db.execSQL("create table user(id INTEGER PRIMARY KEY AUTOINCREMENT," + "name varchar(20), address TEXT)"); } //當數據庫需要修改的時候,Android系統會主動的調用這個方法。 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //數據庫版本升級時,更新數據庫操作 } //打開數據庫時的回調函數,一般不會用 @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); } @Override public synchronized void close() { super.close(); } }
說明:
創建表和索引
db.execSQL("create table user(id INTEGER PRIMARY KEY AUTOINCREMENT," + "name varchar(20), address TEXT)");
給表添加數據
有兩種方式添加數據:
1.向上面創建表一樣,可以使用execSQL方法執行 INSERT, UPDATE, DELETE 等語句來更新表的數據。execSQL適用于 所有不需要返回結果的SQL語句。如:
db.execSQL("INSERT INTO user (name, address) VALUES ('woniu'," + "'http://http://smallwoniu.blog.51cto.com/')");
2.SQLiteDatabase 對象的 insert(), update(), delete() 方法。這些方法把 SQL 語句的一部分作為參數。如:
private SQLiteDatabase mDataBase = null; private static final String USER_TABLE = "user"; public void getDB() { //創建DBHelper對象 DBHelper db = new DBHelper(this, USER_TABLE, null, 1); //獲取可寫SQLiteDatabase mDataBase = db.getWritableDatabase(); } public void insert() { //ContentValues對象,向其中插入鍵值對,鍵是數據庫列名,值是插入到這一列的值 ContentValues cv = new ContentValues(); cv.put("name", "LiuMing"); cv.put("address", "ShangHai"); mDataBase.insert(USER_TABLE, null, cv); } public int update() { ContentValues cv = new ContentValues(); cv.put("name", "MaLi"); //第三個參數where語句,相當于sql語句中where后面的語句,?是占位符 //第四個參數是占位符的值 return mDataBase.update(USER_TABLE, cv, "id = ?", new String[]{"1"}); } public int delete() { //和udate()類似 return mDataBase.delete(USER_TABLE, "id = ? and name = ?", new String[]{"1", "MaLi"}); }
查詢數據庫
與INSERT,UPDATE,DELETE類似,有兩種方法從數據庫中查詢數據。
/** * 使用rawQuery()直接調用SELECT語句,最簡單的查詢方法 * 如果查詢是動態的,使用rawQuery就會非常復雜 * @return Cursor可以迭代查詢結果 */ public Cursor rawQuery() { return mDataBase.rawQuery("select * from user where id = ? and name = ?", new String[]{"1", "LiuMing"}); } //使用SELECT語句段構建查詢,SELECT語句內容做為query()方法的參數 public Cursor query() { String[] columns = {"name", "address"}; //第二個參數: 要查詢的列名 //第三個參數:where語句 //第三個參數:where語句中占位符的值 //第四個參數:對查詢結果進行分組 //第五個參數:對分組結果進行限制 //第六個參數:對查詢結果進行排序 return mDataBase.query(USER_TABLE, columns, "id = ?", new String[] {"1"},null, null, null); }
最后著重提及一下使用游標,不管如何執行查詢,都會返回一個Cursor,Curosr主要方法如下:
getCount(): | 獲得結果集中有多少記錄。 |
moveToFirst(): | 移動到第一行。 |
moveToNext(): | 移動到下一行,可遍歷所有記錄。 |
isAfterLast(): | 判斷是否最后一行。 |
getColumnNames(): | 返回字段名。 |
getColumnCount(): | 返回字段號。 |
getString(),getInt(): | 得到給定字段當前記錄的值。 |
requery(): | 重新執行查詢得到游標。 |
close(): | 釋放游標資源。 |
/** 查詢記事本表的所有記錄 **/ public ArrayList<HashMap<String, Object>> getWriteAllCount() { // 打開數據庫 openDatabase(); ArrayList<HashMap<String, Object>> data = null; // 接收數據 // Cursor----ResultSet:用于接收數據庫數據列表 Cursor cursor = db.query(DBInfo.Table.TB_WRITE_NAME, null, null, null,null, null, null); if (null != cursor && cursor.getCount() > 0) { data = new ArrayList<HashMap<String, Object>>(); while (cursor.moveToNext()) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("title",cursor.getString(cursor.getColumnIndex("title"))); map.put("content",cursor.getString(cursor.getColumnIndex("content"))); map.put("p_w_picpathPath",cursor.getString(cursor.getColumnIndex("p_w_picpathPath"))); map.put("time", cursor.getString(cursor.getColumnIndex("time"))); map.put("color",cursor.getString(cursor.getColumnIndex("color"))); map.put("background",cursor.getInt(cursor.getColumnIndex("background"))); map.put("lock",cursor.getInt(cursor.getColumnIndex("lock"))); data.add(map); } } cursor.close(); db.close(); // 用完記得要關閉哦 return data; }
感謝你能夠認真閱讀完這篇文章,希望小編分享的“SQLite數據庫怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。