【问题标题】:SQLite Triggers Error on launching android appsSQLite 在启动 Android 应用程序时触发错误
【发布时间】:2017-04-14 03:05:07
【问题描述】:

我正在尝试创建一个在其数据库上使用触发器的应用程序。每当我尝试在 Android Studio 上运行它时,应用程序运行良好并且代码中没有错误。但是当我尝试在逍遥或棒棒糖手机上运行它时,它会显示一些错误消息。我已尝试修复它,但现在当我在修复后尝试启动它时出现此消息。

java.lang.RuntimeException: 无法启动活动 ComponentInfo{com.dexpensemanager/com.dexpensemanager.Home}: android.database.sqlite.SQLiteException: 触发器内的 INSERT、UPDATE 和 DELETE 语句中不允许有限定的表名(代码1):,编译时:如果不存在则创建触发器sumcalc_income在TRANS.type =收入和strftime('%Y'-'%m','现在','月开始'时为每一行插入后) ) BEGIN 插入 SUMTRANS.income SELECT SUM(income) FROM TRANS.amount END; 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2522) 在 android.app.ActivityThread.access$800(ActivityThread.java:169) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper.java:194) 在 android.app.ActivityThread.main(ActivityThread.java:5546) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:967) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 引起:android.database.sqlite.SQLiteException:在触发器(代码 1)中的 INSERT、UPDATE 和 DELETE 语句中不允许有限定的表名:,编译时:如果不存在则创建触发器 sumcalc_income AFTER INSERT ON TRANS FOR EACH WHEN TRANS.type=income AND strftime ('%Y'-'%m','now','start of month') BEGIN insert into SUMTRANS.income SELECT SUM(income) FROM TRANS.amount END; 在 android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法) 在 android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:898) 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:509) 在 android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 在 android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58) 在 android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31) 在 android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1704) 在 android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1635) 在 com.example.connectionDB.DBnTrigger.onCreate(DBnTrigger.java:45) 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251) 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 在 com.example.connectionDB.DBnTrigger.getLastIncome(DBnTrigger.java:459) 在 com.dexpensemanager.Home.onCreate(Home.java:61) 在 android.app.Activity.performCreate(Activity.java:5975) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1111) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2413) ... 10 更多

这是我从create trigger 参考中获取的触发器代码

public String insincTrigger() {
    String insinc = "CREATE TRIGGER if not exists sumcalc_income "
            + " AFTER INSERT "
            + " ON "+TRANSACTION_TABLE
            + " FOR  EACH  ROW "
            + " WHEN "
            + " TRANS.type= income "
            + " AND  strftime ('%Y'-'%m','now','start of month') "
            + " BEGIN "
            + " insert into SUMTRANS.income "
            + " SELECT SUM(income) FROM TRANS.amount "
            + " END; ";

    return insinc;
}

public String insexpTrigger(){
    String insexp = "CREATE TRIGGER if not exists sumcalc_expense "
            + " AFTER INSERT "
            + " ON "+TRANSACTION_TABLE
            + " FOR  EACH  ROW "
            + " WHEN "
            + " TRANS.type= expense "
            + " WHERE  strftime ('%Y'-'%m','now','start of month') "
            + " BEGIN "
            + " insert into SUMTRANS.expense "
            + " SELECT SUM(expense) FROM TRANS.amount "
            + " END; ";
    return insexp;
}

public String upincTrigger(){
    String upinc = "CREATE TRIGGER if not exists usumcalc_income "
            + " AFTER UPDATE "
            + " OF [amount] "
            + " ON "+TRANSACTION_TABLE
            + " FOR  EACH  ROW "
            + " WHEN "
            + " TRANS.type= income "
            + " WHERE  strftime ('%Y'-'%m','now','start of month') "
            + " BEGIN "
            + " UPDATE OR REPLACE "+TRANSACTION_SUM
            + " SET [income] = SELECT SUM(income) from TRANS.amount "
            + " END; ";
    return upinc;
}

