2010-09-18 67 views
6

我想强制Android应用程序中的表上的外键constarint。Android中的SQLite触发器?

我搜索,这可以通过使用触发器来实现:

我做了这样的:

db.execSQL("CREATE TRIGGER dept_id_trigger22+" + 
       " AFTER INSERT "+ 
       " OF EmployeeName ON Employees"+ 
       " BEGIN"+ 
            //Condition 
       " RAISE(ABORT,'error') END;"); 

但没有提出任何错误,插入非法值。

这是什么问题?

+0

我没有代码在这里,但一个基本的触发为我工作在SQLite和(根据我的单元测试),它适用于所有Android版本。 – 2010-09-21 20:24:45

+0

你认为我的代码是正确的还是缺少的东西? – 2010-09-21 21:09:55

+0

任何正在寻找触发器语法的人都可以在android中使用实现示例。 http://www.coderconsole.com/2015/02/android-sqlite-trigger-demo.html – nitesh 2016-11-26 07:13:40

回答

6

好的我知道了

Android支持SQLite触发器。

正确的语法是

db.execSQL("CREATE TRIGGER dept_id_trigger22" + 
       " AFTER INSERT "+ 
       "ON Employees"+ 
       " BEGIN"+ 
            //Condition 
       " SELECT RAISE(ABORT,'error'); END;"); 

我忘了raise语句后添加分号。

这不会执行该语句,但它不会引发异常。 仍然将搜索如何抛出异常

感谢

0

我发现使用的SQLite版本不支持外键 - 所以我期望触发器也不受支持。

+0

感谢您的帮助,但您能否提供我对此问题的任何参考 – 2010-09-19 12:18:21

+0

我相信您的假设是错误的,因为它确实支持触发器 – 2010-09-21 21:44:57

+0

似乎是这样。我搜索了它,从我阅读的内容中,我认为这些功能可用,但默认情况下不会激活。我不知道如何使用触发器,但是在类SQLiteDatabase中有一个名为markTableSyncable(String table,String foreignKey,String updateTable)的有趣方法,这可能是你想要的:http://developer.android.com/ reference/android/database/sqlite/SQLiteDatabase.html#markTableSyncable%28java.lang.String,%20java.lang.String,%20java.lang.String%29 – mreichelt 2010-09-21 22:11:25

1

我不希望任何票这个答案,只是为了让你知道:

你可以使用另一个数据库,例如H2 database。免责声明:我是H2的主要作者。

有一些缺点:一些(并非全部)操作速度较慢,例如打开和关闭数据库。 jar文件相对较大(约1 MB)。你将不得不使用JDBC API。

但优点是:H2支持使用触发器,约束等。

+0

谢谢托马斯我会考虑使用它。 – 2010-09-21 19:08:16

+0

我应该补充一点:根据我的(有限)测试,一些操作速度更快,而有些操作速度更慢。我正在研究这个问题,你可以预期在Android上H2的表现会在未来几个月内有所改善。我也想实现Android API,以便从SQLite切换到H2更容易。 – 2010-09-21 19:20:27

3

外键只支持在Android上的升级Froyo(2.2)或更高版本,对于以前的版本,可将它们,但SQLite的忽略它们。尽管所有Android版本的SQLite支持触发器都能产生相同的效果。

较新版本的SQLite(用于您的PC)有一个名为“genfkey”的命令,它将分析您的SQLite数据库(其中包含外键)并生成等效的触发器。通过这种方式,您可以设计具有外键约束的表格,同时还支持所有版本的操作系统。

在Windows上,你的数据库文件作为参数打开SQLite的命令行工具:

sqlite3 mydatabase.db 
.genfkey --exec 

,这将产生对你的所有键约束触发器。

1

要删除最后50行,当计数大于100

sqliteDB.execSQL("CREATE TRIGGER IF NOT EXISTS delete_trigger 
    AFTER INSERT ON table1 
    WHEN (SELECT COUNT(*) FROM table1) > 50 " + 
    BEGIN 
     delete From table1 where id not in(select id from table1 order by id desc limit 100; 
    END;" 
);