4

Я знаю, что существует столько потоков по этой проблеме, но ни одна из моих собственных проблем. У меня есть счетчик, подключенный в базе данных, который отображает внешний ключ конкретной таблицы. И появляется вставка ошибки.ошибка вставки android.database.sqlite.sqliteconstraintexception код ошибки 19 ограничение не выполнено

02-18 11:44:34.500: E/SQLiteDatabase(20811): Error inserting [email protected] kWh=801.0 _id=65324 Date=2013 -2-18 Previous=98 Current=899

02-18 11:44:34.500: E/SQLiteDatabase(20811): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed

public class ElectricMeterReader extends Activity { 

    private long rowID; 

    private EditText meterNoEt; 
    private EditText currentEt; 
    private EditText previousEt; 
    private EditText kWhEt; 
    private TextView dateTv; 
    private Spinner spinner; 
    private int mSpinnerSpeciesId; 

    private ElectricMeterReader mContext; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.electric_meter_reader); 

    Bundle extras = getIntent().getExtras(); 

    // rowID = extras.getLong(ConsumerList.ROW_ID); 

    dateTv = (TextView) findViewById(R.id.dateEmr); 
    meterNoEt = (EditText) findViewById(R.id.meterNumberEmr); 
    currentEt = (EditText) findViewById(R.id.currentReadingEmr); 
    previousEt = (EditText) findViewById(R.id.passReadingEmr); 
    kWhEt = (EditText) findViewById(R.id.kwhEmr); 

    spinner = (Spinner) findViewById(R.id.spinner); 

    // Loading spinner data from database 
    SQLiteDatabase db = new DatabaseOpenHelper(this).getWritableDatabase(); 

    // Spinner Drop down elements 
    // List<String> lables = db.getAllLabels(); 
    Cursor c = db.rawQuery(
      "SELECT AccountID AS _id, ConsumerName FROM Consumers", null); 
    // Creating adapter for spinner 
    startManagingCursor(c); 
    String[] from = new String[] { "_id" }; 
    int[] to = new int[] { android.R.id.text1 }; 
    SimpleCursorAdapter dataAdapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_spinner_item, c, from, to); 

    // Drop down layout style - list view with radio button 
    dataAdapter 
      .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

    // attaching data adapter to spinner 
    spinner.setAdapter(dataAdapter); 
    // set spinner listener to display the selected item id 
    mContext = this; 

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     public void onItemSelected(AdapterView<?> parent, View view, 
       int position, long id) { 
      // On selecting a spinner item 
      //String label = parent.getItemAtPosition(position).toString(); 

      Cursor c = (Cursor) parent.getItemAtPosition(position); 
       mSpinnerSpeciesId = c.getInt(c 
       .getColumnIndexOrThrow("ConsumerName")); 


      // Showing selected spinner item 

     /* Toast.makeText(parent.getContext(), "You selected: " + label, 
        Toast.LENGTH_LONG).show();*/ 

     } 

     public void onNothingSelected(AdapterView<?> parent) { 
      // TODO Auto-generated method stub 
     } 
    }); 

    final Calendar ca = Calendar.getInstance(); 
    int yy = ca.get(Calendar.YEAR); 
    int mm = ca.get(Calendar.MONTH); 
    int dd = ca.get(Calendar.DAY_OF_MONTH); 
    dateTv.setText(new StringBuilder() 
      // Month is 0 based, just add 1 
      .append(yy).append(" ").append("-").append(mm + 1).append("-") 
      .append(dd)); 

    if (extras != null) { 

     rowID = extras.getLong("_id"); 
     // meterNoEt.setText(extras.getString("MeterNumber")); 
     // set current date into textview 
     // Spinner click listener 

     currentEt.setText(extras.getString("Current")); 
     previousEt.setText(extras.getString("Previous")); 
     kWhEt.setText(extras.getString("kWh")); 
     // dateTv.setText(extras.getString("Date")); 

    } 

    Button calButton = (Button) findViewById(R.id.calculateDef); 
    calButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      float result = Float.parseFloat(currentEt.getText().toString()) 
        - Float.parseFloat(previousEt.getText().toString()); 
      kWhEt.setText(Float.toString(result)); 

     } 

    }); 

    Button saveButton = (Button) findViewById(R.id.addConsumption); 

    saveButton.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      if (kWhEt.getText().length() != 0) { 

       AsyncTask<Object, Object, Object> saveContactTask = new AsyncTask<Object, Object, Object>() { 

        @Override 
        protected Object doInBackground(Object... params) { 

         saveContact(); 
         return null; 

        } 

        @Override 
        protected void onPostExecute(Object result) { 
         /* 
         * Intent addContact = new Intent(
         * ElectricMeterReader.this, 
         * ConsumerReadList.class); 
         * startActivity(addContact); 
         */ 
         finish(); 
        } 
       }; 

       saveContactTask.execute((Object[]) null); 

      } 

      else { 
       AlertDialog.Builder alert = new AlertDialog.Builder(
         ElectricMeterReader.this); 
       alert.setTitle(R.string.errorTitle); 
       alert.setMessage(R.string.errorMessage); 
       alert.setPositiveButton(R.string.errorButton, null); 
       alert.show(); 
      } 
     } 
    }); 
} 



