2016-08-27 2 views
-1

Я попытался вставить данные в базу данных в android.SQLiteConstraintException при обращении к базе данных

Это один работает:

public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL(
      "create table study " + 
        "(percentage integer primary key,videoDuration text,totalTime text,date text)" 
    ); 
} 


public boolean insertStudy(String percentage, String videoDuration, String totalTime, String date) { 

    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("percentage", percentage); 
    contentValues.put("videoDuration", videoDuration); 
    contentValues.put("totalTime", totalTime); 
    contentValues.put("date", date); 
    db.insert("study", null, contentValues); 
    return true; 
} 

Но когда я пытаюсь добавить еще один столбец для серийного номера (как я не имею никакого столбец первичного ключа), я получаю ошибку при вставке.

Это новый код (не работает):

public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    db.execSQL(
      "create table study " + 
        "(serial integer primary key,percentage text,videoDuration text,totalTime text,date text)" 
    ); 
} 


public boolean insertStudy(String percentage, String videoDuration, String totalTime, String date) { 
    serialNumber++; 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("serial", serialNumber); 
    contentValues.put("percentage", percentage); 
    contentValues.put("videoDuration", videoDuration); 
    contentValues.put("totalTime", totalTime); 
    contentValues.put("date", date); 
    db.insert("study", null, contentValues); 
    return true; 

} 

Я использую SERIALNUMBER, как счетчик так, что он будет держать вставки значения в последовательный, а также выступать в качестве первичного ключа. Я делаю ошибку за этот код:

Error inserting date=27/08/2016 percentage=2.6 serial=1 totalTime=0:0:1 videoDuration=22:96 
android.database.sqlite.SQLiteConstraintException: PRIMARY KEY must be unique (code 19) 

Я не понимаю, почему первый работает, но не второй. Я хочу понять, почему второй код не работает.

Мое приложение может работать с первым кодом, но в будущем это может привести к ошибкам, поэтому я хочу использовать второй код.

+2

Это обычное явление, потому что вы сохранили процент в качестве первичного ключа, и когда вы вставляете первичный ключ данных, дублируется, лучше возьмите Base._ID в качестве первичного ключа, который будет автоматически увеличиваться, и если вы хотите использовать свой собственный, то убедитесь, что th ey не дублируются. –

+0

Быстрее и лучше Google выполняет свои исключения и ошибки, чем размещать их на StackOverflow, прежде чем что-либо делать. ** A. ** вы избежите downvotes, ** B. ** так вы улучшите свои поисковые запросы. – Sufian

+0

Возможный дубликат [первичного ключа исключения исключения sqlite должен быть уникальным] (http://stackoverflow.com/questions/26986687/sqlite-constraint-exception-primary-key-must-be-unique) – Sufian

ответ

0

Попробуйте, добавляя автоинкрементный и удаление настройки идентификатора вручную:

db.execSQL(
     "create table study " + 
       "(serial integer primary key AUTOINCREMENT ,percentage text,videoDuration text,totalTime text,date text)" 
); 

public boolean insertStudy(String percentage, String videoDuration, String totalTime, String date) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("percentage", percentage); 
    contentValues.put("videoDuration", videoDuration); 
    contentValues.put("totalTime", totalTime); 
    contentValues.put("date", date); 
    db.insert("study", null, contentValues); 
    return true; 
} 

public boolean insertStudy(String percentage, String videoDuration, String totalTime, String date) { 
    SQLiteDatabase db = this.getWritableDatabase(); 
    ContentValues contentValues = new ContentValues(); 
    contentValues.put("percentage", percentage); 
    contentValues.put("videoDuration", videoDuration); 
    contentValues.put("totalTime", totalTime); 
    contentValues.put("date", date); 
    db.insert("study", null, contentValues); 
    return true; 
} 
+0

Спасибо, сейчас работает. –

1

Последовательная колонка принимает только уникальное значение.

Просто обновите

db.execSQL("create table study (serial integer,percentage text,videoDuration text,totalTime text,date text)"); 
0

Процент не может быть использован первичный ключ, как ошибка предположил, что это должно быть уникальным, рекомендуемый подход заключается в добавлении id поле.

db.execSQL(
"create table study " + 
"(id integer primary key, percentage,videoDuration text,totalTime text,date text)" 
); 
+0

если у вас нет ума, вы можете увидеть это [вопрос ..] (http://stackoverflow.com/questions/39268248/access-email-id-along-with-name-and-phone-number-from-contact- list-in-android). –

0

При создании таблицы тека идентификатора и как сделать первичный ключ автоинкрементируемым:

db.execSQL("create table study (id integer primary key autoincrement, serial integer,percentage text,videoDuration text,totalTime text,date text)" 
); 
+0

Спасибо, теперь его работа. Я удалил серийный номер, чтобы указать серийный номер. –

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