android.database.sqlite.SQLiteException:即使存在列,也不会出现此类列错误

时间:2019-03-22 17:08:51

标签: sqlite

我知道这个问题已经被问过多次了,但是我的语法有问题,我无法弄清楚是什么。这是添加我的专栏的方法:

财产声明:

public static final String COLUMN_TS_MILIS = "ts_milis";

public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
        COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
        COLUMN_PRODUCT + " TEXT, " +
        COLUMN_PRICE + " TEXT, " +
        COLUMN_TS + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP," +
        COLUMN_TS_MILIS + "timestamp integer default (cast(strftime('%s', 'now') as int))" +
        ");";
db.execSQL(query);

这是触发错误的查询:

Cursor totalCof = db.rawQuery("SELECT sum(" + COLUMN_PRICE + ")" + " FROM " + TABLE_NAME
                    + " WHERE "  + COLUMN_TS_MILIS + "= date('now')", null);

我的语法有什么问题?非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

对于要按照 COLUMN_TS_MILIS 命名的列,省略了列名和列类型之间的空格,因此列名是列名和列类型的串联。因此,假设COLUMN_TS_MILIS解析为毫,则QL为:-

`CREATE TABLE ......,millistimestamp integer default (cast(strftime('%s', 'now') as int))`

代替

`CREATE TABLE ......,millis timestamp integer default (cast(strftime('%s', 'now') as int))`

此外,您还指定了两种类型,时间戳和整数,这不是SQLIite的问题,但可能会引起混乱。

因此,您可能只想

`CREATE TABLE ......,millis integer default (cast(strftime('%s', 'now') as int))`

因此,您可能要使用:-

String query = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + "(" +
        COLUMN_ID + " INTEGER PRIMARY KEY, " +
        COLUMN_PRODUCT + " TEXT, " +
        COLUMN_PRICE + " TEXT, " +
        COLUMN_TS + " TIMESTAMP DEFAULT CURRENT_TIMESTAMP," +
        COLUMN_TS_MILIS + " INTEGER DEFAULT (cast(strftime('%s', 'now') as int))" +
        ");";
  • 注意 AUTOINCREMENT 已被删除,因为您几乎可以肯定它不需要overheads

要实施更改,您必须删除表(如果存在)。最简单的方法是:

  1. 删除应用程序的数据或
  2. 卸载应用程序

,然后重新运行该应用程序(假设现有数据(如有)可能会丢失)。