Android数据库SQLite表内设置外键

Android数据库SQLite表内设置外键

介绍

Android默认的数据是SQLite,但SQLite3.6.19之前(在2.2版本中使用的是3.6.22,因此如果你的应用只兼容到2.2版本就可以放心使用外键功能)是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图。

现有两张表

  • Employees
  • Dept

视图

ViewEmps:显示雇员信息和他所在的部门

创建数据库

自定义一个辅助类继承SQLiteOpenHelper类.

  1. onCreate(SQLiteDatabase db): 当数据库被创建的时候,能够生成表,并创建视图跟触发器。
  2. onUpgrade(SQLiteDatabse db, int oldVersion, int newVersion): 更新的时候可以删除表和创建新的表。

代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

public class DatabaseHelper extends SQLiteOpenHelper {

static final String dbName="demoDB";

static final String employeeTable="Employees";

static final String colID="EmployeeID";

static final String colName="EmployeeName";

static final String colAge="Age";

static final String colDept="Dept";

static final String deptTable="Dept";

static final String colDeptID="DeptID";

static final String colDeptName="DeptName";

static final String viewEmps="ViewEmps";

public DatabaseHelper(Context context) {

super(context, dbName, null,33);

}

// 创建库中的表,视图和触发器

public void onCreate(SQLiteDatabase db) {

db.execSQL("CREATE TABLE "+deptTable+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+

colDeptName+ " TEXT)");

db.execSQL("CREATE TABLE "+employeeTable+"

("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+

colName+" TEXT, "+colAge+" Integer, "+colDept+"

INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES

"+deptTable+" ("+colDeptID+"));");

//创建触发器

db.execSQL("CREATE TRIGGER fk_empdept_deptid " +

" BEFORE INSERT "+

" ON "+employeeTable+

" FOR EACH ROW BEGIN"+

" SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+deptTable+"

WHERE "+colDeptID+"=new."+colDept+" ) IS NULL)"+

" THEN RAISE (ABORT,‘Foreign Key Violation‘) END;"+

"  END;");

//创建视图

db.execSQL("CREATE VIEW "+viewEmps+

" AS SELECT "+employeeTable+"."+colID+" AS _id,"+

" "+employeeTable+"."+colName+","+

" "+employeeTable+"."+colAge+","+

" "+deptTable+"."+colDeptName+""+

" FROM "+employeeTable+" JOIN "+deptTable+

" ON "+employeeTable+"."+colDept+" ="+deptTable+"."+colDeptID

);

}

// 更新库中的表

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

db.execSQL("DROP TABLE IF EXISTS "+employeeTable);

db.execSQL("DROP TABLE IF EXISTS "+deptTable);

db.execSQL("DROP TRIGGER IF EXISTS fk_empdept_deptid");

db.execSQL("DROP VIEW IF EXISTS "+viewEmps);

onCreate(db);

}

}

加入数据

1

2

3

4

5

6

7

8

9

10

11

SQLiteDatabase
db=this.getWritableDatabase();

ContentValues
cv=new
ContentValues();

cv.put(colDeptID,
1);

cv.put(colDeptName,
"Sales");

db.insert(deptTable,
colDeptID,
cv);

cv.put(colDeptID,
2);

cv.put(colDeptName,
"IT");

db.insert(deptTable,
colDeptID,
cv);

db.close();

更新数据

1

2

3

4

5

6

7

8

9

10

11

public int UpdateEmp(Employee emp)

{

SQLiteDatabase db=this.getWritableDatabase();

ContentValues cv=new ContentValues();

cv.put(colName, emp.getName());

cv.put(colAge, emp.getAge());

cv.put(colDept, emp.getDept());

return db.update(employeeTable, cv, colID+"=?",

new String []{String.valueOf(emp.getID())});

}

删除数据

1

2

3

4

5

6

7

public
void
DeleteEmp(Employee
emp)

{

SQLiteDatabase
db=this.getWritableDatabase();

db.delete(employeeTable,colID+"=?",
new
String
[]
{String.valueOf(emp.getID())});

db.close();

}

取得所有部门信息

1

2

3

4

5

6

7

8

9

Cursor getAllDepts()

