(没有这样的专栏)..但是,那里有

时间:2015-10-09 00:46:17

标签: sqlite web-sql

这是我的桌子:

CREATE TABLE IF NOT EXISTS message_threads (
    thread_id integer primary key autoincrement NOT NULL,
    user_id integer NOT NULL, 
    last_checked timestamp NOT NULL DEFAULT '0',
    last_updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
)

CREATE TABLE IF NOT EXISTS messages (
    message_id integer primary key autoincrement NOT NULL,
    thread_id integer NOT NULL,message_type integer NOT NULL DEFAULT '0',
    message_content varchar(500) NOT NULL,
    message_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    sent integer NOT NULL DEFAULT '0'
);

这是我得到的错误:

Could not prepare statement (1 no such column: m.message_date)

这是我正在使用的查询(此查询适用于MySQL,因为我在PHPMyAdmin中使用虚拟表进行了测试)

SELECT * FROM messages m, message_threads t
    WHERE m.thread_id = t.thread_id
    ORDER BY t.last_updated, t.thread_id, m.message_date;

我正在使用WebSQL(我认为是SQLite)

完整的WebSQL代码

    $rootScope.database = openDatabase('application.db', '1.0', 'Application database', 1024 * 1024);
    $rootScope.database.transaction(function(tx) {
        tx.executeSql("CREATE TABLE IF NOT EXISTS message_threads (thread_id integer primary key autoincrement NOT NULL, user_id integer NOT NULL, last_checked timestamp NOT NULL DEFAULT '0', last_updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP);");
        tx.executeSql("CREATE TABLE IF NOT EXISTS messages (message_id integer primary key autoincrement NOT NULL,thread_id integer NOT NULL,message_type integer NOT NULL DEFAULT '0',message_content varchar(500) NOT NULL, message_date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, sent integer NOT NULL DEFAULT '0');");

    });

    // Empty messages/threads for testing purposes
    $rootScope.database.transaction(function(tx) {
        tx.executeSql("DELETE FROM messages;");
        tx.executeSql("DELETE FROM message_threads;");
    });

    $rootScope.database.transaction(function(tx) {
        tx.executeSql("INSERT INTO message_threads (user_id) VALUES (?);", [0]);
        tx.executeSql("INSERT INTO messages (thread_id, message_content, sent) VALUES (?, ?, ?);", [1, "How are you doing?", 1]);
        tx.executeSql("INSERT INTO messages (thread_id, message_content) VALUES (?, ?);", [1, "Good you?"]);
    });

    $rootScope.database.transaction(function(tx) {
        tx.executeSql("SELECT * FROM messages m, message_threads t WHERE m.thread_id = t.thread_id ORDER BY t.last_updated, t.thread_id, m.message_date", [], function(tx, rs) {
            console.log(JSON.stringify(rs));
        }, function(tx, err) {
            alert("Error: " + err.message);
        });
    });

我应该补充一点,使用DBBrowser for SQLite,查询工作正常。

2 个答案:

答案 0 :(得分:1)

您的数据库可能没有列的旧版本表。

如果不存在相同名称的表,则

CREATE TABLE IF NOT EXISTS仅创建具有给定规范的新表。它没有确保列在那里。

要修复它,请删除您的数据库文件,或使用DROP TABLE删除旧表,然后重新创建它们。

答案 1 :(得分:0)

我创建了一个全新的sqlite数据库,并在Windows 7上使用普通命令行sqlite.exe版本3.8.0.2测试了两个创建查询。没有错误。

然后我使用了SQLiteStudio版本3.0.6并输入了一些虚拟数据并执行了您的选择查询。再没有问题。

我使用的工具只能处理sqlite。因此,在我看来,您的工具存在一些配置问题。