一、Sqlite的基础类型
二、SQLite提供的约束条件
create students (
三、外键的组成与使用
四、SQL语句的使用
①、insert语句:
insert into students(name,age) values("哈",13);
②、select语句:
1、 求个数:count
2、 求总和:sum
3、 求最大值:max
4、 求最小值:min
5、 求平均值:avg
6、字符串转化成大写:Upper()
7.、字符串转化成小写:Lower()
8、绝对值:abs()
从from 表名 开始
1、多表连接
第一种方式:(较少使用,一般使用内连接代替)
select * from classes,students where students.cls_id = classes.id
第二种方式(内连接):
语法:from 表名 inner join 表名 on 连接的条件
select * from student inner join classes on students.cls_id = classes.cls_id
第三种方式(左外连接:假设以cls_id连接,如果表一含有表二不存在的cls_id则仍然显示,并以null代替数据)
语法:from 表名 left outer join 表名 on 连接的条件。
注:SQLite只支持左外连接,和内连接。不支持右外连接。
从where 语句开始
常用操作符:
+ 、-、*、 /、> 、<、 >=、 <= 、!=等,跟平常的运算符是一致的
where cls_id < 3
常用逻辑操作符:
and(且) ,or(或)、not(非)
where cls_id between 1 and 3 表示在1~3内
where cls_id > 1 and cls_id < 3
模糊查询:
where name like "t%";//表示以t开头,%表示内容随意
where name like "%t"//表示以t结尾的字符串
从group by语句开始
作用:将数据按照某个字段分组,相同的字段内容为一组
group by cls_id //表示 以cls_id分组。
注:因为group by之后就变成了聚合数据,所以搜索的时候也只能使用聚合数据表示。
也就是不能select name from students group by cls_id,显示name字段,以为name是单个数据,不是聚合的数据。
cls_id已经被设置成了单个数据,所以还可以显示。
从having语句开始
作用:筛选group by之后的表的内容,所以是配合group by使用的。
having cls_id = 2
从order by 开始
作用:设置字段的排列顺序
order by class_id desc
标识符:
desc:大到小 asc:小到大
默认以asc排序
从limit语句开始
作用:设定数据显示的开始位置和显示的个数
limit 5 offset 2 从开始的第二位获取5条数据
③、Update语句
格式:update 表名 set 给字段赋值 where 判断选择哪条数据作为修改对象。
举例:
update students set name = "王五" where name = "张三"
④、delete语句
格式:delete from 表名 where 删除的数据的条件
举例:
delete from studends where cls_id = 1;
五、修改表
六、数据库在Android中的使用
public class StuInfoDbHelper extends SQLiteOpenHelper {
//数据库名
private static final String DB_NAME = "stuinfo.db";
//版本号
private static final int version = 1;
public StuInfoDbHelper(Context context) {
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
②、创建students与classes表public class StuInfoDbHelper extends SQLiteOpenHelper {
//命名需要创建的表名,格式为 表名+TABLE,设为公共成员变量
public static final String STUDENTS_TABLE = "students";
public static final String CLASSES_TABLE = "classes";
//命名表的字段名,格式为 表名(可缩写)+字段名+COL
public static final String STU_ID_COL = "id";
public static final String STU_NAME_COL = "name";
public static final String STU_CLS_ID_COL = "cls_id";
public static final String CLS_CLS_ID_COL = "cls_id";
public static final String CLS_STU_NUM_COL = "stu_num";
//数据库名
private static final String DB_NAME = "stuinfo.db";
//版本号
private static final int version = 1;
//创建表
private static final String CREATE_CLASSES_TABLE = "CREATE TABLE "+
CLASSES_TABLE+" ("+CLS_CLS_ID_COL+" integer primary key,"+
CLS_STU_NUM_COL+" integer not null);";
private static final String CREATE_STUDENT_TABLE = "CREATE TABLE "+
STUDENTS_TABLE+" ("+STU_ID_COL+" integer primary key increment,"+
STU_NAME_COL+" text not null,"+STU_CLS_ID_COL+" integer not null"+
"foreign key(cls_id) reference classes(cls_id));";
public StuInfoDbHelper(Context context) {
super(context, DB_NAME, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
//因为Students表中使用了外键,所以必须先声明
db.execSQL("PRAGMA foreign_keys = ON");
db.execSQL(CREATE_CLASSES_TABLE);
db.execSQL(CREATE_STUDENT_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
这样一个数据库就创建完毕了,那么怎么使用四大操作语句呢。使用删除语句
delete(String table,String whereClause,String[] whereArgs)
table:表名
whereClause:删除的条件。
whereArgs:当whereClause语句中使用了占位符(?)的时候,该参数表示,占位符的具体数值
举例:
delete(tableName,"cls_id > ? and cls_id < ?",new String[]{"1","3"})
完整的就是:where cls_id >1 and cks_id <3
使用更新语句
updateWidthOnConflict(String table,ContentValue values,String whereClause,String[] whereArgs,int conflictAlgoritm)
这个就跟刚才语句的方式一样。
一般更新语句:
update(String table,ContentValue values,String whereClause,String[] whereArgs)
使用查询语句:
Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderby,String limit)
columns:表示需要显示的字段
selection:表示where语句
selectionArgs:表示where语句的占位符。
其他参数跟普通的SQL语句一样了
那么如何使用返回的参数Cursor呢。
首先我们要知道Cursor的结构:
根据图,我们可以得知,cursor初始化光标未指向数据,然后通过特定方法获取字段的值,之后通过方法移动光标。
获取字段的值的方法:
getString(int index):index表示字段所在的位置索引。
如果不知道字段所在的位置,则使用
getColumnIndex(String columnName):根据字段名,查找字段所在的位置索引。
public class MainActivity extends AppCompatActivity {
//获取数据库
private SQLiteDatabase mDataBase;
//初始化View
private Button mBtnQuery;
private TextView mTvShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDataBase = new StuInfoDbHelper(this).getWritableDatabase();
initView();
insertData();
}
private void initView(){
mBtnQuery = (Button)findViewById(R.id.main_btn_query);
mTvShow = (TextView) findViewById(R.id.main_tv_showData);
mBtnQuery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mTvShow.setText(queryStu());
}
});
}
//插入数据
private void insertData(){
//插入Classes表
//第一种方式
ContentValues values1 = new ContentValues();
values1.put(StuInfoDbHelper.CLS_CLS_ID_COL,1);
values1.put(StuInfoDbHelper.CLS_STU_NUM_COL,30);
mDataBase.insert(StuInfoDbHelper.CLASSES_TABLE,null,values1);
//普通的方式
mDataBase.execSQL("insert into "+StuInfoDbHelper.CLASSES_TABLE+
" values(2,40);");
mDataBase.execSQL("insert into "+StuInfoDbHelper.CLASSES_TABLE+
" values(3,30);");
//插入Stu表的数据
mDataBase.execSQL("insert into "+StuInfoDbHelper.STUDENTS_TABLE+
"(name,cls_id)"+ " values('张三',1)");
mDataBase.execSQL("insert into "+StuInfoDbHelper.STUDENTS_TABLE+
"(name,cls_id)"+ " values('李四',2)");
mDataBase.execSQL("insert into "+StuInfoDbHelper.STUDENTS_TABLE+
"(name,cls_id)"+ " values('王五',3)");
}
private String queryStu(){
//查询
Cursor cursor = mDataBase.query(StuInfoDbHelper.STUDENTS_TABLE,new String[]{
StuInfoDbHelper.STU_ID_COL,StuInfoDbHelper.STU_NAME_COL,StuInfoDbHelper.STU_CLS_ID_COL
},null,null,null,null,null);
StringBuilder sb = new StringBuilder();
//循环输出
while (cursor.moveToNext()){
sb.append(cursor.getInt(0));
sb.append(cursor.getString(1));
sb.append(cursor.getInt(2)+"\n");
}
cursor.close();//记得要关闭光标
return sb.toString();
}
}
效果七、使用AS提供的Sqlite3来查询数据
八、仿AsyncTask制作数据库的加载器
public abstract class DbCommand<T> {
//创建线程池,排队执行
private static final ExecutorService THREAD_POOL = Executors.newSingleThreadExecutor();
//规定在主线程才能使用该方法(同AsyncTask)
private final Handler mHandler = new Handler();
public final void execute(){
THREAD_POOL.execute(new Runnable() {
@Override
public void run() {
//获取异步执行的数据
final T data = doInBackground();
//用Handle切换执行环境
mHandler.post(new Runnable() {
@Override
public void run() {
onPostExecute(data);
}
});
}
});
}
public abstract T doInBackground();
public abstract void onPostExecute(T data);
}