插入多行SQLite中错误(错误代码= 1)(Insert Multiple Rows in SQL

2019-08-18 00:13发布

SQLite中的Android执行下面的查询时,我得到一个错误

sDataBase.execSQL(query);

插入到联系人(ID,名字,姓氏,******中国,EMAILID,状态)的值( 'ae0caa6a-8ff6-d63f-0253-110b20ac2127', 'XXX', 'XXX', '9008987887', 'xxx@gmail.com', '是'),( '9afab56e-a18a-47f2-fd62-35c78d8e0d94', 'YYY', 'YYY', '7890988909', 'yyy@gmail.com', '是'),('378d757a-ee60-07a4 -e8bc-396b402c3270' , 'ZZZ', 'ZZZ', '9000898454', 'zzz@gmail.com', '是')

注:这是在SQLServer的执行罚款,这是Android的SQLite得到错误。

Error: sqlite returned: error code = 1, msg = near ",": syntax error, db=/data/data/myapp.contactmanager/databases/webview.db

编辑1:我值仍然得到错误之间的增值空间

insert into Contacts(ID, FirstName, LastName, PhoneNumber, EmailId,Status) values
('ae0caa6a-8ff6-d63f-0253-110b20ac2127', 'xxx', 'xxx','9008987887', 'xxx@gmail.com', 'Yes'), 
('9afab56e-a18a-47f2-fd62-35c78d8e0d94', 'yyy', 'yyy', '7890988909', 'yyy@gmail.com', 'Yes'), 
('378d757a-ee60-07a4-e8bc-396b402c3270', 'zzz', 'zzz', '9000898454', 'zzz@gmail.com', 'Yes')

编辑2:更改使用查询是否有可能在SQLite数据库一次插入多行? 还是行不通

INSERT INTO Contacts 
SELECT 'ae0caa6a-8ff6-d63f-0253-110b20ac2127' AS ID, 'xxx' AS FirstName, 'xxx' AS LastName, '9008987887' AS PhoneNumber, 'xxx@gmail.com' AS EmailId, 'Yes' AS Status, 
UNION SELECT '9afab56e-a18a-47f2-fd62-35c78d8e0d94', 'yyy', 'yyy', '7890988909', 'yyy@gmail.com', 'Yes' 
UNION SELECT '378d757a-ee60-07a4-e8bc-396b402c3270', 'zzz', 'zzz', '9000898454', 'zzz@gmail.com', 'Yes'

编辑3:我已经在同步状态的编辑2.最终是做了一个小错误before UNION i have included comma ,让我得到了一个错误。 现在删除, 做工精细

INSERT INTO Contacts 
SELECT 'ae0caa6a-8ff6-d63f-0253-110b20ac2127' AS ID, 'xxx' AS FirstName, 'xxx' AS LastName, '9008987887' AS PhoneNumber, 'xxx@gmail.com' AS EmailId, 'Yes' AS Status 
UNION SELECT '9afab56e-a18a-47f2-fd62-35c78d8e0d94', 'yyy', 'yyy', '7890988909', 'yyy@gmail.com', 'Yes' 
UNION SELECT '378d757a-ee60-07a4-e8bc-396b402c3270', 'zzz', 'zzz', '9000898454', 'zzz@gmail.com', 'Yes'

Answer 1:

这不是你如何插入SQLite中多行。 请参阅这篇文章的详细信息。

如果我是你,去与无论是在这个问题的答案语法或者,如果你希望能够一次过插入单列,只是做一个标准的INSERT INTO db (one, two) VALUES (one, two)和执行,一旦你要插入的每一行。 由你决定!



Answer 2:

插入SQLite的错误多行

我真的不喜欢你的做法。 它是如此hardcored,它看起来像意大利面条的代码。 和你的方法绝不会工作,因为一个刀片只能有一个值 。 所以,你这样做不正确。 怎么样使用API insert()它的设计直接插入的方法?

另外从查看关于速度的性能和安全的角度,我建议你用TRANSACTION为好。 但是,让我们去写一些代码,尤其是对你。

public void insertMultiple(List<Contact> contacts) {
    Contact c = null;
    ContentValues values = new ContentValues();
    try {
        if (db != null) {
            db.beginTransaction();
            for (Contact c: contacts) {
                values.put(SQLConstants.FIRSTNAME, c.getFirstName());
                values.put(SQLConstants.LASTNAME, c.getLastName());
                ...
                db.insertOrThrow("Contacts", SQLConstants.FIRSTNAME, values);
                values.clear();
            }
            db.setTransactionSuccessful();
        }
    }
    finally {
        if (db != null && db.inTransaction()) {
            db.endTransaction();
        }
    }
}

笔记:

正如我注意到你有台名为Constacts,所以我建议你创建自己的物体接触 ,这将代表了应用层,在那里对象的属性是等于表中的列的表。 我建议你使用这种方法,因为:

  • 这不是spagetthi代码
  • 这是相当快
  • 它更安全

在最后的几个建议:

execSQL()是不坏,但我一般不使用它,只有当我创建SQLiteOpenHelper创建和删除和更改表的子类。 还有一个用法是相当合适的。 但是你作为主要建议如下:

  • 每次你要插入,更新,删除交易的使用总是非常好的做法,因为除了速度性能(特别是如果你的行插入大量)是你的作品与数据库更安全的增加。

仅用于信息:我做了一些测试,当我插入1000,10 000 100个000行到SQLite的,我可以告诉你的10万行,在插入只用了55346秒 1个000行,而不插入交易甚至花了73398秒

  • 每当你选择,插入,从一个或多个表更新使用占位符 ,即参数化的语句,而不是硬编码。 有了它,您的查询就会变得更安全,更快,更好的人类可读。 在加盟的情况下,总是使用join子句。 这是你可以选择最好的。

更新:

这里是工作的代码:

insert into Contacts(ID, FirstName, LastName, PhoneNumber, EmailId, Status) 
select 'someId' as ID, 'xxx' as FirstName, 'xxx' as LastName , '9008987887' as PhoneNumber , 'xxx@gmail.com' as EmaiId, 'Yes' as Status
union all select 'someId', 'xxx', 'xxx', '9008987887', 'xxx@gmail.com', 'Yes'
union all select 'someId', 'xxx', 'xxx', '9008987887', 'xxx@gmail.com', 'Yes'

更新2:

作为@Korniltsev阿纳托利SQLite中指出,有一个约束SQLITE_MAX_COMPOUND_SELECT这意味着你不能同时使用超过500个工会。



Answer 3:

除了@Sajmon的回答是:

值得一提的是有SQLite中的限制- SQLITE_MAX_COMPOUND_SELECT500或更高的几乎所有设备。 这意味着你不能同时使用超过500个工会。 如果you'l使用更多的 - 你的SQL查询可能会失败。



文章来源: Insert Multiple Rows in SQLite Error (error code = 1)