尝试从SQLite数据库(Android Studio)读取数据时,光标遇到错误



我已经试着调试这个程序好几个小时了,但我已经完全走不通了。我正在创建一个程序,您可以在Android Studio的屏幕上输入当前日期和当前体重,然后单击提交。该日期被发送到具有两列数据的SQLite数据库——";日期";以及";重量";。有太多的类和事情在进行,这几乎是不可能调试的。

我尝试过更改变量名称,从SQLite数据库版本1升级到版本2,确保我的集合和get正常工作。。。我不知道发生了什么。我得到的错误包括这些主要的3…所以当我输入日期和重量并点击提交时,我得到了这个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)

如果有任何帮助,我将不胜感激。我来来回回地试图弄清楚这一点,但我太失落了。这里还有我的数据库处理程序类:


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 {
//Declare variables
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "weightDatabase";
//Declare table name and columns
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";
//Default constructor
public DBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//Create query for required columns
String query = "CREATE TABLE " + TABLE_NAME + "("
+ ID_COL + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ DATE_COL + " TEXT,"
+ WEIGHT_COL + " TEXT)";
db.execSQL(query);
}
//This method is use to add new weight to our sqlite database
public void addNewWeight(String date, String weightInPounds) {
//Create new database
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
//Add date and weight values to columns in database
values.put(DATE_COL, date);
values.put(WEIGHT_COL, weightInPounds);
db.insert(TABLE_NAME, null, values);
//Close the database
db.close();
}
public ArrayList<ReadData> readWeights() {
//Create new database
SQLiteDatabase db = this.getReadableDatabase();
//Create new cursor to query all data in table
Cursor cursorWeights = db.rawQuery("SELECT * FROM " + TABLE_NAME, null);
//Declare new ArrayList
ArrayList<ReadData> readWeightsArrayList = new ArrayList<>();
//Cursor to first position
if (cursorWeights.moveToFirst()) {
do {
//Add cursor data to the arraylist
readWeightsArrayList.add(new ReadData(cursorWeights.getString(1),
cursorWeights.getString(2)));
} while (cursorWeights.moveToNext());
}
//Return the arraylist
//cursorWeights.close();
return readWeightsArrayList;
}
public void updateWeight(String originalDate, String date, String weight) {
//Create new db
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
//Put new items into values
values.put(DATE_COL, date);
values.put(WEIGHT_COL, weight);

// on below line we are calling a update method to update our database and passing our values.
// and we are comparing it with name of our course which is stored in original name variable.
db.update(TABLE_NAME, values, "date=?", new String[]{originalDate});
db.close();
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// this method is called to check if the table exists already.
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}

}

以及sets和gets的ReadData(这是错误之一(我相信日期的设置器可能不起作用,因为它是灰色的,而代码中的权重设置器不是灰色的:


public class ReadData {
// variables for our coursename,
// description, tracks and duration, id.
private String date;
private String weight;
private int id;
// creating getter and setter methods
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;
}
//Default constructor
public ReadData(String date, String weight) {
this.date = date;
this.weight = weight;
}
}

您忘记添加id列

values.put(ID_COL, null)

//通过在不指定列列表的情况下进行插入,您需要与列数完全匹配的多个值,并且必须使用NULL作为占位符

最新更新