在SQLite Android中执行以下查询时出现错误
sDataBase.execSQL(query);
插入联系人(ID,FirstName,LastName,PhoneNumber,EmailId,Status) 值( '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:使用Is it possible to insert multiple rows at a time in an SQLite database?更改查询仍无法正常工作
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'
答案 0 :(得分:4)
在SQLite错误中插入多行
我真的不喜欢你的做法。它太硬了,看起来像意大利面条代码。并且您的方法永远不会起作用,因为一个插入只能有一个值。所以你做错了。
如何使用它直接设计用于插入的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 的表格,所以我建议你创建自己的对象联系,它将代表你的应用层表格,其中对象的属性等于列在表中。我建议你使用这种方法,因为:
execSQL()
并不错,但我通常只在创建SQLiteOpenHelper
子类来创建,删除和更改表时使用它。有一种用法非常合适。但是,作为对您的主要建议是:
仅供参考:当我在SQLite中插入1000,10 000,100 000行时,我做了一些测试,我可以告诉你插入10万行只需 55,346 秒。在没有交易的情况下插入1 000行甚至 73,398 秒。
这是你的代码:
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'
正如@Korniltsev Anatoly在SQLite中指出的那样,有一个约束SQLITE_MAX_COMPOUND_SELECT
意味着你不能同时使用超过500个联合。
答案 1 :(得分:2)
除了@Sajmon的回答:
值得一提的是,几乎所有设备上的sqlite都存在限制 - SQLITE_MAX_COMPOUND_SELECT 500 或更高。这意味着您不能同时使用超过500个工会。如果你使用更多 - 你的SQL查询可能会失败。
答案 2 :(得分:1)
这不是你在SQLite中插入多行的方式。有关详细信息,请参阅this post。
如果我是你,请使用该问题答案中的语法或者,如果您希望能够同时插入一行,只需执行标准INSERT INTO db (one, two) VALUES (one, two)
并为每行执行一次你正在插入。由你决定!