關(guān)于原理和優(yōu)缺點(diǎn)本文暫不表述掌栅,在使用過(guò)程中也沒(méi)有太多的十幾意義谒麦,所以直接上操作步驟:
一:首先是在sqliteexpert中操作數(shù)據(jù)庫(kù)
1.首先可以下載一個(gè)數(shù)據(jù)庫(kù)的查看工具:
下載安裝
2.新建數(shù)據(jù)庫(kù)
(1)file->new database->選擇路徑->輸入數(shù)據(jù)庫(kù)的名字->選擇->ok
(2)左上角第一個(gè)按鈕->選擇路徑->輸入數(shù)據(jù)庫(kù)的名字->選擇->ok
3.新建表
(1)使用SQL創(chuàng)建樱蛤,將窗口打開(kāi)到SQL状原,輸入語(yǔ)句:
creat table 表名(
列名 數(shù)據(jù)類(lèi)型 列級(jí)完整性約束條件,
列名 數(shù)據(jù)類(lèi)型 列級(jí)完整性約束條件,
列名 數(shù)據(jù)類(lèi)型 列級(jí)完整性約束條件,
列名 數(shù)據(jù)類(lèi)型 列級(jí)完整性約束條件
)
舉例:
create table fruits(
_id integer primary key autoincrement,
name varchar not null,
img varchar
)
(2)使用圖標(biāo)創(chuàng)建表
創(chuàng)建表-表名.png
新建表.png
4.DML語(yǔ)句:表的操作-添加
insert into 表名 (列1,列2) vlues (值1,值2)
舉例:
insert into fruits (name,img) values ('香蕉','https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1597409441176&di=da6f0b1d893dc23dc1c89608100e9915&imgtype=0&src=http%3A%2F%2Fimg.yzcdn.cn%2Fupload_files%2F2015%2F06%2F06%2FFvZNxCm5eyda1t7Etz_BnO0jGyUF.jpg')
添加一條數(shù)據(jù).png
注意點(diǎn):(1)數(shù)據(jù)類(lèi)型需要對(duì)應(yīng)(2)數(shù)據(jù)個(gè)數(shù)要對(duì)應(yīng)卧檐,(3)數(shù)據(jù)順序要對(duì)應(yīng)(4)一定要包含非空列(5)自動(dòng)增列的處理:一般默認(rèn)不用處理缝呕,但是遇到需要處理的時(shí)候怠堪,這樣處理a为障。給一個(gè)不存在的數(shù)據(jù)b給一個(gè)null
//跟上面的比較而言吭从,表名后面沒(méi)有列名
//默認(rèn)所有列都要插入數(shù)據(jù)便脊,包括主鍵
insert into 表名 vlues (值1,值2)
舉例:
insert into fruits values (null,'蘋(píng)果','https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1597410334135&di=9d74180ef697ff7dbdcc154844f3c6dc&imgtype=0&src=http%3A%2F%2Ffile.youboy.com%2Fa%2F106%2F47%2F29%2F7%2F13151677s.jpg')
第二種插入數(shù)據(jù)方法.png
5.DML語(yǔ)句:表的操作-刪除
//刪除所有數(shù)據(jù)
delete from fruits
//帶條件的刪除
delete from fruits where name='蘋(píng)果'
注意:刪除是針對(duì)記錄而言的胶台,就是說(shuō)刪除的是某一列假褪,而不能針對(duì)某一行署咽,所以delete和from中間不要添加任何的條件
6.DML語(yǔ)句:表的操作-修改更新
update 表名 set 列名1=更新值1,列名2=更新值2,列名n=更新值n 【條件】
//所有的數(shù)據(jù)的name都修改成了大蘋(píng)果
update fruits set name='大蘋(píng)果'
//_id是20的數(shù)據(jù)name改成了大紅蘋(píng)果宁否,注意如果條件不存在窒升,則沒(méi)有數(shù)據(jù)受影響
update fruits set name='大紅蘋(píng)果' where _id=20
7.DML語(yǔ)句:表的操作-查詢(xún)
查詢(xún)產(chǎn)生的結(jié)果是一個(gè)虛擬的結(jié)果集,并不是真正的講數(shù)據(jù)拿出來(lái)慕匠,這包括兩個(gè)意思:一是查詢(xún)結(jié)果是一個(gè)集合饱须,有很多條數(shù)據(jù)構(gòu)成的集合二是查詢(xún)操作不會(huì)對(duì)數(shù)據(jù)庫(kù)造成數(shù)據(jù)的變動(dòng)
//查詢(xún)所有
select * from 表名
//查詢(xún)部分列
select 列名1,列名2 from 表名
select name from fruits
select img from fruits
select name ,img from fruits
//帶條件的查詢(xún)
select * from 表名 where 條件
select * from fruits where name='大紅蘋(píng)果'//注意這里的*也可以換成其他的條件*代表的是全部列,也可以用name和img或者——id替換
查詢(xún)?nèi)?png
查詢(xún)部分(img).png
查詢(xún)部分(name).png
查詢(xún)部分(name,img).png
帶條件的查詢(xún).png
二:Android中SQLite的操作
1.首先認(rèn)識(shí)一下SQLiteOpenHelper:安卓平臺(tái)中數(shù)據(jù)庫(kù)的輔助類(lèi)台谊,用于創(chuàng)建或者打開(kāi)數(shù)據(jù)庫(kù)蓉媳,并且對(duì)數(shù)據(jù)庫(kù)的創(chuàng)建和版本進(jìn)行管理。
String dbPath = Environment.getExternalStorageState() + "sqlitedemo.db";
/**
*
* context this
* path 數(shù)據(jù)庫(kù)名稱(chēng):如果只給一個(gè)名稱(chēng)锅铅,那么會(huì)在項(xiàng)目的私有目錄文件夾中創(chuàng)建data->com.包名->數(shù)據(jù)庫(kù)文件
* 如果給了具體的位置酪呻,那么會(huì)在置頂位置創(chuàng)建
* factory 游標(biāo)工廠,給null會(huì)有一個(gè)默認(rèn)的
* version 版本號(hào)
*/
SQLiteOpenHelper helper = new SQLiteOpenHelper(this, dbPath, null, 1) {
//創(chuàng)建
@Override
public void onCreate(SQLiteDatabase db) {
}
//升級(jí)
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
};
//用于獲取數(shù)據(jù)庫(kù)對(duì)象盐须,如果存在就打開(kāi)号杠,否則就創(chuàng)建
//當(dāng)版本號(hào)比原來(lái)的高德時(shí)候,就會(huì)升級(jí)onUpgrade
helper.getReadableDatabase();
2.SQLiteDatabase:用于管理和操作數(shù)據(jù)庫(kù)的類(lèi)丰歌,基本上所有的數(shù)據(jù)庫(kù)的操作都是最終通過(guò)他來(lái)完成的姨蟋。而第一步的 helper.getReadableDatabase();的返回值就是一個(gè)SQLiteDatabase。所以:
//獲取SQLiteDatabase 對(duì)象
SQLiteDatabase sqLiteDatabase = helper.getReadableDatabase();
SQLiteDatabase對(duì)象的操作:
rawQuery();//查詢(xún)
execSQL();//增加立帖,刪除眼溶,修改,創(chuàng)建表
因?yàn)閿?shù)據(jù)庫(kù)的操作的前提是必須有數(shù)據(jù)庫(kù)晓勇,沒(méi)有的話就會(huì)創(chuàng)建數(shù)據(jù)庫(kù)堂飞,所以表的創(chuàng)建也應(yīng)該是在數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)候完成的,所以绑咱,在創(chuàng)建數(shù)據(jù)庫(kù)的方法中使用 execSQL()方法創(chuàng)建表绰筛。也可以在外面創(chuàng)建,這個(gè)根據(jù)具體情況而定描融。
rawQuery();//查詢(xún)
execSQL();//增加铝噩,刪除,修改窿克,創(chuàng)建表
3.增加數(shù)據(jù):通過(guò)第二步就知道了骏庸,操作數(shù)據(jù)庫(kù)需要用到的是SQLiteDatabase的 execSQL()。所以在得到SQLiteDatabase對(duì)象以后就可以進(jìn)行添加操作了年叮。
//獲取到需要添加的值
String nameStr = inputName.getText().toString();
String imgStr = inputImg.getText().toString();
//第一種添加方法:完成編輯sql語(yǔ)句
String sqlStr = "insert into test_tb (name,img,type) values ('" +
nameStr + "','" + imgStr + "'," + mType +
")";
sqLiteDatabase.execSQL(sqlStr);
//第二種添加方法:用具被?占位,用,new String[]{}傳入相應(yīng)的值只损,這里面需要傳入string類(lèi)型的值一姿,他會(huì)自動(dòng)根據(jù)數(shù)據(jù)類(lèi)型做相應(yīng)的轉(zhuǎn)化
String slqArrStr="insert into test_tb (name,img,type) values (?,?,?)";
sqLiteDatabase.execSQL(slqArrStr,new String[]{nameStr,imgStr,String.valueOf(mType)});
4查詢(xún)數(shù)據(jù),添加數(shù)據(jù)之后就可以查詢(xún)數(shù)據(jù)了
//select * from 表名 where _id = ?
String querySql = "select * from test_tb";
if (mType != 0) {
querySql += " where type=" + mType;
}
//查詢(xún)結(jié)果
Cursor c = sqLiteDatabase.rawQuery(querySql, null);
//關(guān)于Cursor 可以使用SimpleCursorAdapter結(jié)合listview實(shí)現(xiàn),也可以轉(zhuǎn)成list用recyclerview實(shí)現(xiàn)
if (!c.moveToFirst()) {//為空的Cursor
myAdapter.replaceData(datas);
Toast.makeText(MainActivity.this, "沒(méi)有數(shù)據(jù)", Toast.LENGTH_LONG).show();
return;
}
while (c.moveToNext()) {//光標(biāo)移動(dòng)成功 把數(shù)據(jù)取出
SqliteBean sqliteBean = new SqliteBean();
sqliteBean.setId(c.getInt(c.getColumnIndex("_id")));
sqliteBean.setName(c.getString(c.getColumnIndex("name")));
sqliteBean.setImg(c.getString(c.getColumnIndex("img")));
sqliteBean.setType(c.getInt(c.getColumnIndex("type")));
datas.add(sqliteBean);
}
myAdapter.replaceData(datas);
5刪除:
//全部刪除
//delete from test_tb
//帶條件的刪除
// String delSql="delete from test_tb where _id=? ";
// sqLiteDatabase.execSQL(delSql,new String[]{String.valueOf( bean.getId())});
String delSql = "delete from test_tb where _id= " + bean.getId();
sqLiteDatabase.execSQL(delSql);
6修改
String upsql = "update test_tb set name=? , img=? where _id=?";
sqLiteDatabase.execSQL(upsql,new String[]{newName,newImg,String.valueOf(sqliteBean.getId())});
7小結(jié):這種方法跟sqlite中的語(yǔ)句是一樣的叮叹,不過(guò)要注意的是sql語(yǔ)句的拼寫(xiě)和sqLiteDatabase對(duì)象的獲取
三:Android中SQLite的操作--API操作
1.除了編寫(xiě)sql語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作之外呢艾栋,安卓中還提供了一系列的api方法。當(dāng)然這些方法也是在sqLiteDatabase這個(gè)對(duì)象中衬横,所以我們使用api操作數(shù)據(jù)庫(kù)的時(shí)候還是需要首先獲取到sqLiteDatabase裹粤。sqLiteDatabase的api方法提供了基本的四個(gè)方法--增(insert)刪(delete)改(update)查(query)终蒂。他們都不需要自己編寫(xiě)sql語(yǔ)句蜂林。,只需要按照參數(shù)規(guī)則填寫(xiě)參數(shù)就行了拇泣。
2.增insert:返回剛剛添加的數(shù)據(jù)的id
ContentValues contentValues=new ContentValues();
contentValues.put("name",nameStr);
contentValues.put("img",imgStr);
contentValues.put("type",mType);
/**
* 參數(shù)一:表名
* 參數(shù)二:可以為空的列噪叙。如果第三個(gè)參數(shù)為空或者沒(méi)有數(shù)據(jù),那么sql語(yǔ)句是“insert into 表名() values ()”此時(shí)在語(yǔ)法上是錯(cuò)誤的霉翔。此時(shí)通過(guò)參數(shù)三制定一個(gè)可空的列睁蕾,sql語(yǔ)句變成了“insert into 表名(可空列) values (null)”語(yǔ)法上是正確的。但是執(zhí)行不一定能通過(guò)债朵。所以說(shuō)參數(shù)二什么時(shí)候用子眶,用不用取決于第三個(gè)參數(shù)。
* 參數(shù)三:ContentValues--存的是鍵值對(duì)
*返回值: return 剛剛添加的數(shù)據(jù)的id
*/
Long insertId = sqLiteDatabase.insert("test_tb", null, contentValues);
3刪除delete
/**
*參數(shù)1:表名
* 參數(shù)2:條件
* 參數(shù)3:條件值
* 返回:影響了多少行
*/
int delId = sqLiteDatabase.delete("test_tb", "_id=?", new String[]{String.valueOf(bean.getId())});
4.修改update
ContentValues values = new ContentValues();
//update info_tb set 列1=xx , 列2=xxx where 列名 = 值
values.put("name",newName);
values.put("img",newImg);
values.put("type",sqliteBean.getType());
int updateId = sqLiteDatabase.update("test_tb",values,"_id=?",new String[]{String.valueOf(sqliteBean.getId())});
5查詢(xún)query
/**
*參數(shù)1:表名
* 參數(shù)2:查詢(xún)的列序芦,String[]{},null代表所有
* 參數(shù)3:條件臭杰,相當(dāng)于where后面的_id=? 不需要傳null
* 參數(shù)4:條件的值 ,相當(dāng)于_id=3中的3谚中,類(lèi)型是string[]{} 不需要傳null
* 參數(shù)5:分組渴杆,配合參數(shù)6使用。sql的語(yǔ)句是select count(*),type from 表名 group by type having type=2意思是查找按照type分組宪塔,并且要type=2的組磁奖,并且統(tǒng)計(jì)
* 參數(shù)6:當(dāng) group by對(duì)數(shù)據(jù)進(jìn)行分組后,可以通過(guò)having來(lái)去除不符合條件的組
* 參數(shù)7:排序
*/
Cursor c = sqLiteDatabase.query("test_tb", null, null, null, null, null, null);
四某筐,簡(jiǎn)單封裝
1.編輯DAO的類(lèi):
public class SQLiteDemoDao {
//
private SQLiteDatabase sqLiteDatabase;
//構(gòu)造方法中實(shí)例化SQLiteDatabase
public SQLiteDemoDao(Context context) {
String dbPath = Environment.getExternalStorageDirectory() + "/sqlitedemo.db";
SQLiteOpenHelper helper = new SQLiteOpenHelper(context, dbPath, null, 1) {
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
};
sqLiteDatabase = helper.getReadableDatabase();
}
public void addOneData(SqliteBean sqliteBean) {
String sql = "insert into test_tb (name,img,type) values(?,?,?)";
sqLiteDatabase.execSQL(sql, new Object[]{sqliteBean.getName(), sqliteBean.getImg(), sqliteBean.getType()});
}
/**
* 查詢(xún)
*
* @param strs 長(zhǎng)度可以變化
* @return 查詢(xún)結(jié)果
*/
public Cursor getCursorData(String... strs) {
//1.查詢(xún)所有(沒(méi)有參數(shù))
String sql = "select * from test_tb ";
//2.含條件查詢(xún)(名字/圖片/分類(lèi))(參數(shù)形式:第一個(gè)參數(shù)指明條件比搭,第二個(gè)參數(shù)指明條件值)
if (strs.length != 0) {
sql += " where " + strs[0] + "='" + strs[1] + "'";
}
Cursor c = sqLiteDatabase.rawQuery(sql, null);
return c;
}
public ArrayList<SqliteBean> getDataInList(String... strs) {
ArrayList<SqliteBean> list = new ArrayList<>();
Cursor c = getCursorData(strs);
while (c.moveToNext()) {
int id = c.getInt(0);
String name = c.getString(1);
String img = c.getString(2);
int type = c.getInt(3);
SqliteBean s = new SqliteBean(id, name, img, type);
list.add(s);
}
return list;
}
public void deleteData(String... strs) {
String sql = "delete from test_tb where " + strs[0] + "='" + strs[1] + "'";
sqLiteDatabase.execSQL(sql);
}
public void updateData(SqliteBean sqliteBean) {
String sql = "update test_tb set name=?,img=?,type=? where _id=?";
sqLiteDatabase.execSQL(sql, new Object[]{sqliteBean.getName(),
sqliteBean.getImg(), sqliteBean.getType(), sqliteBean.getId()});
}
}
2.初始化SQLiteDemoDao
SQLiteDemoDao sqLiteDemoDao;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
。南誊。敢辩。。弟疆。戚长。
sqLiteDemoDao = new SQLiteDemoDao(this);
}
3.增
String nameStr = inputName.getText().toString();
String imgStr = inputImg.getText().toString();
SqliteBean sqliteBean = new SqliteBean(nameStr, imgStr, mType);
sqLiteDemoDao.addOneData(sqliteBean);
4.刪
sqLiteDemoDao.deleteData("_id",String.valueOf(bean.getId()));
5改
SqliteBean sBean=new SqliteBean(newName,newImg,sqliteBean.getType());
sqLiteDemoDao.updateData(sBean);
6.查
if (mType == 0) {
datas = sqLiteDemoDao.getDataInList();
} else {
datas = sqLiteDemoDao.getDataInList("type", mType + "");
}