You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:27:47