SQLite

此篇文章参考郭霖大神的数据库系列,本篇文章写来是为了笔者对数据库的总结,如果想学习SQLite的话请参考郭霖大佬的数据库系列!

 

原生的sql语句:

一 增删改查

创建表:

create table students (id integer primary key autoicrement ,name varcha(30) not null,tel_no varcha(30) );

 

增:(指的是增加数据,在原有的结构上增加数据,不是增加列)

下面是SQLiteDatabase中的insert()方法:


public long insert(String table, String nullColumnHack, ContentValues values)

可以看到,insert方法接收三个参数,第一个参数是表名,第二个参数通常都用不到,直接传null,第三个参数则是一个封装了待存储数据的ContentValues对象。因此,比如说我们想往students表中插入一条新闻,就可以这样写:


SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "zhangsan");
values.put("tel_no", "10086");
values.put("cla_id", 1);
long id = db.insert("students", null, values);


或者:

db.execSQL("insert into students (name,tel_no,cla_id) values (?,?,?,?)", new Object[]{"zhangsan", "10086","1"});

原生:

insert into students (id,name,tel_no,cla_id) values ("3","wangwu","120","3")

 

删:

下面是SQLiteDatabase中的delete()方法:

public int delete(String table, String whereClause, String[] whereArgs)


delete()方法接收三个参数,第一个参数同样是表名,第二和第三个参数用于指定删除哪些行,对应了SQL语句中的where部分。

那么比如说我们想把students表中name为zhangsan的删掉,就可以这样写:


  db.delete("students","name=?",new String[]{"zhangsan"})

 或者:

  db.execSQL("delete from students where name=zhangsan");

原生:

delete from students where name=zhangsan

 

改:

下面是SQLiteDatabase中的update()方法:

public int update(String table, ContentValues values, String whereClause, String[] whereArgs)

那么比如说我们想把students表中id为2的记录的name改成“wangwu”,就可以这样写:

  SQLiteDatabase db = dbHelper.getWritableDatabase();
  ContentValues values = new ContentValues();
  values.put("name", "wangwu");
  db.update("news", values, "id = ?", new String[] {"2"});

或者:

  db.execSQL("update  students set name=wangwu where id=2");

原生:

update student set name="wangwu" where id=2;

 

查:

Android专门提供了一种封装好的API,使得我们不用编写SQL语句也能查询出数据,即SQLiteDatabase中的query()方法。query()提供了三个方法重载,其中参数最少的一个也有七个参数,我们来看下方法定义:

public Cursor query(String table, String[] columns, String selection,
            String[] selectionArgs, String groupBy, String having,
            String orderBy)

其中第一参数是表名,表示我们希望从哪张表中查询数据。第二个参数用于指定去查询哪几列,如果不指定则默认查询所有列。第三、第四个参数用于去约束查询某一行或某几行的数据,不指定则默认是查询所有行的数据。第五个参数用于指定需要去group by的列,不指定则表示不对查询结果进行group by操作。第六个参数用于对group by之后的数据进行进一步的过滤,不指定则表示不进行过滤。第七个参数用于指定查询结果的排序方式,不指定则表示使用默认的排序方式。

这个方法是query()方法最少的一个方法重载了,另外还有两个方法重载分别是八个和九个参数。虽说这个方法在Android数据库表查询的时候非常常用,但重多的参数让我们在理解这个方法的时候可能会很费力,另外使用起来的时候也会相当的不爽。比如说,我们想查询students表中的所有数据,就应该要这样写:
 

SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("students", null, null, null, null, null, null);

可以看到,将第一个表名参数指定成news,然后后面的六个参数我们都用不到,就全部指定成null。

 

那如果是我们想查询news表中id>3的数据该怎么写呢?代码如下所示:

 Cursor cursor= db.query("students",null,"id>?","new String[]{"5"}",null,null,null);

由于第三和第四个参数是用于指定约束条件的,所以我们在第三个参数中指明了id>?,然后在第四个参数中通过一个String数组来替换占位符,这样查到的结果就是news表中所有id>5的数据了。那么其它的几个参数呢?仍然用不到,所以还是只能传null。

然后我们可以看到,query()方法的返回值是一个Cursor对象,所有查询到的数据都是封装在这个对象中的,所以我们还需要将数据逐一从Cursor对象中取出,然后设置到students实体类当中,如下所示:

