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

时间:2013-03-25 11:05:36

标签: android android-sqlite bulkinsert

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

3 个答案:

答案 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 的表格,所以我建议你创建自己的对象联系,它将代表你的应用层表格,其中对象的属性等于列在表中。我建议你使用这种方法,因为:

  • 它不是spagetthi代码
  • 它快得多
  • 它更安全

最后提出一些建议:

execSQL()并不错,但我通常只在创建SQLiteOpenHelper子类来创建,删除和更改表时使用它。有一种用法非常合适。但是,作为对您的主要建议是:

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

仅供参考:当我在SQLite中插入1000,10 000,100 000行时,我做了一些测试,我可以告诉你插入10万行只需 55,346 秒。在没有交易的情况下插入1 000行甚至 73,398 秒。

  • 每次您选择,插入,更新一个或多个表时,都使用占位符,即 参数化语句而不是硬编码。有了它,您的查询将 变得更安全,更快速,更易于人类阅读。在加入的情况下总是使用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 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)并为每行执行一次你正在插入。由你决定!