使用相同的查询插入多个值SQLite android

时间:2011-08-08 20:03:45

标签: java android sql database sqlite

我的应用程序中经常需要在数据库的表中插入很多值。

所以我需要运行一个插件,如:

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的初学者)

  1. 如何避免主键崩溃(如果尝试插入现有行,则替换其他列)?
  2. 是否可以使用insert中的方法SQLiteDatabase()或类似方法在同一查询中插入所有值?或者我必须构建查询字符串并使用execSQL()
  3. 提前致谢

2 个答案:

答案 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);