編輯:關於Android編程
本章內容
第1節 SQLite數據庫概述
第2節 SQLite建庫建表
第3節管理數據庫連接
第4節 操作數據庫數據
第5節 數據綁定
本章目標
掌握SQLite數據的基本特點與工具使用。
熟練掌握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 DevelopeSQLite與大型數據庫的區別
兩者都是支持關系的關系型數據庫,SQLite是一個嵌入型的輕量級數據庫,適合小數據量,大型數據庫獨立運行在數據庫服務器上,適合大數據量級別,大型數據庫通常以網絡的方式對外提供服務。
創建SQLite數據庫
$ sqlite3 test.db
直接在命令行輸入上面的命令,如果test.db不存在,則預創建(直到執行相關sql才創建文件),如果test.db存在,則連接數據庫
$ sqlite3 test.db
上述命令可以在創建數據庫的同時使用sql.script進行初始化
SQLite數據庫的數據類型
SQLite數據中的列可以存儲任意數據類型的數據
為了與其他數據庫兼容,可以為字段指定默認的類型
NULL:空值
INTEGER: 帶符號的整數,具體取決於存入數字的范圍大小
REAL:浮點數,存儲為8-bytes的浮點數
TEXT:字符串文本
BLOB:二進制對象
同時還接受如下一些類型:
smallint16位整數
int32位整數
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 null password 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"); Listusers = null; if(c != null) { users = new ArrayList (); 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( sql new String[]{“10”} );
事務是確保數據庫操作原子性的保障
SQLiteDatabase提供了如下方法用於事務處理
beginTransaction開啟事務
setTransactionSuccessful 提交事務
endTransaction 關閉事務,如果未提交事務,則自動rollback
db.beginTransaction(); //開始事務 try { …… //這裡填寫數據庫操作代碼 db.setTransactionSuccessful(); //提交事務 } finally { db.endTransaction(); //關閉事務 }數據綁定的必要性
數據綁定是指將界面和數據進行綁定,在界面和數據之間建立綁定模式有助於數據的呈現
Adapter其實就是界面和數據之間綁定的橋梁,將視圖和數據綁定後將會降低維護數據的復雜度
SimpleCursorAdapter提供了數據層的數據綁定橋梁
SimpleCursorAdapter可以將數據庫層的數據提供給列表
1、准備一個列表項的布局用於ListView的展現
SimpleCursorAdapter可以將數據庫層的數據提供給列表
2、使用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接口來實現
修改的步驟如下:
1、編寫一個類實現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; } };
修改綁定數據
修改的步驟如下:
2、使用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);
最近公司在項目上要使用到表情與鍵盤的切換輸入,自己實現了一個,還是存在些缺陷,比如說鍵盤與表情切
最近在研究AMS代碼遇到一個問題,在函數startActivityUncheckedLocked中 Slog.d("DDY", "!!
Android切圖注意事項 1. 切圖需要兩套分辨率的圖:480*800,720*1280。分被放在不同的文件夾中,同一張圖片,在兩個文件夾中的名字要一致。 2.
Android模擬器安裝APP出現INSTALL_FAILED_NO_MATCHING_ABIS錯誤解決方案當我們想在電腦的Android模擬器中安裝APP的