2014-11-17 2 views
0

В моем текущем проекте андроида, когда я пытаюсь вставить значение в моей базе данных SQLite, через эту SQL заявление:Вставить в SQLite базы данных не генерирует первичный ключ

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

строка вставляются без значения для первичный ключ. У меня есть идентификатор столбца, который согласно этому 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(); 
    } 
    } 

кто-нибудь знает, что я здесь делаю неправильно? Я не могу понять, в чем проблема.

UPDATE

После чтения отмеченного ответа, я проверить код для создания таблицы:

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

и нашел способ dbFields не включать PRIMARY KEY атрибута для столбца идентификаторов , Я исправляю это, и теперь проблема решена.

+1

Не могли бы вы опубликовать инструкцию create table – gZerone

ответ

0

linked page говорит, что вы получите автоинкремент только для столбца INTEGER PRIMARY KEY.

page linked from there является evem более явным:

ПЕРВИЧНЫЙ столбец KEY только становится в качестве первичного ключа, если имя объявленного типа именно «INTEGER». Другие имена целых типов, такие как «INT» или «BIGINT» или «SHORT INTEGER» или «UNSIGNED INTEGER», приводят к тому, что столбец первичного ключа ведет себя как обычный столбец таблицы с целочисленным сродством и уникальный индекс, а не как псевдоним для rowid.

-1

Вы можете проверить, если таблица базы данных имеет «автоинкрементируемую» вариант деактивировался первичным ключ ...

+0

Как я могу это проверить? и в случае, если он не активирован, как я мог активировать? –

+0

Поведение по умолчанию - auto-increament – Aun

-1

вы должны установить столбец _id в качестве первичного ключа - вы бы пропустили это. Поведение первичного ключа (если он определен как INTEGER) по умолчанию является автоматическим приращением

используется схема определения [_id] INTEGER PRIMARY KEY,

+0

Не все первичные ключи являются автоинкрементами. И не нужно называть его '_id'. –

+0

yes .. Я имею в виду только цельный первичный ключ. Я также дал определение. Теперь я добавил то же самое в скобках .. спасибо – Aun

Смежные вопросы