2016-01-24 20 views
12

Próbuję wstawić wartości w tabeli. Ale włożono tylko jedną wartość. Otrzymuję błąd w log cat, gdy próbuję wstawić nowe wartości.Zawieszenie UNIQUE nie powiodło się: baza danych sqlite: android

Log kot pokazuje:

abort at 13 in [INSERT INTO event(totalminutesfrom,dayofweek,title,location,totalminutesto,id) VALUES (?,?,?,?,?,?)]: UNIQUE constraint failed: event.id 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase: Error inserting totalminutesfrom=694 dayofweek=null title=qxs location=Eded & Mariz totalminutesto=0 id=0 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase: android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: event.id (code 1555) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1471) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at com.example.siddhi.timetablelayout.EventTableHelper.addEvent(EventTableHelper.java:76) 
01-24 11:34:39.764 7763-7763/com.example.siddhi.timetablelayout E/SQLiteDatabase:  at com.example.siddhi.timetablelayout.AddEventActivity$5.onClick(AddEventActivity.java:217) 

Jego pokazujące błąd na tych dwóch linii podczas wstawiania wiersza.

db.insert(TABLE, null, values); 

    db.addEvent(new EventData(eventTitle,dayOfWeek,totalMinutesFrom, totalMinutesTo,location)); 

EventTableHelper

public class EventTableHelper extends SQLiteOpenHelper { 


    private static final String TABLE = "event"; 
    private static final String KEY_ID = "id"; 
    private static final String KEY_TITLE = "title"; 
    private static final String KEY_LOCATION = "location"; 
    private static final String KEY_DAY_OF_WEEK = "dayofweek"; 
    private static final String KEY_TOTAL_MINUTES_FROM = "totalminutesfrom"; 
    private static final String KEY_TOTAL_MINUTES_TO = "totalminutesto"; 



    public EventTableHelper(Context context) { 
     super(context, Constants.DATABASE_NAME, null, Constants.DATABASE_VERSION); 
     //3rd argument to be passed is CursorFactory instance 
    } 

    // Creating Tables 
    @Override 
    public void onCreate(SQLiteDatabase db) { 
     //createTable(db); 
    } 

    public void createTable(SQLiteDatabase db){ 
     String CREATE_EVENTS_TABLE = "CREATE TABLE " + TABLE + "(" 
       + KEY_ID + " INTEGER PRIMARY KEY," + KEY_TITLE + " TEXT," 
       + KEY_DAY_OF_WEEK +"TEXT" + KEY_TOTAL_MINUTES_FROM +"INTEGER" 
       + KEY_TOTAL_MINUTES_TO + "INTEGER" + KEY_LOCATION + "TEXT" + ")"; 

     db.execSQL(CREATE_EVENTS_TABLE); 

    } 
    // Upgrading database 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // Drop older table if existed 
     // db.execSQL("DROP TABLE IF EXISTS " + TABLE); 

     // createTable(db); 

