我的应用程序中经常需要在数据库的表中插入很多值。
所以我需要运行一个插件,如:
insert into clients
(id, name, lastip, visites) values
('20','John','1.1.1.1','0'),
('21','Kate','1.1.1.2','3'),
('35','Phill','1.1.1.3','90') ;
我有两个问题(我是SQL的初学者)
insert
中的方法SQLiteDatabase
()或类似方法在同一查询中插入所有值?或者我必须构建查询字符串并使用execSQL()
?提前致谢
答案 0 :(得分:1)
1。)避免主键崩溃的可能性是使用自动增量字段。
如果列的类型为 INTEGER PRIMARY KEY AUTOINCREMENT ,则a 使用稍微不同的ROWID选择算法。选择了ROWID 对于新行至少比最大的ROWID大一个 曾经存在于同一张桌子里。
请参阅sqlite文档here。
如果在您的示例中id
是自动增量字段,则无需在插入中指定它。
2。)是的,有可能(对于一行),如您所指的文档所说:
public long insert (String table, String nullColumnHack, ContentValues values)
值此映射包含该行的初始列值。该 键应该是列名,值应该是列值
但是你应该使用预备语句(参考这里:How do I use prepared statements in SQlite in Android?)
如果要一次性插入所有3行,则需要构建字符串或执行插入3次。
修改您的评论:
3。)这里的答案很好:INSERT IF NOT EXISTS ELSE UPDATE?
另见:http://sqlite.org/lang_conflict.html
更换
发生UNIQUE约束违规时,使用REPLACE算法 删除导致约束违规的预先存在的行 在插入或更新当前行和命令之前 继续正常执行。如果违反NOT NULL约束 发生时,REPLACE冲突解决方案用NULL替换NULL值 该列的默认值,或者列没有默认值 值,然后使用ABORT算法。如果是CHECK约束 发生违规,REPLACE冲突解决算法总是如此 就像ABORT一样。
答案 1 :(得分:1)
如果您使用ContentProvider
访问数据库,可以使用applyBatch()
执行此操作:
// List of operations
ArrayList<ContentProviderOperation) ops
= new ArrayList<ContentProviderOperation>();
// Create the builder
ContentProviderOperation.Builder builder
= ContentProviderOperation.newInsert(...);
// Create the first item
builder.withValue("Name", "John");
builder.withValue("IP", '1.1.1.1');
ops.add(builder.build());
// Create the second item
builder.withValue("Name", "Kate");
builder.withValue("IP", '1.1.1.2');
ops.add(builder.build());
// Insert the data as one transaction
getContentProvider().applyBatch("AUTHORITY", ops);