簡體   English   中英

Cursor 嘗試從 SQLite 數據庫(Android Studio)讀取數據時出錯

[英]Cursor running into error while attempting to read data from SQLite database (Android Studio)

我已經嘗試調試了好幾個小時,但我完全處於死胡同。 我正在創建一個程序,您可以在其中將當前日期和當前體重輸入 Android Studio 的屏幕,然后單擊提交。 該日期被發送到 SQLite 數據庫,其中包含兩列數據 - “日期”和“重量”。 有太多的類和事情正在發生,這幾乎是不可能調試的。

我嘗試更改變量名稱,從 SQLite 數據庫版本 1 升級到版本 2,確保我的集合和獲取正常工作......我不知道發生了什么。 我得到的錯誤包括這些主要的 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)

我會一百萬次感謝任何幫助。 我來回試圖弄清楚這一點,我很迷茫。 這也是我的數據庫處理程序 class:


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);
    }



}

和 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 作為占位符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM