n
长度的字串varchar(n)长度不固定的字符串,n
表示最大的长度nchar(n)同char,不同的是可以用来存储中文nvarchar(n)同varchar,不同的是可以用来存储中文text存储文本blob存储二进制文件int整形integer整形bigint整形float单精度类型double双精度浮点
这里int
、integer
、bigint
的具体区别,还没弄明白。如果有哪个大佬了解,请在评论区指导一下😄😄
创建表的为语法:
create table database_name.table_name(
column1 datatype primary key(one or more columns),
column2 datatype,
column3 datatype,
.....
columnN datatype,
);
删除数据表的语法为
drop table database_name.table_name;
插入数据
插入数据表的语法为:
insert into table_name [(column1, column2, column3,...columnN)]
values (value1, value2, value3,...valueN);
或
//注意:这种方式要确保值的顺序与列在表中的顺序一致
insert into table_name values (value1,value2,value3,...valueN);
删除数据
删除数据的语法为:
delete from table_name [条件];
如果没有删除数据的条件,默认删除所有数据;如果指定了条件,则删除符合条件的 数据
更新数据语法为:
update table_name
set column1 = value1, column2 = value2...., columnN = valueN [条件];
查询数据
语法为:
//查询指定字段(列)的值
SELECT column1, column2, columnN FROM table_name;
或
//查询所有字段的值
SELECT * FROM table_name;
SQLite的逻辑运算符
运算符描述AND
AND 运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在BETWEEN
BETWEEN 运算符用于在给定最小值和最大值范围内的一系列值中搜索值EXISTS
EXISTS 运算符用于在满足一定条件的指定表中搜索行的存在IN
IN 运算符用于把某个值与一系列指定列表的值进行比较NOT IN
IN 运算符的对立面,用于把某个值与不在一系列指定列表的值进行比较LIKE
LIKE 运算符用于把某个值与使用通配符运算符的相似值进行比较GLOB
GLOB 运算符用于把某个值与使用通配符运算符的相似值进行比较。GLOB 与 LIKE 不同之处在于,它是大小写敏感的NOT
NOT 运算符是所用的逻辑运算符的对立面。比如 NOT EXISTS、NOT BETWEEN、NOT IN,等等。它是否定运算符OR
OR 运算符用于结合一个 SQL 语句的 WHERE 子句中的多个条件IS NULL
NULL 运算符用于把某个值与 NULL 值进行比较IS
IS 运算符与 = 相似IS NOT
IS NOT
运算符与 != 相似`UNIQUE
UNIQUE 运算符搜索指定表中的每一行,确保唯一性(无重复)
where
where
用来过滤数据的,例如 select * from employee where salary >= 65000;
是指查询工资高于65000的员工的数据,使用where salary >= 65000;
来过滤数据
and
相当于逻辑与运算,只有条件全为真时,结果才为真;or
相当于逻辑或运算,只要其中一个条件为真,结果就为真。
LIKE
运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,LIKE 运算符将返回真(true),也就是 1。这里有两个通配符与 LIKE 运算符一起使用:
- 百分号 (%)
- 下划线 (_)
百分号(%)
代表零个、一个或多个数字或字符。下划线(_)
代表一个单一的数字或字符。这些符号可以被组合使用。
下面一些实例演示了 带有 ‘%’ 和 ‘_’ 运算符的 LIKE 子句不同的地方:
语句描述WHERE SALARY LIKE ‘200%’查找以 200 开头的任意值WHERE SALARY LIKE ‘%200%’查找任意位置包含 200 的任意值WHERE SALARY LIKE ‘_00%’查找第二位和第三位为 00 的任意值WHERE SALARY LIKE ‘2_%_%’查找以 2 开头,且长度至少为 3 个字符的任意值WHERE SALARY LIKE ‘%2’查找以 2 结尾的任意值WHERE SALARY LIKE ‘_2%3’查找第二位为 2,且以 3 结尾的任意值WHERE SALARY LIKE ‘2___3’查找长度为 5 位数,且以 2 开头以 3 结尾的任意值 GLOBGLOB
运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,GLOB
运算符将返回真(true),也就是 1。与 LIKE
运算符不同的是,GLOB
是大小写敏感的,对于下面的通配符,它遵循 UNIX 的语法。
- 星号 (*)
- 问号 (?)
星号(*)
代表零个、一个或多个数字或字符。问号(?)
代表一个单一的数字或字符。这些符号可以被组合使用。
子句用于限制由 SELECT 语句返回的数据数量
ORDER BY子句是用来基于一个或多个列按升序或降序顺序排列数据。
ORDER BY 子句的基本语法如下:
SELECT column-list
FROM table_name
[WHERE condition]
[ORDER BY column1, column2, .. columnN] [ASC | DESC];//ASC升序排序,DESC降序排序
GROUP BY
子句用于与 SELECT 语句一起使用,来对相同的数据进行分组。 在 SELECT 语句中,GROUP BY 子句放在 WHERE 子句之后,放在 ORDER BY 子句之前
HAVING子句允许指定条件来过滤将出现在最终结果中的分组结果。 WHERE 子句在所选列上设置条件,而 HAVING 子句则在由 GROUP BY 子句创建的分组上设置条件。
DISTINCT关键字与 SELECT 语句一起使用,来消除所有重复的记录,并只获取唯一一次记录。 有可能出现一种情况,在一个表中有多个重复的记录。当提取这样的记录时,DISTINCT 关键字就显得特别有意义,它只获取唯一一次记录,而不是获取重复记录。
select distinct name from company;
创建数据库
操作数据库,要使用SQLiteOpenHelper,由于SQLiteOpenHelper是抽象类,使用要实现它,并重写它的 onCreate(), onUpgrade()方法
public class MyDatabase extends SQLiteOpenHelper {
//创建表
public static final String CreateTable_my="create Table user(" +
"id primary key, name text, sex text , age integer, password text)";
Context myContext;
/**
*
* @param context
* @param name 创建数据库的名字
* @param factory 用于返回自定义的Cursor,一般填null
* @param version 表示当前数据库的版本号,可用于对数据库进行升级
*/
public Mydatabase(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
myContext=context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CreateTable_my);//创建表
Toast.makeText(myContext, "数据表创建成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
创建MyDatabase的对象
//first.db是数据库名
private Mydatabase base=new Mydatabase(DatabaseActivity.this,"first.db",null,1);
生成数据库(会在/data/data//databases/
目录下建立数据库)
base.getWritableDatabase();
//或者
base.getReadableDatabase()
两个方法的不同处: getWritableDatabase()
返回一个可对数据库进行读写操作的对象,会抛出异常 getReadableDatabase()
返回一个以只读方法打开的数据库,不会抛出异常
public class Mydatabase extends SQLiteOpenHelper {
//用户表
public static final String CreateTable_user="create Table user(" +
"id primary key, name text, sex text , age integer, password text)";
//创建另一个表,班级表
public static final String CreateTable_me="create Table clazz(" +
"id primary key, className text, teacher text)";
Context myContext;
/**
*
* @param context
* @param name 创建数据库的名字
* @param factory 用于返回自定义的Cursor,一般填null
* @param version 表示当前数据库的版本号,可用于对数据库进行升级
*/
public Mydatabase(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
myContext=context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CreateTable_user);
sqLiteDatabase.execSQL(CreateTable_me);
Toast.makeText(myContext, "数据库创建成功", Toast.LENGTH_SHORT).show();
}
//当 version 中的值改变时,会调用这个方法,通过这个方法,删除原来的表,再调用onCreate()方法生成两个表
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists user");
sqLiteDatabase.execSQL("drop table if exists clazz");
onCreate(sqLiteDatabase);
Toast.makeText(myContext, "成功", Toast.LENGTH_SHORT).show();
}
}
操作表
- 添加数据
//通过getWritableDatabase()获取SQLiteOpenHelper来操作数据库
SQLiteDatabase database= base.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name","小明");
values.put("sex","男");
values.put("password","12hjfgikldgislk");
values.put("age",18);
//参数 1.表的名字 2.用于未指定添加数据的情况下给某些可为空的列自动赋值NULL
//3. ContentValues 对象
database.insert("user",null,values);
- 更新数据
SQLiteDatabase database= base.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name","小军");
//后面的两个参数是操作的限制条件
database.update("user",values,"age=?",new String[]{"18"});
- 删除数据
SQLiteDatabase database= base.getWritableDatabase();
//后面的两个参数是操作的限制条件,用来约束删除哪几行,如果不指定就删除所有行
database.delete("user",null,null);
- 查询数据
SQLiteDatabase database=base.getWritableDatabase();
Cursor cursor= database.query("user",null,null,null,null,null,null);
if (cursor.moveToFirst()){
do{
Log.d("name:",cursor.getString(cursor.getColumnIndex("name")));
Log.d("age:",cursor.getString(cursor.getColumnIndex("age")));
Log.d("sex:",cursor.getString(cursor.getColumnIndex("sex")));
Log.d("password:",cursor.getString(cursor.getColumnIndex("password")));
}while (cursor.moveToNext());
}
cursor.close();
query的参数如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0w5vx6vm-1661265612216)(https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/6/9/16b3cc545772bec2~tplv-t2oaga2asx-image.image)]
- 使用sql直接对数据库进行操作
SQLiteDatabase database=base.getWritableDatabase();
database.execSQL();
database.rawQuery();//只有查询数据的时候才调用这个方法
仿照LitePal
实现一个简易的数据库框架SimpleDatabase
SimpleDatabase
的使用
- 先在
asset
文件中创建my_database.xml
my_database.xml
如下:
Employee
的源码如下
public class Employee {
private int id;
private String name;
private char sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
@Override
public String toString() {
//使用id作为员工的唯一标识
return Integer.toString(id);
}
}
注意:SimpleDatabase
通过toString
来区别两个对象是否为同一对象,如Employee
就使用id
作为标识符。
- 在
AndroidManifest.xml
中加入android:name="com.example.databaselibrary.MyApplication"
- 使用
SimpleDatabase
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
SimpleDatabase.newInstance().create();//初始化
Employee employee =new Employee();
employee.setId(1);
employee.setName("a");
employee.setSex('男');
SimpleDatabase.saveAndUpdate(employee);
Employee employee1 =new Employee();
employee1.setId(2);
employee1.setName("b");
employee1.setSex('男');
SimpleDatabase.saveAndUpdate(employee1);
Employee employee2 =new Employee();
employee2.setId(3);
employee2.setName("c");
employee2.setSex('女');
SimpleDatabase.saveAndUpdate(employee2);
List l=SimpleDatabase.select(Employee.class,null,null,null,null,null,null);
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?