Android Studio中SQLite插入报错:UNIQUE约束冲突求助
体重追踪App SQLite插入报错问题
调试数小时仍陷入僵局,正在Android Studio开发一款体重追踪程序:用户在界面输入日期和体重后点击提交,数据存入含date、weight列的SQLite数据库。因涉及多类组件,调试难度极大。
尝试过修改变量名、将SQLite版本从1升级到2、验证getter/setter方法有效性,但问题仍未解决。点击提交时Logcat报错如下:
报错日志
E/SQLiteDatabase: Error inserting weight=142 date=07/24/2022 android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: weightDataTable.date (code 1555 SQLITE_CONSTRAINT_PRIMARYKEY) at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:961) at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:790) at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:89) at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1868) at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1737) at com.example.weighttrackerproject.DBHandler.addNewWeight(DBHandler.java:51) at com.example.weighttrackerproject.grid$1.onClick(grid.java:50) at android.view.View.performClick(View.java:7506) at android.view.View.performClickInternal(View.java:7483) at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0) at android.view.View$PerformClick.run(View.java:29335) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7898) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
相关代码
DBHandler类
import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase; import java.util.ArrayList; import java.util.List; public class DBHandler extends SQLiteOpenHelper { //声明变量 private static final int DATABASE_VERSION = 1; private static final String DATABASE_NAME = "weightDatabase"; //声明表名与列名 private static final String TABLE_NAME = "weightDataTable"; private static final String DATE_COL = "date"; private static final String WEIGHT_COL = "weight"; private static final String ID_COL = "id"; //默认构造方法 public DBHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { //创建表的SQL语句 String query = "CREATE TABLE " + TABLE_NAME + "(" + ID_COL + " INTEGER PRIMARY KEY AUTOINCREMENT, " + DATE_COL + " TEXT," + WEIGHT_COL + " TEXT)"; db.execSQL(query); } //向SQLite数据库添加新体重数据 public void addNewWeight(String date, String weightInPounds) { //获取可写数据库 SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); //将日期和体重值存入对应列 values.put(DATE_COL, date); values.put(WEIGHT_COL, weightInPounds); db.insert(TABLE_NAME, null, values); //关闭数据库 db.close(); } public ArrayList<ReadData> readWeights() { //获取可读数据库 SQLiteDatabase db = this.getReadableDatabase(); //创建游标查询表中所有数据 Cursor cursorWeights = db.rawQuery("SELECT * FROM " + TABLE_NAME, null); //声明新的ArrayList ArrayList<ReadData> readWeightsArrayList = new ArrayList<>(); //将游标移至首位 if (cursorWeights.moveToFirst()) { do { //将游标数据添加至ArrayList readWeightsArrayList.add(new ReadData(cursorWeights.getString(1), cursorWeights.getString(2))); } while (cursorWeights.moveToNext()); } //返回ArrayList //cursorWeights.close(); return readWeightsArrayList; } public void updateWeight(String originalDate, String date, String weight) { //获取可写数据库 SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); //存入新数据 values.put(DATE_COL, date); values.put(WEIGHT_COL, weight); //调用更新方法,根据原始日期匹配数据 db.update(TABLE_NAME, values, "date=?", new String[]{originalDate}); db.close(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //检查表是否存在,若存在则删除 db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } }
ReadData类
public class ReadData { //定义日期、体重、ID变量 private String date; private String weight; private int id; //创建getter和setter方法 public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getWeight() { return weight; } public void setWeight(String weight) { this.weight = weight; } public int getId() { return id; } public void setId(int id) { this.id = id; } //默认构造方法 public ReadData(String date, String weight) { this.date = date; this.weight = weight; } }
补充怀疑点
ReadData类中date的setter方法在代码里呈灰色,而weight的setter不是,怀疑该方法存在异常。
内容的提问来源于stack exchange,提问作者tomcat_lov123
相关产品推荐
相关产品推荐

