您当前的位置: 首页 >  sql

新一代螺丝工

暂无认证

  • 2浏览

    0关注

    22博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SQLite的使用和实现一个简单的数据库框架

新一代螺丝工 发布时间:2022-08-23 22:40:50 ,浏览量:2

SQLite的基本知识 SQLite常用的数据类型 字段作用char(n)固定n长度的字串varchar(n)长度不固定的字符串,n表示最大的长度nchar(n)同char,不同的是可以用来存储中文nvarchar(n)同varchar,不同的是可以用来存储中文text存储文本blob存储二进制文件int整形integer整形bigint整形float单精度类型double双精度浮点

这里intintegerbigint的具体区别,还没弄明白。如果有哪个大佬了解,请在评论区指导一下😄😄

创建和删除数据表

创建表的为语法:

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的逻辑运算符 运算符描述ANDAND 运算符允许在一个 SQL 语句的 WHERE 子句中的多个条件的存在BETWEENBETWEEN 运算符用于在给定最小值和最大值范围内的一系列值中搜索值EXISTSEXISTS 运算符用于在满足一定条件的指定表中搜索行的存在ININ 运算符用于把某个值与一系列指定列表的值进行比较NOT ININ 运算符的对立面,用于把某个值与不在一系列指定列表的值进行比较LIKELIKE 运算符用于把某个值与使用通配符运算符的相似值进行比较GLOBGLOB 运算符用于把某个值与使用通配符运算符的相似值进行比较。GLOB 与 LIKE 不同之处在于,它是大小写敏感的NOTNOT 运算符是所用的逻辑运算符的对立面。比如 NOT EXISTS、NOT BETWEEN、NOT IN,等等。它是否定运算符OROR 运算符用于结合一个 SQL 语句的 WHERE 子句中的多个条件IS NULLNULL 运算符用于把某个值与 NULL 值进行比较ISIS 运算符与 = 相似IS NOTIS NOT 运算符与 != 相似`UNIQUEUNIQUE 运算符搜索指定表中的每一行,确保唯一性(无重复) where

where用来过滤数据的,例如 select * from employee where salary >= 65000;是指查询工资高于65000的员工的数据,使用where salary >= 65000;来过滤数据

and/or

and相当于逻辑与运算,只有条件全为真时,结果才为真;or相当于逻辑或运算,只要其中一个条件为真,结果就为真。

LIKE

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 结尾的任意值 GLOB

GLOB 运算符是用来匹配通配符指定模式的文本值。如果搜索表达式与模式表达式匹配,GLOB 运算符将返回真(true),也就是 1。与 LIKE 运算符不同的是,GLOB 是大小写敏感的,对于下面的通配符,它遵循 UNIX 的语法。

  • 星号 (*)
  • 问号 (?)

星号(*)代表零个、一个或多个数字或字符。问号(?)代表一个单一的数字或字符。这些符号可以被组合使用。

语句描述WHERE SALARY GLOB ‘200*’查找以 200 开头的任意值WHERE SALARY GLOB ‘200’查找任意位置包含 200 的任意值WHERE SALARY GLOB ‘?00*’查找第二位和第三位为 00 的任意值WHERE SALARY GLOB ‘2??’查找以 2 开头,且长度至少为 3 个字符的任意值WHERE SALARY GLOB ‘*2’查找以 2 结尾的任意值WHERE SALARY GLOB ‘?2*3’查找第二位为 2,且以 3 结尾的任意值WHERE SALARY GLOB ‘2???3’查找长度为 5 位数,且以 2 开头以 3 结尾的任意值 LIMIT

子句用于限制由 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的使用
  1. 先在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作为标识符。

  1. AndroidManifest.xml中加入android:name="com.example.databaselibrary.MyApplication"

  1. 使用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             
关注
打赏
1663165755
查看更多评论
0.0700s