【问题标题】:Insert multiple values SQLite android with the same query使用相同的查询插入多个值 SQLite android
【发布时间】:2011-10-22 16:56:00
【问题描述】:

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

所以我需要像这样运行插入:

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. 是否可以使用SQLiteDatabase 中的insert() 方法或类似方法在同一查询中插入所有值?或者我必须构建查询字符串并使用execSQL()?

提前致谢

【问题讨论】:

    标签: java android sql database sqlite


    【解决方案1】:

    1.) 避免主键崩溃的一种方法是使用自动递增字段。

    如果列的类型为 INTEGER PRIMARY KEY AUTOINCREMENT,则 使用略有不同的 ROWID 选择算法。选择的 ROWID 因为新行至少比最大的 ROWID 大一 以前存在于同一张表中。

    参见 sqlite 文档here

    如果在您的示例中 id 将是一个自动递增字段,则您无需在插入中指定它。

    2.) 是的,有可能(对于一行),就像您参考的文档说的那样:

    public long insert (String table, String nullColumnHack, ContentValues values)
    

    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 值替换为 该列的默认值,或者如果该列没有默认值 值,则使用 ABORT 算法。如果一个 CHECK 约束 发生冲突时,总是使用 REPLACE 冲突解决算法 像 ABORT 一样工作。

    【讨论】:

    • 感谢您的回答,我真的不想避免主键崩溃,我需要的是更新已存在的行
    • @Adrmedi:我编辑了我的帖子,以便在您的问题中加入更多信息
    【解决方案2】:

    如果您使用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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 1970-01-01
      • 2019-02-03
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多