【问题标题】:How to use TRIGGER in Android SQLite如何在 Android SQLite 中使用 TRIGGER
【发布时间】:2011-08-24 09:33:27
【问题描述】:

我在数据库中有两个表:

  • 表一有姓名和房间号栏
  • 表二有房间号和时间栏。

现在,当第一列的房间号被删除或添加时,我的第二个表也应该更新。我认为使用 TRIGGER 命令可以做到这一点,但我不确定如何使用它。

一般我的创建数据库语句是这样的:

private static final String DATABASE_CREATE_PATIENT_ID_TABLE =
    "create table " + DATABASE_PATIENT_TABLE +
    " (_id integer primary key autoincrement,"
     + "patient_number text not null, room_numbertext not null, " +
            "patient_initial text not null);";

现在,当第一个表中的房间被删除或添加时,我的第二个表应该更新。

private static final String DATABASE_CREATE_NOTES_ID_TABLE =
    "create table " + DATABASE_NOTES_TABLE +
    " (_id integer primary key autoincrement," +
     " room_number text not null, time_hour text not null, " +
            "notes_hour text not null, today_date text not null);";

最初我做的是比较两个表的内容。但这肯定会在以后数据增加时导致性能问题。所以我偶然发现了TRIGGER的东西。我认为这可以解决我的问题,但我不知道我应该如何使用它。

我是从Using SQLite Database with Android知道的。

我已经在另一个问题中用屏幕截图解释了这个问题。请看一下,如果请指导我 new question

【问题讨论】:

  • 为什么人们提出关于数据库问题的问题如此不愿意在问题中命名他们的表?这不仅针对您,Shaista(尽管您在这个问题上对此感到“内疚”);这是关于 SO 上与数据库相关的问题的一般性观察。
  • 但我已将其命名为您在代码中看到的名称。它直接来自我的代码,只有当我解释它时才简短地指出直接问题。我的意图很明确,可能会被误解。
  • @Jonathan - 有与工作相关的不同问题,除非他们完全完成,否则没有人愿意向公众透露他们的工作代码。只是我的意见。
  • @Jonathan:我猜第一个表被称为“PATIENTS”,第二个表被称为“NOTES”或“PATIENT_NOTES”。你的观点到底是什么?不管 Shaista 数据库中的实际表名是什么,知道它们的名称与在 Android SQLite 数据库中使用 TRIGGER 的问题无关。
  • @yogsma:我理解不命名与工作相关的表格 - 但至少如果问题中有名字(不必与工作场景中的相同),那么答案可以一致地说话,而不是强迫每个人为表格提出自己的名称,从而难以关联不同答案的不同部分。 @Shaista:您间接命名它们; DATABASE_PATIENT_TABLE 和 DATABASE_NOTES_TABLE 是(大概)保存表名称的变量。最好将它们命名在要点所在的位置:一个表是 Patients ...;另一个是Notes

标签: android database sqlite triggers


【解决方案1】:

为你简单的开始

create trigger simple_trigger1 after insert on database_patient_table begin update database_notes_table; end 
create trigger simple_trigger2 after delete on database_patient_table begin update database_notes_table; end

使用此文档http://www.sqlite.org/lang_createtrigger.html

【讨论】:

  • 感谢您的回答。但是一些快速的问题我的患者数据库插入函数的名称为 insertInPatientDb 所以我应该写出确切的名称 fr 插入函数还是按照你所说的插入就足够了?而且我没有修改更新功能中的任何内容,所以我是否也应该更改更新功能?
  • 是的,你需要使用数据库表名。以您希望更新的方式更改更新功能应该在第二个表中发生。我只是举了一个例子,阅读那个文档,很有帮助。
  • 对不起,我想回到广场。
  • 详细说明应该在您的笔记表中进行哪些更新。
  • OKAY,从 DATABASE_PATIENT_TABLE room_number 可以修改。意味着这是一个单独的活动,房间将被添加或删除。还有另一个名为notes screen的活动,我根据数据库中已经存在的房间添加一些信息。但是由于在第一个活动中修改了房间(删除了一些房间或添加了一些房间),所以我的第二个活动数据库也应该更新。第二个活动有 DATABASE_NOTES_TABLE 表。我希望这次我清楚了。
【解决方案2】:

根据哪个version of SQLite your app is running on,您也许可以使用SQLite's foreign key support

在旧版本的 SQLite 中,您可以使用 genfkey 实用程序创建触发器来强制执行外键约束(旧版本的 SQLite 会解析在 CREATE TABLE 语句中添加的外键约束,但不会实际执行它们)。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    Demo for Sqlite Trigger in Android HERE

    触发器是在我们的数据库中发生某些事件后执行的一些程序代码。

    我已经为触发器编写了一个示例演示。

    示例:考虑任何大学的数据库。因此,如果在学生表中添加任何学生记录,则会在图书馆部分或食堂部分等中自动添加新行(元组)。

    因此,通过编写一个简单的触发器,我们可以自动在其他部分插入新记录,避免使用样板代码。

    架构

     CREATE TABLE student (sid INTEGER PRIMARY KEY, sname TEXT)  
     CREATE TABLE canteen (cid , sid )  
     CREATE TABLE library (lid INTEGER PRIMARY KEY, sid TEXT)
    

    在图书馆和食堂表中自动添加记录的触发器:

    CREATE TRIGGER if not exists add_student   
       AFTER INSERT  
     ON[student]  
       for each row  
         BEGIN  
            insert into library values (2 , new.sid );  
            insert into canteen values (3 , new.sid);  
         END; 
    

    说明:这里的概念是创建一个触发器,它根据新的学生ID将值插入食堂和图书馆。

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 2016-01-13
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多