一. 簡(jiǎn)介
成都創(chuàng)新互聯(lián)始終堅(jiān)持【策劃先行,效果至上】的經(jīng)營(yíng)理念,通過(guò)多達(dá)10年累計(jì)超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的網(wǎng)絡(luò)營(yíng)銷推廣解決方案,現(xiàn)已廣泛運(yùn)用于各行各業(yè)的客戶,其中包括:鑿毛機(jī)等企業(yè),備受客戶好評(píng)。
SQLite數(shù)據(jù)庫(kù)是一個(gè)輕量級(jí)的DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))。SQLite使用單個(gè)文件存儲(chǔ)數(shù)據(jù),Android標(biāo)準(zhǔn)庫(kù)包含SQLite庫(kù)以及配套使用的一些Java輔助類。主要特點(diǎn):輕量級(jí),單一文件,跨平臺(tái),開(kāi)源。
二. Android中SQLite數(shù)據(jù)庫(kù)的使用
1、創(chuàng)建SQLite數(shù)據(jù)庫(kù)
SQLiteDatabase db= SQLiteDatabase.openOrCreateDatabase( "/data/data/" + getPackageName() + "/test.db", null);
執(zhí)行完這條語(yǔ)句,可以在adb shell下進(jìn)入/data/data/package-name/下看到剛才創(chuàng)建的數(shù)據(jù)庫(kù)文件
在Android中使用SQLiteDatabase的靜態(tài)方法
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)打開(kāi)或者創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。
它會(huì)自動(dòng)去檢測(cè)是否存在這個(gè)數(shù)據(jù)庫(kù),如果存在則打開(kāi),反之不存在就創(chuàng)建一個(gè)數(shù)據(jù)庫(kù);創(chuàng)建成功則返回一個(gè)SQLiteDatabase對(duì)象,失敗拋出FileNotFoundException異常。
除了以上方法,Android還提供了SQLiteOpenHelper這個(gè)類來(lái)創(chuàng)建數(shù)據(jù)庫(kù),首先繼承SQLiteOpenHelper,重寫(xiě)onCreate和onUpgrade方法及構(gòu)造方法
public class MySQLiteHelper extends SQLiteOpenHelper{ public MySqliteHelper(Context context) { super(context, "mysqlite.db", null, 1); //傳入四個(gè)參數(shù) //第一個(gè)參數(shù)context 上下文對(duì)象 //第二個(gè)參數(shù)mysqlite.db 數(shù)據(jù)庫(kù)名稱(文件名) //第三個(gè)參數(shù)一般為null //第四個(gè)參數(shù)數(shù)據(jù)庫(kù)版本號(hào),這里寫(xiě)1 } @Override public void onCreate(SQLiteDatabase db) { /* 數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)候會(huì)回調(diào)此方法,可以用db對(duì)象執(zhí)行SQL語(yǔ) * 句,創(chuàng)建所需要的表 */ } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //當(dāng)數(shù)據(jù)庫(kù)升級(jí)時(shí)調(diào)用此方法 } }
接著在需要?jiǎng)?chuàng)建數(shù)據(jù)庫(kù)的時(shí)候調(diào)用
SQLiteOpenHelper dbHelper = new MySqliteHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase();
使用SQLiteOpenHelper創(chuàng)建的數(shù)據(jù)庫(kù),保存在/data/data/package-name/databases/目錄下,通過(guò)adb shell可以看到創(chuàng)建的數(shù)據(jù)庫(kù)文件
2、創(chuàng)建數(shù)據(jù)庫(kù)中的數(shù)據(jù)表
數(shù)據(jù)庫(kù)創(chuàng)建完成后,要?jiǎng)?chuàng)建保存數(shù)據(jù)的表,表是存放在數(shù)據(jù)庫(kù)中的。示例代碼入下
private void createTable(SQLiteDatabase db){ //SQL語(yǔ)句 String sql = "create table stutable(_id integer primary key autoincrement,name text,age integer)"; db.execSQL(sql); }
這里附上SQLite數(shù)據(jù)類型
NULL: 這個(gè)值可為空值
VARCHAR(n):長(zhǎng)度不固定且其最大長(zhǎng)度為 n 的字串,n不能超過(guò) 4000。
CHAR(n):長(zhǎng)度固定為n的字串,n不能超過(guò) 254。
INTEGER: 值被標(biāo)識(shí)為整數(shù),依據(jù)值的大小可以依次被存儲(chǔ)為1,2,3,4,5,6,7,8….
REAL: 所有值都是浮動(dòng)的數(shù)值,被存儲(chǔ)為8字節(jié)的IEEE浮動(dòng)標(biāo)記序號(hào).
TEXT: 值為文本字符串,使用數(shù)據(jù)庫(kù)編碼存儲(chǔ)(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB數(shù)據(jù)塊,以輸入的數(shù)據(jù)格式進(jìn)行存儲(chǔ)。如何輸入就如何存儲(chǔ),不改變格式。
DATA :包含了 年份、月份、日期
執(zhí)行完上述語(yǔ)句,可以通過(guò)ADM將數(shù)據(jù)庫(kù)文件導(dǎo)出到電腦上
通過(guò)可視化工具打開(kāi)數(shù)據(jù)庫(kù)文件可以看到之前創(chuàng)建的表,以及定義的表字段
除了執(zhí)行定義創(chuàng)建表的方法外,還可以在繼承SQLiteOpenHelper類中的onCreate方法來(lái)初始化表結(jié)構(gòu),在后面的例子使用繼承SQLiteOpenHelper方式創(chuàng)建表。
3、對(duì)表進(jìn)行操作(數(shù)據(jù)表的增刪改查)
增:在表中增加數(shù)據(jù),可以使用SQLiteDatabase類中提供的execSQL(String sql)執(zhí)行一條插入數(shù)據(jù)的SQL語(yǔ)句來(lái)插入數(shù)據(jù),不過(guò),AndroidSQLiteDatabase類提供了更為簡(jiǎn)單的方法來(lái)執(zhí)行插入數(shù)據(jù)操作
//SQLiteDatabase類中提供的方法 public long insert( String table,//要操作表名 String nullColumnHack,//空列的默認(rèn)值 ContentValues values //ContentValues封裝了列名稱和列值的Map ); private void insertToTable(SQLiteDatabase db){ ContentValues cv = new ContentValues(); cv.put("name","wxq"); cv.put("age",11); db.insert("stutable",null,cv); }
執(zhí)行insertTable方法,再次導(dǎo)出數(shù)據(jù)庫(kù)可以看到stutable表中增加了一條數(shù)據(jù)
刪:好吧,剛插入一條數(shù)據(jù)。。。
同樣Android提供了delete方法
//SQLiteDatabase類中提供的方法 public int delete( String table,//表名稱 String whereClause,//刪除條件 String[] whereArgs); //刪除條件值數(shù)組 private void deleteToTable(SQLiteDatabase db){ //刪除條件,這里以name為條件,也可以是age = ? String whereClasuse = "name = ?"; //刪除條件參數(shù), String[] whereArgs = new String[]{"wxq"}; //執(zhí)行刪除 db.delete("stutable",whereClasuse,whereArgs); }
執(zhí)行上述語(yǔ)句,將會(huì)刪除stutable表中剛才插入的數(shù)據(jù)。
改:
//SQLiteDatabase類中提供的方法 public int update( //表名稱 String table, //和行列ContentValues鍵值對(duì)應(yīng)的key-value ContentValues values, //更新條件 String whereClause, //更新條件數(shù)組 String[] whereArgs ); private void updateToTable(SQLiteDatabase db){ //實(shí)例化ContentValues ContentValues cv= new ContentValues(); cv.put("age",23); //更新條件 String whereClause = "name = ?"; //更新條件數(shù)組 String[] whereArgs = new String[]{"wxq"}; db.update("stutable",cv,whereClause,whereArgs); }
執(zhí)行完更新語(yǔ)句,導(dǎo)出數(shù)據(jù)庫(kù)文件,在可視化工具中查看
查:在Android中查詢數(shù)據(jù)是通過(guò)Cursor類來(lái)實(shí)現(xiàn)的,可以使用SQLiteDatabase.query()方法時(shí),這里使用別一個(gè)方法rawQuery
public Cursor rawQuery( String sql,//查詢的SQL語(yǔ)句 String[] selectionArgs//當(dāng)SQL語(yǔ)句中含有?,這里代表值 ); public void queryToTable(SQLiteDatabase db){ String sql = "select * from stutable";//全查 Cursor c = db.rawQuery(sql,null);//這里會(huì)返回一個(gè)Cursor(游標(biāo))對(duì)象 }
使用SQLite的一個(gè)Demo(英雄管理系統(tǒng))
主要操作數(shù)據(jù)庫(kù)的代碼
public class HeroSqliteManager { private SQLiteOpenHelper dbHelper; private SQLiteDatabase db; private static HeroSqliteManager instance; private static final String TABLE_NAME = "hero"; private static final String NAME_FIELD = "name"; private static final String ICOID_FIELD = "icoId"; private static final String ATTACK_FIELD = "attack"; private static final String DEFENSE_FIELD = "defense"; public static HeroSqliteManager getInstance() { if (instance == null) { synchronized (HeroSqliteManager.class) { if (instance == null) { instance = new HeroSqliteManager(); } } } return instance; } private HeroSqliteManager() { dbHelper = new HeroSqliteHelper(HeroApplication.getContext()); db = dbHelper.getWritableDatabase(); } /** * 插入記錄 * @param hero */ public void insertData(Hero hero) { ContentValues cv = new ContentValues(); cv.put(NAME_FIELD, hero.name); cv.put(ICOID_FIELD, hero.icoId); cv.put(ATTACK_FIELD, hero.attack); cv.put(DEFENSE_FIELD, hero.defense); db.insert(TABLE_NAME, null, cv); } /** * 刪除記錄 * @param */ public void deleteData(int id) { String whereClasuse = "_id = ?"; String[] whereArgs = new String[]{String.valueOf(id)}; db.delete(TABLE_NAME, whereClasuse, whereArgs); } /** * 修改記錄 * @param hero */ public void updateData(Hero hero) { ContentValues cv = new ContentValues(); cv.put(NAME_FIELD, hero.name); cv.put(ICOID_FIELD, hero.icoId); cv.put(ATTACK_FIELD, hero.attack); cv.put(DEFENSE_FIELD, hero.defense); String whereClasuse = "_id = ?"; String[] whereArgs = new String[]{String.valueOf(hero.id)}; db.update(TABLE_NAME, cv, whereClasuse, whereArgs); } /** * 查詢所有的英雄 * @return */ public ListselectData() { List heroList = new ArrayList<>(); Cursor c = db.rawQuery("select * from " + TABLE_NAME, null); while (c.moveToNext()) { Hero hero = new Hero(); hero.id = c.getInt(c.getColumnIndex("_id")); hero.name = c.getString(c.getColumnIndex(NAME_FIELD)); hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD)); hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD)); hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD)); heroList.add(hero); } c.close(); return heroList; } /** * 按name查詢 * @param name * @return */ public Hero selectForName(String name) { Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where name = ?", new String[]{name}); Hero hero = null; if (c.moveToNext()) { hero = new Hero(); hero.id = c.getInt(c.getColumnIndex("_id")); hero.name = c.getString(c.getColumnIndex(NAME_FIELD)); hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD)); hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD)); hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD)); } c.close(); return hero; } public void destroy() { // if (db != null) { // db.close(); // } // db = null; } }
SQLiteDemo
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。