2016-01-24 54 views
12

テーブルに値を挿入しようとしています。しかし、挿入される値は1つだけです。新しい値を挿入しようとすると、log catにエラーが発生します。UNIQUE制約に失敗しました:sqliteデータベース:android

ログ猫は示しています行を挿入しながら、これらの2行にエラーを示す

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) 

その。

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; 
    } 
} 

+1

既存のIDを挿入しようとしています。キーはユニークなので、できません。 –

+0

私はどのコードを編集すべきですか? @ Hrundi V. Bakshi –

+1

私はキーをAUTOINCREMENTものにします。それから、自動的に生成されるので、IDを渡すことはありません。 –

答えて

14

あなたのコードはおそらくKEY_IDフィールドの主キーの一意性制約に違反しています。

2つの解決策は以下のとおりです。

  1. あなたEventData.getId()は、オブジェクトごとに一意の値を返すことを確認します。今のところ、コンストラクタに識別子を渡すことはありません。すべてのイベントが同じid値で挿入されている可能性があります。
  2. 自分でIDを生成したくない場合は、の設定をKEY_IDの列定義に追加できます。このようにしてKEY_IDフィールドが自動的に塗りつぶされ、各行に独自の一意の値が設定されます。一度、KEY_IDContentValuesに追加することを忘れないでください。
+0

お元気です...二番目の解決策は私のために働いた... idを挿入していない... @ Mateusz Herych –

+0

.....スーパーブロ...あなたは私の日を救った..私はそれを知っていたが、私は忘れてしまったそれは..ありがとう+1投票 –

+0

うわー、最初は私のために働いていますありがとう、マテウスHerych –

5

テーブルには一意の制約があります。これは、指定されたID値を持つ行が1つしか存在しないことを意味します。行の値の一部を変更しようとしている場合は、INSERTではなくUPDATEを使用します。この行を追加しようとする場合は、異なる一意のIDを指定するか、既存の行を最初に削除する必要があります。どちらが適切な答えかは、アプリが何をしているかによって異なります。

2

IDが既に存在するかどうかを確認してください。 trueの場合、このIDを持つ行がすでにあるため、挿入しないでください。

0

私はもともと古いものの新しいユニークな制約の幼児を入れました。代わりに、あなたは現在の一意の列だことを確認してください最初のものである:

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

私の間違いは、それがINTEGER PRIMARY KEY AUTOINCREMENT

1

idカラムのID整数自動インクリメントを行い、そうであるようにすでに定義しましたが、私はID列を埋めるためにしようとした、でしたid値をコンテンツ値に入れない。

関連する問題