2016-01-24 8 views
12

मैं तालिका में मान डालने की कोशिश कर रहा हूं। लेकिन केवल एक मान डाला गया है। जब मैं नए मान डालने की कोशिश कर रहा हूं तो मुझे लॉग बिल्ली में त्रुटि मिल रही है।अद्वितीय बाधा विफल: एसक्लाइट डेटाबेस: एंड्रॉइड

लॉग बिल्ली दिखाता है:

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

आप पहले से ही मौजूदा आईडी डालने का प्रयास कर रहे हैं। चूंकि कुंजी अद्वितीय है, आप नहीं कर सकते हैं। –

+0

मुझे किस कोड को संपादित करना चाहिए? @ हुरुंडी वी। बक्षी –

+1

मैं कुंजी को एक ऑटोमेशन बनाउंगा। और फिर मैं आईडी पास नहीं करूंगा, क्योंकि यह स्वचालित रूप से जेनरेट हो जाएगा। –

उत्तर

14

आपका कोड शायद KEY_ID फ़ील्ड पर प्राथमिक कुंजी की विशिष्टता बाधा का उल्लंघन करता है।

दो संभव समाधान हैं:

  1. सुनिश्चित करें कि वस्तु प्रति अपने EventData.getId() रिटर्न अनन्य मानों। अभी के लिए, मुझे नहीं लगता कि आप अपने कन्स्ट्रक्टर को कोई पहचानकर्ता पास करते हैं और शायद सभी घटनाएं उसी id मान के साथ डाली जाती हैं।
  2. यदि आप स्वयं द्वारा आईडी उत्पन्न करने की परवाह नहीं करते हैं, तो आप AUTOINCREMENT को अपने KEY_ID कॉलम परिभाषा में जोड़ सकते हैं। इस प्रकार KEY_ID फ़ील्ड स्वचालित रूप से भर जाएगा और प्रत्येक पंक्ति का अपना, अद्वितीय मूल्य होगा। एक बार वहां, KEY_ID से ContentValues को अपने आप से जोड़ना न भूलें।
+0

आपको बहुत धन्यवाद ... दूसरा समाधान मेरे लिए काम किया ... आईडी डाली नहीं .. @ मतेसुज़ हेरीच –

+0

..... सुपर ब्रो ... आपने अपना दिन बचाया..मैं जानता था। लेकिन मैं भूल गया यह .. +1 वोट 0 वोट –

+0

वाह, पहला मेरे लिए काम कर रहा है धन्यवाद, @Mateusz Herych –

5

तालिका पर एक अनूठी बाधा है। इसका मतलब है कि किसी दिए गए आईडी मान के साथ केवल एक पंक्ति मौजूद हो सकती है। यदि आप किसी पंक्ति के लिए कुछ मानों को बदलने की कोशिश कर रहे हैं, तो अद्यतन का उपयोग करें INDERT नहीं। यदि आप इस पंक्ति को जोड़ने का प्रयास कर रहे हैं, तो आपको इसे एक अलग, अद्वितीय आईडी देने की आवश्यकता है या आपको पहले से मौजूद पूर्व पंक्ति को हटाने की आवश्यकता है। इनमें से कौन सा सही उत्तर है कि आपका ऐप क्या कर रहा है इस पर निर्भर करता है।

2

यह जांचने का प्रयास करें कि आईडी पहले से मौजूद है या नहीं। यदि सही है, तो सम्मिलित न करें, क्योंकि आपके पास पहले से ही इस आईडी के साथ पंक्ति है।

0

मैंने मूल रूप से पुराने के नए अद्वितीय बाधा शिशु को रखा। इसके बजाय सुनिश्चित करें कि आप कर रहे हैं वर्तमान अद्वितीय स्तंभ पहला है:

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

मेरे गलती थी, मैं हालांकि यह एक INTEGER PRIMARY KEY AUTOINCREMENT

1

मेकअप आईडी स्तंभ आईडी पूर्णांक autoincrement के रूप में पहले से ही परिभाषित किया गया था ID कॉलम भरने के लिए करने की कोशिश की, और कर आईडी मान को सामग्री मानों में न रखें।

संबंधित मुद्दे