public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.consumer_menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.addConsumerItem: 
     Intent addContact = new Intent(ElectricMeterReader.this, 
       AddEditConsumer.class); 
     startActivity(addContact); 
     return true; 

    case R.id.consumerInfo: 
     Intent electricMeterReader = new Intent(ElectricMeterReader.this, 
       ViewConsumer.class); 
     startActivity(electricMeterReader); 
     return true; 

    default: 
     return super.onOptionsItemSelected(item); 
    } 

} 

private void saveContact() { 

    DatabaseConnector dbConnector = new DatabaseConnector(this); 

    if (getIntent().getExtras() == null) { 

     dbConnector.insertConsumption(meterNoEt.getText().toString(), 
       currentEt.getText().toString(), previousEt.getText() 
         .toString(), kWhEt.getText().toString(), dateTv 
         .getText().toString(), 
       spinner.getItemAtPosition(mSpinnerSpeciesId).toString() 

     ); 

    } else { 
     dbConnector.updateConsumption(rowID, 
       currentEt.getText().toString(), previousEt.getText() 
         .toString(), kWhEt.getText().toString(), dateTv 
         .getText().toString(), 
       spinner.getItemAtPosition(mSpinnerSpeciesId).toString()); 

    } 
} 

}

метод Insert закодированы в мой databaseconnector

public void insertConsumption(String meter_number, String current, 
     String previous, String kWh, String date, String consumer_name) { 

    ContentValues newCons = new ContentValues(); 

    newCons.put("_id", meter_number); 
    newCons.put("Current", current); 
    newCons.put("Previous", previous); 
    newCons.put("kWh", kWh); 
    newCons.put("Date", date); 
    newCons.put("ConsumerName", consumer_name); 

    open(); 

    database.insert("Consumptions", null, newCons); 

    close(); 
} 

Моя база данных Openhelper

public class DatabaseOpenHelper extends SQLiteOpenHelper { 

    static final String dbName = "ElectricMeterDB"; 

    static final String tableLabels = "labels"; 
    static final String consumptionsTable = "Consumptions"; 
    static final String colMeterNumber = "_id"; 
    static final String colCurrent = "Current"; 
    static final String colPrevious = "Previous"; 
    static final String colkWh = "kWh"; 
    static final String colDate = "Date"; 
    static final String colConsumer = "ConsumerName"; 

    static final String consumersTable = "Consumers"; 
    static final String colAccountID = "AccountID"; 
    static final String colName = "ConsumerName"; 
    static final String colAddress = "Address"; 

    public static final String viewReads = "ViewReading"; 

    public DatabaseOpenHelper(Context context) { 
     super(context, dbName, null, 2); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL("CREATE TABLE " + consumersTable + " (" + colAccountID 
      + " INTEGER PRIMARY KEY NOT NULL," + colName + " TEXT NOT NULL, " 
      + colAddress + " TEXT NOT NULL);"); 

    db.execSQL("CREATE TABLE " + consumptionsTable + " (" + colMeterNumber 
      + " INTEGER PRIMARY KEY NOT NULL," + colCurrent + " INTEGER, " 
      + colPrevious + " INTEGER, " + colkWh + " INTEGER, " + colDate 
      + " TEXT, " + colConsumer + " INTEGER NOT NULL, FOREIGN KEY (" 
      + colConsumer + ") REFERENCES " + consumersTable + " (" 
      + colAccountID + "));"); 

    db.execSQL("CREATE TRIGGER fk_cmpcons_consid" + " BEFORE INSERT " 
      + " ON " + consumptionsTable + " FOR EACH ROW BEGIN" 
      + " SELECT CASE WHEN ((SELECT " + colAccountID + " FROM " 
      + consumersTable + " WHERE " + colAccountID + " =new." 
      + colConsumer + ") IS NULL)" 
      + "THEN RAISE (ABORT, 'Foreign Key Violation') END;" + "END;"); 

    db.execSQL("CREATE VIEW " + viewReads + " AS SELECT " 
      + consumptionsTable + " . " + colMeterNumber + " AS _id, " 
      + consumptionsTable + " . " + colCurrent + " ," 
      + consumptionsTable + " . " + colPrevious + " ," 
      + consumptionsTable + " . " + colkWh + ", " + consumptionsTable 
      + " . " + colDate + "," + consumersTable + "." + colConsumer 
      + " FROM " + consumptionsTable + " JOIN " + consumersTable 
      + " ON " + consumptionsTable + " . " + colConsumer + " = " 
      + consumersTable + "." + colAccountID); 
    // Inserts pre-defined consumers 

} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

    db.execSQL("DROP TABLE IF EXISTS" + consumptionsTable); 
    db.execSQL("DROP TABLE IF EXISTS" + consumersTable); 

