【问题标题】:android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed Couldnot figure out what the error saysandroid.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed 无法弄清楚错误的含义
【发布时间】:2020-11-18 19:55:35
【问题描述】:

我在 Android Studio 中遇到了上述错误消息。我的数据库很简单 第一列:名称 TEXT PRIMARY KEY 第二列:价格文本

我已经在 StackOverflow 中查看了相同问题的答案,但无法解决错误。

我在这里引用我的 DataBaseHelper 类和 insertActivity:


    private static final String DATABASE_NAME = "ItemDatabase";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME = "Items";
    private static final String COLUMN_NAME = "Name";
    private static final String COLUMN_PRICE = "Price";

    DataBaseHelper(Context context)
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS "+ TABLE_NAME + "(" + COLUMN_NAME + " TEXT NOT NULL PRIMARY KEY, " + COLUMN_PRICE + " TEXT);");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        String sql = "DROP TABLE IF EXISTS " + TABLE_NAME + ";";
        sqLiteDatabase.execSQL(sql);
        onCreate(sqLiteDatabase);
    }

    boolean addItem(String itemName, String itemPrice) {

            ContentValues contentValues = new ContentValues();
            contentValues.put(COLUMN_NAME, itemName);
            contentValues.put(COLUMN_PRICE, itemPrice);
            SQLiteDatabase db = this.getWritableDatabase();
            boolean b = db.insert(TABLE_NAME, null, contentValues) != -1;
            db.close();
            return b;

    }

    Cursor getPrice(String itemName) {
        SQLiteDatabase db = this.getReadableDatabase();
        return db.rawQuery(" SELECT Price FROM  Items WHERE Name= ? ", new String[]{itemName});
    }

    Cursor updatePrice(String itemName, String itemPrice)
    {
        SQLiteDatabase db = this.getReadableDatabase();
        return db.rawQuery(" UPDATE Items SET Price= ? WHERE Name= ? ", new String[]{itemPrice,itemName});
    }

    public List<String> getName(){
        List<String> list = new ArrayList<String>();

        String selectQuery = "SELECT  * FROM " + TABLE_NAME;

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


        if (cursor.moveToFirst()) {
            do {
                list.add(cursor.getString(0));
            } while (cursor.moveToNext());
        }

        cursor.close();
        db.close();

        return list;
    }
}
public class insertActivity extends AppCompatActivity {

   EditText itemName,itemPrice;
   Button buttonInsert;
   boolean b;


   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_insert);

       itemName= findViewById(R.id.itemName);
       itemPrice= findViewById(R.id.itemPrice);
       buttonInsert=findViewById(R.id.buttonInsert);

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



       final DataBaseHelper dataBaseHelper =new DataBaseHelper(getApplicationContext());

       buttonInsert.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               try {
                   b = dataBaseHelper.addItem(Name,Price);
               }catch (Exception e)
               {
                   e.printStackTrace();
               }

              if( b )
               {
                   Toast.makeText(getApplicationContext(),"Item Inserted Successfully ",Toast.LENGTH_SHORT).show();
               }
               else
                   Toast.makeText(getApplicationContext(),"Item Insertion Failed ",Toast.LENGTH_SHORT).show();
           }
       });




   }
}

错误:

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

【问题讨论】:

    标签: java android sqlite android-sqlite


    【解决方案1】:

    这些行:

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

    insertActivity 加载时(可能它们只是空字符串),将EditTexts itemNameitemPrice 的文本分配给变量NamePrice,并且它们永远不会改变。 因此,当您单击按钮时,侦听器通过调用 dataBaseHelper.addItem(Name,Price) 尝试在表中插入相同的值,这会导致您得到错误,因为由于列 Name 是表的 Primary Key,它必须是唯一的。

    您必须做的是在侦听器中移动这些行:

    buttonInsert.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        final String Name=itemName.getText().toString();
        final String Price=itemPrice.getText().toString();
    
        try {
        ................................................
    }
    

    因此,当您单击按钮时,将从EditTexts 中检索正确的值,然后将其插入表中。

    【讨论】:

      猜你喜欢
      • 2022-11-29
      • 2015-10-26
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      相关资源
      最近更新 更多