android.database.sqlite.sqliteconstraintexception:唯一约束失败无法找出错误说明

cwxwcias  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(494)

我在android studio中遇到了上述错误消息。我的数据库是一个简单的第一列:名称文本主键第二列:价格文本
我已经在stackoverflow中查看了同一问题的答案,但无法解决错误。
我在这里引用我的databasehelper类和insertactivity:

  1. private static final String DATABASE_NAME = "ItemDatabase";
  2. private static final int DATABASE_VERSION = 1;
  3. private static final String TABLE_NAME = "Items";
  4. private static final String COLUMN_NAME = "Name";
  5. private static final String COLUMN_PRICE = "Price";
  6. DataBaseHelper(Context context)
  7. {
  8. super(context, DATABASE_NAME, null, DATABASE_VERSION);
  9. }
  10. @Override
  11. public void onCreate(SQLiteDatabase sqLiteDatabase) {
  12. sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS "+ TABLE_NAME + "(" + COLUMN_NAME + " TEXT NOT NULL PRIMARY KEY, " + COLUMN_PRICE + " TEXT);");
  13. }
  14. @Override
  15. public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
  16. String sql = "DROP TABLE IF EXISTS " + TABLE_NAME + ";";
  17. sqLiteDatabase.execSQL(sql);
  18. onCreate(sqLiteDatabase);
  19. }
  20. boolean addItem(String itemName, String itemPrice) {
  21. ContentValues contentValues = new ContentValues();
  22. contentValues.put(COLUMN_NAME, itemName);
  23. contentValues.put(COLUMN_PRICE, itemPrice);
  24. SQLiteDatabase db = this.getWritableDatabase();
  25. boolean b = db.insert(TABLE_NAME, null, contentValues) != -1;
  26. db.close();
  27. return b;
  28. }
  29. Cursor getPrice(String itemName) {
  30. SQLiteDatabase db = this.getReadableDatabase();
  31. return db.rawQuery(" SELECT Price FROM Items WHERE Name= ? ", new String[]{itemName});
  32. }
  33. Cursor updatePrice(String itemName, String itemPrice)
  34. {
  35. SQLiteDatabase db = this.getReadableDatabase();
  36. return db.rawQuery(" UPDATE Items SET Price= ? WHERE Name= ? ", new String[]{itemPrice,itemName});
  37. }
  38. public List<String> getName(){
  39. List<String> list = new ArrayList<String>();
  40. String selectQuery = "SELECT * FROM " + TABLE_NAME;
  41. SQLiteDatabase db = this.getReadableDatabase();
  42. Cursor cursor = db.rawQuery(selectQuery, null);
  43. if (cursor.moveToFirst()) {
  44. do {
  45. list.add(cursor.getString(0));
  46. } while (cursor.moveToNext());
  47. }
  48. cursor.close();
  49. db.close();
  50. return list;
  51. }
  52. }
  1. public class insertActivity extends AppCompatActivity {
  2. EditText itemName,itemPrice;
  3. Button buttonInsert;
  4. boolean b;
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_insert);
  9. itemName= findViewById(R.id.itemName);
  10. itemPrice= findViewById(R.id.itemPrice);
  11. buttonInsert=findViewById(R.id.buttonInsert);
  12. final String Name=itemName.getText().toString();
  13. final String Price=itemPrice.getText().toString();
  14. final DataBaseHelper dataBaseHelper =new DataBaseHelper(getApplicationContext());
  15. buttonInsert.setOnClickListener(new View.OnClickListener() {
  16. @Override
  17. public void onClick(View view) {
  18. try {
  19. b = dataBaseHelper.addItem(Name,Price);
  20. }catch (Exception e)
  21. {
  22. e.printStackTrace();
  23. }
  24. if( b )
  25. {
  26. Toast.makeText(getApplicationContext(),"Item Inserted Successfully ",Toast.LENGTH_SHORT).show();
  27. }
  28. else
  29. Toast.makeText(getApplicationContext(),"Item Insertion Failed ",Toast.LENGTH_SHORT).show();
  30. }
  31. });
  32. }
  33. }

错误:

  1. W/System.err: at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
  2. at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:746)
  3. W/System.err: at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
  4. at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
  5. at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1770)
  6. at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1698)
  7. at com.anirbit.anirbitadak.nirman.DataBaseHelper.addItem(DataBaseHelper.java:45)
  8. W/System.err: at com.anirbit.anirbitadak.nirman.insertActivity$1.onClick(insertActivity.java:39)
  9. at android.view.View.performClick(View.java:6597)
  10. at android.view.View.performClickInternal(View.java:6574)
  11. at android.view.View.access$3100(View.java:778)
  12. at android.view.View$PerformClick.run(View.java:25881)
  13. W/System.err: at android.os.Handler.handleCallback(Handler.java:873)
  14. at android.os.Handler.dispatchMessage(Handler.java:99)
  15. W/System.err: at android.os.Looper.loop(Looper.java:164)
  16. at android.app.ActivityThread.main(ActivityThread.java:6649)
  17. at java.lang.reflect.Method.invoke(Native Method)
  18. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
  19. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)```
pnwntuvh

pnwntuvh1#

这些线路:

  1. final String Name=itemName.getText().toString();
  2. final String Price=itemPrice.getText().toString();

分配给变量 Name 以及 Price 文件的文本 EditText s itemName 以及 itemPriceinsertActivity 加载(可能它们只是空字符串)并且永远不会更改。
所以当你点击按钮的时候,监听器会通过调用 dataBaseHelper.addItem(Name,Price) 尝试在表中插入相同的值,这将导致出现错误,因为 NamePrimary Key 它必须是唯一的。
您必须在侦听器中移动这些行:

  1. buttonInsert.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View view) {
  4. final String Name=itemName.getText().toString();
  5. final String Price=itemPrice.getText().toString();
  6. try {
  7. ................................................
  8. }

因此,当您单击按钮时,将从 EditText 然后插入表中。

展开查看全部

相关问题