关于原理和优缺点本文暂不表述,在使用过程中也没有太多的十几意义,所以直接上操作步骤:
一:首先是在sqliteexpert中操作数据库
1.首先可以下载一个数据库的查看工具:
SQLiteExpert
下载安装
2.新建数据库
(1)file->new database->选择路径->输入数据库的名字->选择->ok
(2)左上角第一个按钮->选择路径->输入数据库的名字->选择->ok
3.新建表
(1)使用SQL创建,将窗口打开到SQL,输入语句:
creat table 表名(
列名 数据类型 列级完整性约束条件,
列名 数据类型 列级完整性约束条件,
列名 数据类型 列级完整性约束条件,
列名 数据类型 列级完整性约束条件
)
举例:
create table fruits(
_id integer primary key autoincrement,
name varchar not null,
img varchar
)
(2)使用图标创建表
4.DML语句:表的操作-添加
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')
注意点:(1)数据类型需要对应(2)数据个数要对应,(3)数据顺序要对应(4)一定要包含非空列(5)自动增列的处理:一般默认不用处理,但是遇到需要处理的时候,这样处理a。给一个不存在的数据b给一个null
//跟上面的比较而言,表名后面没有列名
//默认所有列都要插入数据,包括主键
insert into 表名 vlues (值1,值2)
举例:
insert into fruits values (null,'苹果','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')
5.DML语句:表的操作-删除
//删除所有数据
delete from fruits
//带条件的删除
delete from fruits where name='苹果'
注意:删除是针对记录而言的,就是说删除的是某一列,而不能针对某一行,所以delete和from中间不要添加任何的条件
6.DML语句:表的操作-修改更新
update 表名 set 列名1=更新值1,列名2=更新值2,列名n=更新值n 【条件】
//所有的数据的name都修改成了大苹果
update fruits set name='大苹果'
//_id是20的数据name改成了大红苹果,注意如果条件不存在,则没有数据受影响
update fruits set name='大红苹果' where _id=20
7.DML语句:表的操作-查询
查询产生的结果是一个虚拟的结果集,并不是真正的讲数据拿出来,这包括两个意思:一是查询结果是一个集合,有很多条数据构成的集合二是查询操作不会对数据库造成数据的变动
//查询所有
select * from 表名
//查询部分列
select 列名1,列名2 from 表名
select name from fruits
select img from fruits
select name ,img from fruits
//带条件的查询
select * from 表名 where 条件
select * from fruits where name='大红苹果'//注意这里的*也可以换成其他的条件*代表的是全部列,也可以用name和img或者——id替换
二:Android中SQLite的操作
1.首先认识一下SQLiteOpenHelper:安卓平台中数据库的辅助类,用于创建或者打开数据库,并且对数据库的创建和版本进行管理。
String dbPath = Environment.getExternalStorageState() + "sqlitedemo.db";
/**
*
* context this
* path 数据库名称:如果只给一个名称,那么会在项目的私有目录文件夹中创建data->com.包名->数据库文件
* 如果给了具体的位置,那么会在置顶位置创建
* factory 游标工厂,给null会有一个默认的
* version 版本号
*/
SQLiteOpenHelper helper = new SQLiteOpenHelper(this, dbPath, null, 1) {
//创建
@Override
public void onCreate(SQLiteDatabase db) {
}
//升级
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
};
//用于获取数据库对象,如果存在就打开,否则就创建
//当版本号比原来的高德时候,就会升级onUpgrade
helper.getReadableDatabase();
2.SQLiteDatabase:用于管理和操作数据库的类,基本上所有的数据库的操作都是最终通过他来完成的。而第一步的 helper.getReadableDatabase();的返回值就是一个SQLiteDatabase。所以:
//获取SQLiteDatabase 对象
SQLiteDatabase sqLiteDatabase = helper.getReadableDatabase();
SQLiteDatabase对象的操作:
rawQuery();//查询
execSQL();//增加,删除,修改,创建表
因为数据库的操作的前提是必须有数据库,没有的话就会创建数据库,所以表的创建也应该是在数据库创建的时候完成的,所以,在创建数据库的方法中使用 execSQL()方法创建表。也可以在外面创建,这个根据具体情况而定。
rawQuery();//查询
execSQL();//增加,删除,修改,创建表
3.增加数据:通过第二步就知道了,操作数据库需要用到的是SQLiteDatabase的 execSQL()。所以在得到SQLiteDatabase对象以后就可以进行添加操作了。
//获取到需要添加的值
String nameStr = inputName.getText().toString();
String imgStr = inputImg.getText().toString();
//第一种添加方法:完成编辑sql语句
String sqlStr = "insert into test_tb (name,img,type) values ('" +
nameStr + "','" + imgStr + "'," + mType +
")";
sqLiteDatabase.execSQL(sqlStr);
//第二种添加方法:用?占位,用,new String[]{}传入相应的值,这里面需要传入string类型的值,他会自动根据数据类型做相应的转化
String slqArrStr="insert into test_tb (name,img,type) values (?,?,?)";
sqLiteDatabase.execSQL(slqArrStr,new String[]{nameStr,imgStr,String.valueOf(mType)});
4查询数据,添加数据之后就可以查询数据了
//select * from 表名 where _id = ?
String querySql = "select * from test_tb";
if (mType != 0) {
querySql += " where type=" + mType;
}
//查询结果
Cursor c = sqLiteDatabase.rawQuery(querySql, null);
//关于Cursor 可以使用SimpleCursorAdapter结合listview实现,也可以转成list用recyclerview实现
if (!c.moveToFirst()) {//为空的Cursor
myAdapter.replaceData(datas);
Toast.makeText(MainActivity.this, "没有数据", Toast.LENGTH_LONG).show();
return;
}
while (c.moveToNext()) {//光标移动成功 把数据取出
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小结:这种方法跟sqlite中的语句是一样的,不过要注意的是sql语句的拼写和sqLiteDatabase对象的获取
三:Android中SQLite的操作--API操作
1.除了编写sql语句对数据库进行操作之外呢,安卓中还提供了一系列的api方法。当然这些方法也是在sqLiteDatabase这个对象中,所以我们使用api操作数据库的时候还是需要首先获取到sqLiteDatabase。sqLiteDatabase的api方法提供了基本的四个方法--增(insert)删(delete)改(update)查(query)。他们都不需要自己编写sql语句。,只需要按照参数规则填写参数就行了。
2.增insert:返回刚刚添加的数据的id
ContentValues contentValues=new ContentValues();
contentValues.put("name",nameStr);
contentValues.put("img",imgStr);
contentValues.put("type",mType);
/**
* 参数一:表名
* 参数二:可以为空的列。如果第三个参数为空或者没有数据,那么sql语句是“insert into 表名() values ()”此时在语法上是错误的。此时通过参数三制定一个可空的列,sql语句变成了“insert into 表名(可空列) values (null)”语法上是正确的。但是执行不一定能通过。所以说参数二什么时候用,用不用取决于第三个参数。
* 参数三:ContentValues--存的是键值对
*返回值: return 刚刚添加的数据的id
*/
Long insertId = sqLiteDatabase.insert("test_tb", null, contentValues);
3删除delete
/**
*参数1:表名
* 参数2:条件
* 参数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查询query
/**
*参数1:表名
* 参数2:查询的列,String[]{},null代表所有
* 参数3:条件,相当于where后面的_id=? 不需要传null
* 参数4:条件的值 ,相当于_id=3中的3,类型是string[]{} 不需要传null
* 参数5:分组,配合参数6使用。sql的语句是select count(*),type from 表名 group by type having type=2意思是查找按照type分组,并且要type=2的组,并且统计
* 参数6:当 group by对数据进行分组后,可以通过having来去除不符合条件的组
* 参数7:排序
*/
Cursor c = sqLiteDatabase.query("test_tb", null, null, null, null, null, null);
四,简单封装
1.编辑DAO的类:
public class SQLiteDemoDao {
//
private SQLiteDatabase sqLiteDatabase;
//构造方法中实例化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()});
}
/**
* 查询
*
* @param strs 长度可以变化
* @return 查询结果
*/
public Cursor getCursorData(String... strs) {
//1.查询所有(没有参数)
String sql = "select * from test_tb ";
//2.含条件查询(名字/图片/分类)(参数形式:第一个参数指明条件,第二个参数指明条件值)
if (strs.length != 0) {
sql += " where " + strs[0] + "='" + strs[1] + "'";
}
Cursor c = sqLiteDatabase.rawQuery(sql, null);
return c;
}
public ArrayList getDataInList(String... strs) {
ArrayList 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 + "");
}