public String upexpTrigger() {
    String upexp = "CREATE TRIGGER if not exists usumcalc_expense "
            + " AFTER UPDATE "
            + " OF [amount] "
            + " ON "+TRANSACTION_TABLE
            + " FOR  EACH  ROW "
            + " WHEN "
            + " TRANS.type= expense "
            + " WHERE  strftime ('%Y'-'%m','now','start of month') "
            + " BEGIN "
            + " UPDATE OR REPLACE "+TRANSACTION_SUM
            + " SET [expense] = SELECT SUM(expense) from TRANS.amount "
            + " END; ";
    return upexp;
}

public String delTrigger(){
    String del = "CREATE TRIGGER if not exists sumcalc_delete "
            + " AFTER DELETE "
            + " ON "+TRANSACTION_TABLE
            + " FOR  EACH  ROW "
            + " WHEN "
            + " TRANS.type = income AND expense "
            + " WHERE  strftime ('%Y'-'%m','now','start of month') "
            + " BEGIN "
            + " DELETE FROM "+TRANSACTION_SUM
            + " WHERE = SELECT SUM(income AND expense) from TRANS.amount "
            + " END; ";
    return del;
}

public String instimeTrigger(){
    String instime = "CREATE TRIGGER if not exists sumcalc_instime "
            + " AFTER INSERT "
            + " ON "+TRANSACTION_SUM
            + " FOR  EACH  ROW "
            + " BEGIN "
            + " insert into SUMTRANS.month "
            + " VALUES ('%Y'-'%m','now','start of month') "
            + " END;";
    return instime;
}

public String deltimeTrigger(){
    String deltime = "CREATE TRIGGER if not exists sumcalc_instime "
            + " AFTER DELETE "
            + " ON "+TRANSACTION_SUM
            + " FOR  EACH  ROW "
            + " BEGIN "
            + " DELETE FROM SUMTRANS.month "
            + " END; ";
    return deltime;
}

谁能告诉我该怎么办?

谢谢。

【问题讨论】:

  • 在这个数据库中有 2 个表 Transaction_table 和 sumtrans

标签: android sql database sqlite triggers


【解决方案1】:

异常堆栈清楚地说明了问题:

android.database.sqlite.SQLiteException: qualified table names are not allowed on
INSERT, UPDATE, and DELETE statements within triggers (code 1)

来自您问题中的链接SQLite docs(强调我的):

触发器中 UPDATE、DELETE 和 INSERT 语句的语法限制

触发器中的 UPDATE、DELETE 和 INSERT 语句不支持 UPDATE、DELETE 和 INSERT 语句的完整语法。以下限制适用:

  • 在 UPDATE、DELETE 或 INSERT 中要修改的表的名称 语句必须是非限定表名。换句话说,必须 指定时只使用“tablename”而不是“database.tablename” 桌子。要修改的表必须存在于同一个数据库中 触发器附加到的表或视图。

  • INSERT 语句的“INSERT INTO table DEFAULT VALUES”形式 不支持。

  • UPDATE 不支持 INDEXED BY 和 NOT INDEXED 子句 和 DELETE 语句。

  • UPDATE 和 DELETE 语句中的 ORDER BY 和 LIMIT 子句是 不支持。 ORDER BY 和 LIMIT 通常不支持 在任何上下文中更新或删除,但可以为顶级启用 使用 SQLITE_ENABLE_UPDATE_DELETE_LIMIT 编译时的语句 选项。但是,该编译时选项仅适用于顶级 UPDATE 和 DELETE 语句,而不是 UPDATE 和 DELETE 语句 触发器。

  • 内部的语句不支持公用表表达式 触发器。

我想SUMTRANS 语句中的insert into SUMTRANS.expense 是数据库名称。根据文档,这是不支持的。

希望这会有所帮助。

【讨论】:

  • 哇,我认为它支持。我想并不是所有的参考文献都是有效的,那么无论如何谢谢
猜你喜欢
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多