0

メッセージング スレッドを格納するために、データベースの下位スキーマを使用しています。

CREATE TABLE threads(
    _id INTEGER PRIMARY KEY AUTOINCREMENT, 
    date_sent_or_received INTEGER, 
    read INTEGER, 
    count INTEGER, 
    body TEXT, 
    address TEXT, 
    error_code INTEGER);

SMS テーブルに値を挿入するたびにアクティブになる次のトリガーがあります。

CREATE TRIGGER update_thread_id AFTER INSERT ON sms
WHEN
0 <> (select count() from threads
      where length(address)>=length(new.address)
        and substr(address, length(address)-length(new.address)+1) like new.address)
BEGIN
UPDATE threads SET
    address = new. address
where substr(address, length(address)-length(new.address)+1) like new.address;

UPDATE threads SET
    date_sent_or_received=new.date_sent_or_received,
    read = new.read,
    body = new.body 
where date_sent_or_received<=new.date_sent_or_received
  and address like new.address;

UPDATE sms SET
    thread_id= (select _id from threads
                where address like new.address)
where _id = new._id;

UPDATE threads SET
    count = (select count() from sms 
             where thread_id=(select _id from threads 
                              where address like new.address))
where address like new.address;

END;

スレッドが新しいものよりも古い場合にのみ、スレッドの内容を変更しようとしているという問題が発生しています。こんなふうになります。

UPDATE threads SET
    date_sent_or_received=new.date_sent_or_received,
    read = new.read,
    body = new.body 
where date_sent_or_received<=new.date_sent_or_received
  and address like new.address;

しかし、うまくいきません。新しく挿入された行のタイムスタンプが大きい場合でも、テーブルの内容は同じままです。このトリガーは、新しく追加された行に従ってアドレスを更新します。

整数で秒を格納しています。私が間違っているアイデアはありますか?

4

1 に答える 1

0

あなたの質問に対する正確な解決策がわかりません。しかし、あなたの質問はクエリに関するものなので、SQLite でこれらの操作を行っている場合は、SQliteBrowser または SQLite マネージャーで SQL ステートメントをテストしてください。そこでは、データベースがステートメントにどのように反応しているかを理解できます。

于 2013-09-14T06:42:09.633 に答える