    db.execSQL("DROP TRIGGER IF EXISTS consumers_id_trigger"); 
    db.execSQL("DROP TRIGGER IF EXISTS consumers_id_trigger22"); 
    db.execSQL("DROP TRIGGER IF EXISTS fk_cmpcons_consid"); 
    db.execSQL("DROP VIEW IF EXISTS" + viewReads); 
    onCreate(db); 
} 

public void insertLabel(String label) { 

    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(colName, label); 

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

    /** 
    * Getting all labels returns list of labels 
    * */ 
    public List<String> getAllLabels() { 

     List<String> labels = new ArrayList<String>(); 

     // Select All Query 
     String selectQuery = "SELECT * FROM " + consumersTable; 

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

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       labels.add(cursor.getString(1)); 
      } while (cursor.moveToNext()); 
     } 

     // closing connection 
     cursor.close(); 
     db.close(); 

     // returning lables 
     return labels; 
    } 
} 

Я застрял в этой проблеме. Пожалуйста, помогите мне. Спасибо за будущий ответ.

log.d

02-18 13:49:59.870: D/saveContact(30881): _id: 36698521 ConsumerName: [email protected] 

Мой arrayadapter;

public void arrayAdapterList() { 

    final String[] from = new String[] { DatabaseOpenHelper.colAccountID }; 
    // int[] to = new int[] { android.R.id.text1 }; 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_spinner_item, from); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spinner = (Spinner) findViewById(R.id.spinner); 
    // attaching data adapter to spinner 
    spinner.setAdapter(adapter); 

    spinner.setOnItemSelectedListener(new OnItemSelectedListener() { 
     public void onItemSelected(AdapterView<?> parent, View view, 
       int position, long id) { 
      // On selecting a spinner item 
      // String col= c.getString(c.getColumnIndex("_id")); 
      int item = spinner.getSelectedItemPosition(); 
      Toast.makeText(getBaseContext(), "You Selected: " + from[item], 
        Toast.LENGTH_SHORT).show(); 

     } 

     public void onNothingSelected(AdapterView<?> parent) { 
      // TODO Auto-generated method stub 
     } 
    }); 

} 

ответ

8

Похоже некоторые значения, которые вы вставляете может быть NULL для NOT NULL полей (ConsumerName в вашем случае) или ПК (_id в вашем случае) уже существует. Код ошибки 19 означает, что во время операции было нарушено ограничение таблицы (NOT NULL, UNIQUE и т. Д.) (INSERT и т. Д.). Вот список SQLITE Error Codes

[email protected] - значение нежелательной почты, присвоенное ConsumerName. Поэтому, пожалуйста, сделайте некоторое обходное решение, чтобы получить правильный FK для ConsumerName из курсора.

С вами что-то не так с SimpleCursorAdapter. Поэтому, пожалуйста, посмотрите на это. Если вы получаете правильные значения в spinner, то, пожалуйста, получите выбранное значение от spineer spinner.getSelectedItem().toString(); вместо spinner.getItemAtPosition(mSpinnerSpeciesId).toString().

Надеюсь, это вам поможет.

+0

Я попытался вытащить свою базу данных в браузер sqlite, и, похоже, в мое потребление нет значений. Что-то не так с моим кодом? –

+0

Что мне делать? Имя потребителя или первичный ключ, например AccountID? Это мой внешний ключ в моем ConsumptionsTable. В приложении браузера базы данных работает.Я попробовал это один раз, и я думаю, что они общаются друг с другом, потому что внешний ключ или первичный ключ таблицы потребителей перечислены в таблице потребления, поэтому я создаю spinner в свой xml и заполняю AccountID, надеясь, что проблема будет решена. –

+0

Просто попробуйте напечатать имя пользователя ConsumerName перед вставкой, а также обязательно откорректировать правильные значения из курсора и назначить его адаптеру. –

1

Неисправность Constraint обычно указывает, что вы сделали что-то вроде передачи нулевого значения в столбец, который вы объявляете как не равным null при создании своей таблицы.

Итак, удалите ненулевое значение и поместите null при создании таблицы.

1

Я получил ту же ошибку и решил ее, установив ID NULL в коде. Поскольку идентификатор PK SqlLite автоинкрементирует его значение, его не нужно устанавливать.

public void insertConsumption(String meter_number, String current, 
    String previous, String kWh, String date, String consumer_name) { 

    ContentValues newCons = new ContentValues(); 

    //newCons.put("_id", meter_number); 
    newCons.put("Current", current); 
    newCons.put("Previous", previous); 
    newCons.put("kWh", kWh); 
    newCons.put("Date", date); 
    newCons.put("ConsumerName", consumer_name); 

    open(); 

    database.insert("Consumptions", null, newCons); 

    close(); 
} 
0

вы объявили столбец «colAccountID» в качестве первичного ключа, поэтому ошибка дб броска SQLite, когда вы пытаетесь вставить тот же идентификатор снова и снова.