首页 > 解决方案 > 离子 - 如何一次将数据添加到 sqlite 数据库表?

问题描述

我有一个sqlite数据库,我想在用户第一次打开应用程序时添加一些默认应用程序设置,但是每次我初始化应用程序时,数据都会添加到表中。

这是我的sql文件内容:

CREATE TABLE IF NOT EXISTS settings(name TEXT, value BLOB);

-- INSERT or IGNORE INTO settings(name, value) VALUES ('user_lang', 'ru');
-- INSERT or IGNORE INTO settings(name, value) VALUES ('notifications', false);
-- INSERT or IGNORE INTO settings(name, value) VALUES ('font_size', '1em');

这个片段我用文件中的一些 sql 查询为数据库播种:

createDatabaseObject() {
    this.plt.ready().then(() => {
        this.sqlite.create({
        name: 'appdb.db',
        location: 'default'
        })
        .then((db: SQLiteObject) => {
            this.database = db;
            this.seedDatabase();
        });
    });
}

seedDatabase() {
    // Load settings
    this.http.get('assets/app_database.sql', { responseType: 'text'})
    .subscribe(sql => {
        this.sqlitePorter.importSqlToDb(this.database, sql)
        .then(_ => {
            this.loadSettings();
            this.dbReady.next(true);
        })
        .catch(e => console.error(e));
    });
}

我在我的 sql 文件中尝试了另一种使用 if 语句的解决方案,但它给出了一个错误:

Failed to import SQL; message=sqlite3_prepare_v2 failure: near "IF": syntax error

IF (SELECT COUNT(*) FROM settings) = 0
    BEGIN
        INSERT INTO settings (value, name)
        VALUES 
        ('user_lang','ru'),
        ('notifications', false),
        ('font_size','1em');
    END
ELSE
    BEGIN  
        SELECT COUNT(*) FROM settings
    END

标签: angularionic-framework

解决方案


所以这是小菜一碟!!通过将UNIQUE添加到列名OR IGNORE运算符将生效。

CREATE TABLE IF NOT EXISTS
    settings (
        name TEXT UNIQUE,
        value BLOB
    );

INSERT OR IGNORE INTO settings (name, value)
    VALUES 
        ('user_lang', 'ru'),
        ('notifications', false),
        ('font_size', '1em');

推荐阅读