Android:SQLite约束失败问题

Android:SQLite约束失败问题,android,sqlite,Android,Sqlite,在我的应用程序中,我使用的是SQLite数据库。在我的一个表中插入数据时,我面临着“SQLite异常:错误19”的奇怪问题。第一次插入数据,但当我再次尝试插入数据时,它抛出异常 我的创建表查询: "CREATE TABLE Tickets (" + "ID integer PRIMARY KEY NOT NULL," + " UID varchar(40) NOT NULL DEFAULT 'not available'," + " OrderID

在我的应用程序中,我使用的是SQLite数据库。在我的一个表中插入数据时,我面临着“SQLite异常:错误19”的奇怪问题。第一次插入数据,但当我再次尝试插入数据时,它抛出异常

我的创建表查询:

"CREATE TABLE Tickets ("
            + "ID integer PRIMARY KEY NOT NULL,"
            + " UID varchar(40) NOT NULL DEFAULT 'not available'," + " OrderID int NOT NULL,"
            + " CarrierTicketNum varchar(15) NOT NULL,"
            + " TicketTypeID int NOT NULL," + " TankTypeID int NULL,"
            + " ProductObsGravity numeric NULL DEFAULT 0,"
            + " ProductHighTemp numeric NULL DEFAULT 0,"
            + " ProductLowTemp numeric NULL DEFAULT 0,"
            + " ProductObsTemp numeric NULL DEFAULT 0,"
            + " ProductBSW numeric NULL DEFAULT 0");
插入查询:

public void insertTank(int OrderID, int TicketTypeID,
        String CarrierTicketNum, String TankNum, int TankTypeID,
        Double ProductObsTemp, Double ProductObsGravity, Double ProductBSW,
        Double GrossBarrels, Double NetBarrels) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put("OrderID", OrderID);
    values.put("CarrierTicketNum", CarrierTicketNum);
    values.put("TankNum", TankNum);
    values.put("TicketTypeID", TicketTypeID);
    values.put("TankTypeID", TankTypeID);
    values.put("ProductObsTemp", ProductObsTemp);
    values.put("ProductObsGravity", ProductObsGravity);
    values.put("ProductBSW", ProductBSW);
    values.put("GrossBarrels", GrossBarrels);
    values.put("NetBarrels", NetBarrels);
    //try {
        db.insertOrThrow("Tickets", null, values);
    /*} catch (SQLiteException sqle) {
        Log.d(TAG, "SQLITException: " + sqle.getMessage());
    }*/
    db.close(); // Closing database connection
}
以下是日志详细信息:

09-08 13:54:57.610: E/AndroidRuntime(5713): FATAL EXCEPTION: main
09-08 13:54:57.610: E/AndroidRuntime(5713): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1617)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at com.dzo.dispatchcrude.driverapp.datalayer.DatabaseHandler.insertTank(DatabaseHandler.java:736)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at com.dzo.dispatchcrude.driverapp.NetBarrelActivity$1.onClick(NetBarrelActivity.java:103)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.view.View.performClick(View.java:3511)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.view.View$PerformClick.run(View.java:14110)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.os.Handler.handleCallback(Handler.java:605)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.os.Handler.dispatchMessage(Handler.java:92)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.os.Looper.loop(Looper.java:137)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at android.app.ActivityThread.main(ActivityThread.java:4424)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at java.lang.reflect.Method.invokeNative(Native Method)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at java.lang.reflect.Method.invoke(Method.java:511)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-08 13:54:57.610: E/AndroidRuntime(5713):     at 
dalvik.system.NativeStart.main(Native Method)

阅读了几乎很多帖子,但没有得到多少帮助。

有两种方法可以解决您的问题

第一:

主键
声明为
自动递增

第二:

尝试插入新行时,
为新行提供不同/唯一的ID

要测试它,请在再次运行应用程序之前删除数据库

解决方案: 该行应为:

+ "ID integer PRIMARY KEY AUTOINCREMENT," 
而不是

+ "ID integer PRIMARY KEY NOT NULL,"

有两种方法可以解决您的问题

第一:

主键
声明为
自动递增

第二:

