【问题标题】:Insert on sqlite database don't generate Primary Key在 sqlite 数据库上插入不生成主键
【发布时间】:2015-01-13 20:31:08
【问题描述】:

在我当前的android项目中,当我尝试在我的sqlite数据库中插入一个值时,通过这个sql语句:

insert into Usuario(nome, sobrenome, email, login, senha) values (?, ?, ?, ?, ?)

插入的行没有主键的值。我有一个列 id,根据这个link,它是 ROWID 的别名,应该自动填充,它没有发生。

执行此插入的代码是:

  public void insert(String[] data) {
    try {
      Model object = clazz.newInstance();
      List<String> lista = object.getFields();

      List<String> campos = new ArrayList<String>();
      for(int i=1; i<lista.size(); i++)
        campos.add(lista.get(i));

      List<String> values = new ArrayList<String>();
      for(int i=0; i<campos.size(); i++)
        values.add("?");

      String scampos = campos.toString().replace("[", "(").replace("]", ")");
      String svalues = values.toString().replace("[", "(").replace("]", ")");
      String INSERT = "insert into " + clazz.getSimpleName() + scampos + " values "+ svalues;
      System.out.println("===== INSERT -> "+INSERT);

      SQLiteDatabase db = openHelper.getWritableDatabase();
      SQLiteStatement insertStmt = db.compileStatement(INSERT);

      for(int i=0; i<data.length; i++)
        insertStmt.bindString(i+1, data[i]);

      insertStmt.executeInsert();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

有人知道我在这里做错了什么吗?我不知道是什么问题。

更新

阅读标记答案后,我验证创建表的代码:

Model object = clazz.newInstance();
String CREATE = "CREATE TABLE " + this.getClazz().getSimpleName() + object.dbFields().toString().replace("[", "(").replace("]", ")");
System.out.println(CREATE);
db.execSQL( CREATE );

发现方法dbFields 不包含id 列的PRIMARY KEY 属性。我解决了这个问题,现在问题解决了。

【问题讨论】:

  • 你能发布你的创建表语句

标签: android database sqlite primary-key auto-increment


【解决方案1】:

您必须将您的列 _id 设置为主键 - 您会错过这一点。主键的默认行为(当它被定义为 INTEGER 时)是自动递增

在架构定义中使用[_id] INTEGER PRIMARY KEY,

【讨论】:

  • 并非所有主键都是自动递增的。并且不需要将其命名为_id
  • 是的..我的意思只是整数主键..我也给出了定义。现在我在括号中再次添加了相同的内容。谢谢
【解决方案2】:

linked page 表示您只能为 INTEGER PRIMARY KEY 列自动递增。

page linked from there 更加明确:

仅当声明的类型名称恰好是“INTEGER”时,PRIMARY KEY 列才会成为整数主键。其他整数类型名称,如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”会导致主键列表现为具有整数亲和性和唯一索引的普通表列,而不是 rowid 的别名。

【讨论】:

    【解决方案3】:

    您可以验证您的数据库表是否在其主键上激活了“自动增量”选项...

    【讨论】:

    • 如何验证?如果它没有激活,我该如何激活?
    • 默认行为是自动递增
    猜你喜欢
    • 1970-01-01
    • 2016-07-28
    • 2014-03-10
    • 2019-07-23
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多