在sqlite数据库上插入不生成主键

时间:2014-11-17 01:13:44

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

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

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

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

执行此插入的代码:&#39>:

  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属性。我解决了这个问题,现在问题解决了。

3 个答案:

答案 0 :(得分:0)

linked page表示只对INTEGER PRIMARY KEY列进行自动增量。

page linked from there更加明确:

  

如果声明的类型名称恰好是“INTEGER”,则PRIMARY KEY列只会变成整数主键。其他整数类型名称(如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”)会使主键列表现为具有整数关联和唯一索引的普通表列,而不是rowid的别名。

答案 1 :(得分:-1)

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

答案 2 :(得分:-1)

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

架构定义中的

使用[_id] INTEGER PRIMARY KEY,