尝试插入新行时,
为新行提供不同/唯一的ID

要测试它,请在再次运行应用程序之前删除数据库

解决方案: 该行应为:

+ "ID integer PRIMARY KEY AUTOINCREMENT," 
而不是

+ "ID integer PRIMARY KEY NOT NULL,"
获取约束失败,因为您违反了对字段的约束,就像将空值传递到创建表时声明为非空的列中一样

我认为
“ID integer主键不为NULL,”
这是导致问题的原因,请确保它是
自动增量
,并且在设置NOT NULL约束时,其他值不为NULL

获取约束失败,因为您违反了对字段的约束,就像将空值传递到创建表时声明为非空的列中一样


我认为
“ID integer主键不为NULL,”
这是问题的根源,请确保它是
自动增量
,并且在设置NOT NULL约束时,其他值不为NULL。

如果将ID用作int值而不是

“ID整数主键自动递增”

而不是

+ "ID integer PRIMARY KEY NOT NULL,"
“ID整数主键不为空”

如果使用ID作为字符串值,则

使用下面的行插入值 db.insertWithOnConflict(表名,null,值,SQLiteDatabase.CONFLICT\u IGNORE)

(其中值是ContentValues对象的对象)

而不是

+ "ID integer PRIMARY KEY NOT NULL,"
db.insert(表名称,空,值)


继续编码…微笑…

如果将ID用作int值,则

“ID整数主键自动递增”

而不是

+ "ID integer PRIMARY KEY NOT NULL,"
“ID整数主键不为空”

如果使用ID作为字符串值,则

使用下面的行插入值 db.insertWithOnConflict(表名,null,值,SQLiteDatabase.CONFLICT\u IGNORE)

(其中值是ContentValues对象的对象)

而不是

+ "ID integer PRIMARY KEY NOT NULL,"
db.insert(表名称,空,值)



继续编码…微笑…

那么你想更新已经存在的数据吗?不,我想每次都插入新数据。语法有什么错误吗?所以您只需要插入一个新行?是的,我想插入新行在insert语句上放置一个断点。检查
。它包含任何空值吗?所以你想更新已经存在的数据吗?不,我想每次都插入新数据。语法有什么错误吗?所以您只需要插入一个新行?是的,我想插入新行在insert语句上放置一个断点。检查
。它是否包含空值?在sqlite中,主键不需要自动递增,对吗?虽然我尝试过,但没有成功。是否需要将
NULL
?也许,这就是问题所在。如果你输入
非空值,你就不能输入非空值,但如果你什么都不输入,你甚至可以输入空值或非空值。但你的错误不是这样的。错误可能是您试图在同一行中插入两倍的值(相同的ID)。尝试删除你的数据库,然后用ID的
autoincrement
重新运行应用程序。正如你所说,我已经尝试过了。我删除了数据库,并使用autoincrement重新运行我的应用程序。在sqlite中,主键不需要自动递增,对吗?虽然我尝试过,但没有成功。是否需要将
NULL
?也许,这就是问题所在。如果你输入
非空值,你就不能输入非空值,但如果你什么都不输入,你甚至可以输入空值或非空值。但你的错误不是这样的。错误可能是您试图在同一行中插入两倍的值(相同的ID)。尝试删除你的数据库,然后用ID的
autoincrement
重新运行应用程序。正如你所说,我已经尝试过了。我删除了数据库,并使用autoincrement重新运行我的应用程序。应用程序在第二次插入时崩溃。但是,我没有在主键中传递任何内容。我也尝试了自动递增。但其中一个字段UID(请参阅创建表查询)将在同步时从服务器更新,我无法向其添加任何内容。这可能是问题的原因吗?请检查您插入的数据,并确保两条记录没有相同的密钥。除了两条具有相同密钥的记录之外,我在这里没有看到任何问题。但是,我没有在主键中传递任何内容。我也尝试了自动递增。但其中一个字段UID(请参阅创建表查询)将在同步时从服务器更新,我无法向其添加任何内容。这可能是问题的原因吗?请检查您插入的数据,并确保两条记录没有相同的密钥。在这里,除了两条具有相同密钥的记录之外,我看不到任何问题。