2016-03-14 2 views
0

Я создал таблицу и добавление элементов в таблицу следующим образом,SQLiteConstraintException выбрасывают каждый раз при добавлении динамических ДАННЫЕ к столу

`

public void addPendingOrders(PendingOrdersDao pendingOrders) { 
     SQLiteDatabase db = this.getWritableDatabase(); 

     ContentValues values = new ContentValues(); 

     values.put(KEY_ID, pendingOrders.getId()); 
     values.put(KEY_SHIPMENT_NO, pendingOrders.getSipmentNo()); 
     values.put(KEY_SHIPMENT_REF_NO, pendingOrders.getShipmentRefNo()); 
     values.put(KEY_PRO_INV_NO, pendingOrders.getProformoInvoiceNumber()); 
     values.put(KEY_PRO_INV_DATE, pendingOrders.getProformoInvoiceDate()); 
     values.put(KEY_SHIPMENT_DATE, pendingOrders.getShipmentDate()); 
     values.put(KEY_PT_OF_CONTACT, pendingOrders.getPointOfContact()); 
     values.put(KEY_PRODUCT, pendingOrders.getProduct()); 
     values.put(KEY_QTY, pendingOrders.getQuantity()); 
     values.put(KEY_RATE, pendingOrders.get_rate()); 
     values.put(KEY_AMOUNT, pendingOrders.getAmount()); 
     values.put(KEY_PRODUCT_IMG, pendingOrders.getProductImage()); 
     values.put(KEY_SHIPMENT_STAT, pendingOrders.getShipmentStatus()); 

     // Inserting Row 
     db.insert(TABLE_PENDINGORDERS, null, values); 
     db.close(); // Closing database connection 
    } 

Тогда в моем коде, Im, используя следующие код для добавления значений в таблицу

for (PendingOrdersDao cn : allPendingOrders) { 
             //int _id, String _shipmentNo, String _shipmentRefNo, String _proformoInvoiceNumber, String _proformoInvoiceDate, String _shipmentDate, String _pointOfContact, String _product, String _quantity, String _rate, String _amount, String _productImage, String _shipmentStatus) { 



myitems.add(new PendingOrdersDao(cn.getId(), cn.getSipmentNo(), cn.getShipmentRefNo(), cn.getProformoInvoiceNumber(), cn.getProformoInvoiceDate(), cn.getShipmentDate(), cn.getPointOfContact(), cn.getProduct(), cn.getQuantity(), cn.get_rate(), cn.getAmount(), cn.getProductImage(), cn.getShipmentStatus())); 

           } 

Каждый раз, когда вид нажат, то значения будут считаны с помощью залпа и эти значения будут сохранены в базе данных. В первый раз, когда нажимается клика, данные добавляются в базу данных без каких-либо проблем. В следующий раз, если Im щелкнет представление, новые значения получаются снова, но ошибка SQLiteConstraintException бросается, когда новые данные добавляются в таблицу. Я думаю, это потому, что идентификаторы старых значений в таблице и новые значения, которые вставляются в таблицу, одинаковы. Есть ли способы, с помощью которых я могу справиться с этой ошибкой? Как я могу очистить записи в таблице и вставить вновь полученные данные, не получая исключение из SQL-ограничения?

Журнал ошибок

android.database.sqlite.SQLiteConstraintException: Идентификатор столбца не уникальный (код 19) в android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId (Родной метод) на андроид. database.sqlite.SQLiteConnection.executeForLastInsertedRowId (SQLiteConnection.java:973) на android.database.sqlite.SQLiteSession.executeForLastInsertedRowId (SQLiteSession.java:788)

Это запрос, который я использую, чтобы создать таблицу

String CREATE_PENDING_ORDERS_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_PENDINGORDERS + "(" 
      + KEY_ID + " INT PRIMARY KEY NOT NULL," 
      + KEY_SHIPMENT_NO + " TEXT NOT NULL," 
      + KEY_SHIPMENT_REF_NO + " TEXT NOT NULL," 
      + KEY_PRO_INV_NO + " TEXT NOT NULL," 
      + KEY_PRO_INV_DATE + " TEXT NOT NULL," 
      + KEY_SHIPMENT_DATE + " TEXT NOT NULL," 
      + KEY_PT_OF_CONTACT + " TEXT NOT NULL," 
      + KEY_PRODUCT + " TEXT NOT NULL," 
      + KEY_QTY + " TEXT NOT NULL," 
      + KEY_RATE + " TEXT NOT NULL," 
      + KEY_AMOUNT + " TEXT NOT NULL," 
      + KEY_PRODUCT_IMG + " TEXT NOT NULL," 
      + KEY_SHIPMENT_STAT + " TEXT NOT NULL" 
      + ")"; 
+0

, пожалуйста, покажите свой стек. – Opiatefuchs

+0

Я разместил журнал ошибок – user1241241

+0

В первый раз значения вставляются правильно, но во второй раз , значения с одинаковым идентификатором вставляются еще раз, потому что я хочу, чтобы мое приложение отображало только что полученные данные. Это вызывает проблему. Как я могу справиться с этим? – user1241241

ответ

0

Я решил это сам. Ниже приводится способ, которым я должен следовать, чтобы вставить ДАННЫЕ динамически,

db.insertWithOnConflict(TABLE_PENDINGORDERS, null, 
       values, SQLiteDatabase.CONFLICT_REPLACE); 

, что CONFLICT_REPLACE делает, что каждый раз, когда возникает конфликт в в ключе, который определяется как первичный ключ, то он просто заменить всю строку с новая запись. Вы также можете использовать CONFLICT_IGNORE, если хотите, чтобы ваше приложение игнорировало такие ошибки.,