2

在 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:使用是否可以在 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.End of Sync 状态中犯了一个小错误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'
4

3 回答 3

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 行时,我做了一些测试,我可以告诉你插入 100 000 行只用了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 个联合。

于 2013-03-25T11:27:14.503 回答
2

除了@Sajmon 的回答:

值得一提的是,sqlite 有一个限制 - SQLITE_MAX_COMPOUND_SELECT在几乎所有设备上都为500或更大。这意味着您一次不能使用超过 500 个联合。如果您使用更多 - 您的 sql 查询可能会失败。

于 2013-03-26T07:12:49.183 回答
1

这不是在 SQLite 中插入多行的方式。有关详细信息,请参阅此帖子

如果我是您,请使用该问题答案中的语法,或者,如果您也希望能够一次插入一行,只需执行一个标准INSERT INTO db (one, two) VALUES (one, two)并为您插入的每一行执行一次。由你决定!

于 2013-03-25T11:17:45.667 回答