{

SQLiteDatabase db=this.getReadableDatabase();

Cursor cur=db.rawQuery("SELECT "+colDeptID+" as _id,

"+colDeptName+" from "+deptTable,new String [] {});

return cur;

}

取得部门内雇员信息

1

2

3

4

5

6

7

8

9

public
Cursor
getEmpByDept(String
Dept)

{

SQLiteDatabase
db=this.getReadableDatabase();

String
[]
columns=new
String[]{"_id",colName,colAge,colDeptName};

Cursor
c=db.query(viewEmps,
columns,
colDeptName+"=?",

new
String[]{Dept},
null,
null,
null);

return
c;

}

取得部门ID

1

2

3

4

5

6

7

8

9

10

11

public
int
GetDeptID(String
Dept)

{

SQLiteDatabase
db=this.getReadableDatabase();

Cursor
c=db.query(deptTable,
new
String[]{colDeptID+"
as _id",colDeptName},

colDeptName+"=?",
new
String[]{Dept},
null,
null,
null);

//Cursor c=db.rawQuery("SELECT "+colDeptID+" as _id FROM "+deptTable+"

//WHERE "+colDeptName+"=?", new String []{Dept});

c.moveToFirst();

return
c.getInt(c.getColumnIndex("_id"));

}

上面部门和雇员信息的表因为实现的关联,所以更新和删除都会对对应的信息更新。

原文链接 。

时间: 2024-12-25 12:35:48

Android数据库SQLite表内设置外键的相关文章

数据库多表关系(外键)

数据库多表关系(外键) 字段操作 create table tf1( id int primary key auto_increment, x int, y int ); # 修改 alter table tf1 modify x char(4) default ''; alter table tf1 change y m char(4) default ''; # 增加 mysql>: alter table 表名 add 字段名 类型[(长度) 约束]; # 末尾 eg>: alter t

2016/3/10 数据库简单操作( 创建数据库 创建表 数值类型 主键 外键 自动递增 )

1,在连接下的根目录上点右键,创建数据库      输入数据库名,字符集要设置好,与网页对应起来 点击确定 创建成功2,双击打开数据库     第一个显示的是表 最重要最基础的是表.3,创建表,找到表右键,创建表.     首先要确定列,列名,数据库中不要用中文名来做列名.     再确定数值,类型 bit 布尔型只能存储true false decimal更长可以自己定义 一般用float      char是字符 长度设为1 只能是1 varchar 用来存储字符串 可以设置长度 常用的长度

SQL语句建表、设置主键、外键、check、default、unique约束

· 什么是数据库? 存放数据的仓库. · 数据库和数据结构有什么区别? 数据结构要解决在内存中操作数据的问题,数据库要解决在硬盘中操作数据的问题.数据结构研究一些抽象数据模型(ADT)和以及定义在该模型上的一些操作,数据库是由表.关系.操作组成. · 什么是主键? 主键用来标识记录的唯一性. · 什么是外键? 外键用来标识表与表之间的联系. · 什么是check约束? check约束限制了输入值的范围. · 什么是default约束? 给某个属性一个默认值. · 什么是unique约束? 限制某

2019.09.24学习整理 数据库的字段操作、多表关系、外键

目录 字段操作 多表关系 外键 一对一 无级联关系 有级联关系 一对多 多对多 数据库的字段操作.多表关系.外键 字段操作 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 modify x char(4) default ''; alter table tf1 change y m char(4) default ''; #增加 mysql>: alter table

(MYSQL)给数据库设置外键

设置外键有两种方式,一种是在创建表的时候关联外键,另一种是给已经存在的表添加外键.具体操作如下: 1.在创建表时的操作 班级表(主表): create table tb1( id INT PRIMARY KEY AUTO_INCREMENT, classname VARCHAR(20) NOT NULL ); 用户表(子表): create table tb2( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20) NOT NULL, c

(转)mysql 无法设置外键的原因总结

在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 signed,而另一个又是unsigned(即:无符号),这两字段必须严格地一致匹配,更多关于signed和unsigned的信息,请参阅:http://www.

navicat如何设置外键

今天上午刚刚弄明白了在navicat for mysql上如何设置外键,现在分享出来,希望能够对大家有帮助. 先介绍一下基本情况.现在有两个表一张是teacher表一张是dept表,现在我想把teacher表中的dept属性设置为外键,关联dept表中的code属性.具体情况如图:好了,基本情况介绍完毕,现在开始教你们navicat for mysql 怎么设置外键. 打开我的navicat,然后找到我的teacher表,选中它,然后点击菜单栏上的‘design table’. 2 在弹出的对话

在数据库的设计中,外键(Foreign key)约束是否真的有必要呢?(一)

已经过去一段时间了.在数据库是否设置外键约束的问题,我和同事发生的争执.我是坚持使用外键约束,他们反对使用外键约束.于是,便有了这篇文章. 这篇文章主要是参考了StackOverFlow网站上的一个话题Are foreign keys really necessary in a databasedesign?(http://stackoverflow.com/questions/18717/are-foreign-keys-really-necessary-in-a-database-desig

MySQL设置外键报错 #1452 - Cannot add or update a child row: a foreign key constraint fails 解决方法

MySQL数据库,当我尝试在A表中设置B表的主键为外键时,报出错误:#1452 - Cannot add or update a child row: a foreign key constraint fails  于是去搜索了一下 "#1452 - Cannot add or update a child row: a foreign key constraint fails" 的含义与解决方法,根据这篇博文去排查了报错原因,排除了可能1和可能2,然后去研究可能3的具体含义,一开始并