     // Create tables again 
     //onCreate(db); 
    } 

    // code to add the new contact 
    public void addEvent(EventData event) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 
     values.put(KEY_ID, event.getId()); 
     values.put(KEY_TITLE,event.getTitle()); // Contact Name 
     values.put(KEY_DAY_OF_WEEK,event.getDayofWeek()); 
     values.put(KEY_TOTAL_MINUTES_FROM,event.getFromMinutes()); 
     values.put(KEY_TOTAL_MINUTES_TO,event.getToMinutes()); 
     values.put(KEY_LOCATION,event.getLocation()); 
     // Inserting Row 
     db.insert(TABLE, null, values); 
     //2nd argument is String containing nullColumnHack 
     db.close(); // Closing database connection 
    } 

    // code to get the single contact 
    EventData getEvent(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(TABLE, new String[] { KEY_ID, 
         KEY_TITLE, KEY_DAY_OF_WEEK, KEY_TOTAL_MINUTES_FROM,KEY_TOTAL_MINUTES_TO,KEY_LOCATION }, KEY_ID + "=?", 
       new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 
     EventData eventData = new EventData(Integer.parseInt(cursor.getString(0)),cursor.getString(1), cursor.getString(2), 
       cursor.getInt(3),cursor.getInt(4),cursor.getString(5)); 

     return eventData; 
    } 



    // code to get all contacts in a list view 
    public List<EventData> getAllEvents() { 
     List<EventData> conList = new ArrayList<EventData>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + TABLE; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 

       EventData event = new EventData(); 

       event.setId(Integer.parseInt(cursor.getString(0))); 
       event.setTitle(cursor.getString(1)); 
       event.setDayofWeek(cursor.getString(2)); 
       event.setFromMinutes(cursor.getInt(3)); 
       event.setToMinutes(cursor.getInt(4)); 
       event.setLocation(cursor.getString(5)); 
       // Adding contact to list 
       conList.add(event); 
      } while (cursor.moveToNext()); 
     } 

     // return contact list 
     return conList; 
    } 
} 

Jak rozwiązać ten problem ??

+1

Próbujesz wstawić istniejący identyfikator. Ponieważ klucz jest UNIKALNY, nie możesz. –

+0

jaki kod powinienem edytować? @ Hrundi V. Bakshi –

+1

Sprawiłbym, że klucz jest AUTOMATYCZNY. A potem nie przekazałbym ID, ponieważ byłby generowany automatycznie. –

Odpowiedz

14

Twój kod prawdopodobnie narusza wyjątek ograniczenia klucza podstawowego w polu KEY_ID.

dwa możliwe rozwiązania:

  1. Upewnij się, że EventData.getId() zwraca unikalne wartości za obiekt. Na razie nie widzę, abyś przekazał jakiś identyfikator do konstruktora i być może wszystkie zdarzenia są wstawiane z tą samą wartością id.
  2. Jeśli nie zależy Ci na samodzielnym generowaniu identyfikatorów, możesz dodać ustawienie AUTOINCREMENT do swojej kolumny . W ten sposób pole zostanie wypełnione automatycznie, a każdy wiersz będzie miał własną, unikalną wartość. Kiedy już tam będziesz, nie zapomnij samemu dodać numeru KEY_ID do ContentValues.
+0

dziękuję bardzo ... drugie rozwiązanie zadziałało dla mnie ... Nie wstawiłem id .. @ Mateusz Herych –

+0

..... Super bro ... uratowałeś mi mój dzień .. wiedziałem o tym, ale zapomniałem to .. Dzięki +1 głosowi –

+0

Wow, pierwszy pracuje dla mnie dzięki, @Mateusz Herych –

5

Tabela ma wyjątkowe ograniczenie. Oznacza to, że tylko jeden wiersz może istnieć z określoną wartością identyfikatora. Jeśli próbujesz zmienić niektóre wartości dla wiersza, użyj UPDATE, a nie INSERT. Jeśli próbujesz dodać ten wiersz, musisz podać inny, unikalny identyfikator lub najpierw usunąć istniejący wcześniej wiersz. To, która z nich jest właściwą odpowiedzią, zależy od tego, co robi Twoja aplikacja.

2

Spróbuj sprawdzić, czy identyfikator już istnieje. Jeśli true, nie wstawiaj, ponieważ masz już wiersz o tym identyfikatorze.

0

Pierwotnie włożyłem nowe, unikalne niemowlę z więzienia starego. Zamiast upewnij się, że prąd jest unikalna kolumna pierwsza:

CREATE TABLE TEST (client_id TEXT unique, remote_id INT unique) 
0

Moim błędem było, starałem się wypełniać ID kolumnę choć został już zdefiniowany jako INTEGER PRIMARY KEY AUTOINCREMENT

1

make kolumna id id całkowitej autoIncrement i zrobić nie umieszczaj wartości id w wartościach treści.

Powiązane problemy