gpt4 book ai didi

android - 在 SQLite 错误中插入多行(错误代码 = 1)

转载 作者:太空狗 更新时间:2023-10-29 16:05:48 27 4
gpt4 key购买 nike

在 SQLite Android 中执行以下查询时出现错误

sDataBase.execSQL(query);

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')

注意:这在 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 中犯了一个小错误。同步结束状态是 在 UNION 之前我包含了逗号,所以我得到了一个错误.现在已删除并且工作正常

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'

最佳答案

Insert Multiple Rows in SQLite Error

我真的不喜欢你的方法。它是如此硬核,看起来像意大利面条代码。而且您的方法永远不会奏效,因为一次插入只能有一个值。所以你做的不对。如何使用它直接设计用于插入的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 子类来创建、删除和更改表时才使用它。有一个用法很合适。但作为给您的主要建议是:

  • 每次你插入、更新、删除一个用法交易总是很好的做法,因为除了增加速度性能(特别是如果您插入大量行)您使用数据库的工作是否更安全。

仅供引用: 当我将 1000、10000、100000 行插入 SQLite 时,我做了一些测试,我可以告诉你插入 100000 行只用了55,346 秒。在没有事务的情况下插入 1000 行甚至花费了 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'

更新 2:

正如@Korniltsev Anatoly 在 SQLite 中指出的那样,有一个约束 SQLITE_MAX_COMPOUND_SELECT,这意味着您不能一次使用超过 500 个联合。

关于android - 在 SQLite 错误中插入多行(错误代码 = 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15613377/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com