List<Student> studentList= new ArrayList<Student>();
if (cursor != null && cursor.moveToFirst()) {
    do {
        int id = cursor.getInt(cursor.getColumnIndex("id"));
        String name= cursor.getString(cursor.getColumnIndex("name"));
        String tel_no= cursor.getString(cursor.getColumnIndex("tel_no"));
        int commentCount = cursor.getInt(cursor.getColumnIndex("cla_id"));
        Student student= new Student();
        student.setId(id);
        student.setName(name);
        student.setTel(tel_no);
        student.setClass_Id(cla_id);
        studentList.add(student);
    } while (cursor.moveToNext());

cursor.close();
}

原生:

select *from students where id>2

 

二 数据库升级

来自郭神数据库系列三:

https://blog.csdn.net/guolin_blog/article/details/39151617

 

三 数据库之间的关系

 

此处来自郭霖大佬的数据库系列四

 https://blog.csdn.net/guolin_blog/article/details/39207945

表与表之间的关联关系一共有三种类型,一对一、多对一、和多对多,下面我们分别对这三种类型展开进行讨论.

一对一

表示两个表中的数据必须是一一对应的关系。这种场景其实并不是很常见,我们还是通过例子来直观地体会一下,例子仍然是在之前文章的基础上展开的。

现在我们已经创建好了news这张表,里面主要记录了新闻的标题和内容,那么除了标题和内容之外,有些新闻还可能带有一些导语和摘要,我们把这两个字段放在一张introduction表中,作为新闻的简介。那么很显然,news表和introduction表就是一对一的关系了,因为一条新闻只能对应一个简介,一个简介也只能属于一条新闻。

那么这种一对一的关系,在编程语言中该怎么体现出来呢?相信熟悉面向对象设计的你,一定很轻松就能想出来吧,只需要在News类中持有一个Introduction类的引用,然后在Introduction类中也持有一个News类的引用,这样它们之间自然就是一对一的关系了。

没错,对象之间的一对一关系非常简单易懂,那么难点就在于,如何在数据库表中建立这样的一对一关系了。由于数据库并不像面向对象的语言一样支持相互引用,如果想让两张表之间建立一对一的关系,一般就只能通过外键的方式来实现了。
 

多对一

表示一张表中的数据可以对应另一张表中的多条数据。这种场景比起一对一关系就要常见太多了,在我们平时的开发工作中多对一关系真的是比比皆是。比如说现在我们的数据库中有一个news表,还有一个comment表,它们两个之间就是典型的多对一关系,一条新闻可以有很多条评论,但是一条评论只能是属于一条新闻的。
而这种多对一的关系在编程语言中是非常容易体现出来的,比如Java中就有专门集合类,如List、Set等,使用它们的话就能轻松简单地在对象之间建立多对一的关系,我们稍后就会看到。那么,这里的难点仍然是在数据库表中如何建立这样的多对一关系。现在说难点其实已经不难了,因为前面我们已经学会了一对一关系的建立方法,而多对一也是类似的。没错,数据库表中多对一的关系仍然是通过外键来建立的,只不过一对一的时候外键加在哪一张表上都可以,但多对一的时候关键必须要加在多方的表中。

多对多

表示两张关联表中的数据都可以对应另一张表中的多条数据。这种场景也不算是很常见,但比一对一关系要稍微更加常用一些。举个例子,我们都知道新闻网站是会将新闻进行种类划分的,这样用户就可以选择自己喜欢的那一类新闻进行浏览,比如说网易新闻中就会有头条、科技、娱乐、手机等等种类。每个种类下面当然都会有许多条新闻,而一条新闻也可能是属于多个种类的,比如iPhone6发布的新闻既可以属于手机种类,也可以属于科技种类,甚至还可以上头条。因此,新闻和种类之间就是一种多对多的关系.

如此复杂的关联关系该如何表示呢?在面向对象的编程语言中一切都是那么的简单,只需要在News类中使用集合类声明拥有多个Category,然后在Category类中也使用集合类声明拥有多个News就可以了,我们稍后就会看到。而难点仍然是留在了数据库上,两张表之间如何建立多对多的关联关系呢,还是用外键吗?肯定不行了,多对多的情况只能是借助中间表来完成了。也就是说,我们需要多建立一张表,这张表没什么其它作用,就是为了存放news表和category表之间的关联关系的.
 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值