在我当前的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属性。我解决了这个问题,现在问题解决了。
答案 0 :(得分:0)
linked page表示只对INTEGER PRIMARY KEY列进行自动增量。
如果声明的类型名称恰好是“INTEGER”,则PRIMARY KEY列只会变成整数主键。其他整数类型名称(如“INT”或“BIGINT”或“SHORT INTEGER”或“UNSIGNED INTEGER”)会使主键列表现为具有整数关联和唯一索引的普通表列,而不是rowid的别名。
答案 1 :(得分:-1)
您可以验证数据库表是否在其主键上激活了“自动增量”选项...
答案 2 :(得分:-1)
您必须将列_id
设置为主键 - 您可能会错过它。主键的默认行为(当它定义为INTEGER时)是自动增量
使用[_id] INTEGER PRIMARY KEY,