为什么我得到SQLlite约束错误(代码=19),即使我没有留下任何字段为空



我正在尝试创建一个Admin表。从应用程序中获取输入并将其添加到表中。我的管理类用于获取和设置值。我试了很多,但还没能确定问题。

这是来自我的数据库助手类

@Override
public void onCreate(SQLiteDatabase db) {
String query_create_administrator="create table "+TBL_ADMINISTRATOR+" ( "+ADMIN_ID+" INTEGER PRIMARY KEY, "+ADMIN_NAME+
" TEXT, "+ADMIN_MAIL+" TEXT, "+ADMIN_PASSWORD+" TEXT, "+ADMIN_CONTACT+" TEXT, "+ADMIN_ADDRESS+" TEXT, "+
ADMIN_ROLE+" TEXT, "+STATUS+" TEXT)";
String query_create_student="create table "+TBL_STUDENT+" ( "+STUDENT_ID+" INTEGER PRIMARY KEY, "
+STUDENT_PID+" TEXT, "+STUDENT_NAME+" TEXT, "+STUDENT_MAIL+" TEXT, "+STUDENT_PASSWORD+" TEXT, "
+STUDENT_CONTACT+" TEXT, "+STUDENT_ADDRESS+" TEXT, "+STUDENT_COURSE+" TEXT, "+STUDENT_YEAR+" TEXT, "
+STUDENT_BRANCH+" TEXT)";
db.execSQL(query_create_administrator);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long registerAdmin(Administrator obj){
SQLiteDatabase db=getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(ADMIN_ID,obj.getId());
cv.put(ADMIN_NAME,obj.getName());
cv.put(ADMIN_MAIL,obj.getMail());
cv.put(ADMIN_PASSWORD,obj.getPassword());
cv.put(ADMIN_CONTACT,obj.getContact());
cv.put(ADMIN_ADDRESS,obj.getAddress());
cv.put(ADMIN_ROLE,obj.getRole());
cv.put(STATUS,obj.getStatus());
db.insert(TBL_ADMINISTRATOR,null,cv);
long done=3;
return done;
}

这是活动类中的方法

public void register(View v){
long check=0;
obj=new Administrator();
SchoolDBHandler db=new SchoolDBHandler(this);
String n,m,p,c,a;
n=name.getText().toString();
m=mail.getText().toString();
p=pass.getText().toString();
c=contact.getText().toString();
a=address.getText().toString();
if(n.equalsIgnoreCase("")||m.equalsIgnoreCase("")||p.equalsIgnoreCase("")||c.equalsIgnoreCase("")||a.equalsIgnoreCase(""))
{
Toast.makeText(getApplicationContext(),"All fields are mandatory",Toast.LENGTH_SHORT).show();
}
else {
obj.setName(n);
obj.setMail(m);
obj.setPassword(p);
obj.setContact(c);
obj.setAddress(a);
obj.setStatus("Active");
if(role_select2!=null)obj.setRole(role_select2);
check=db.registerAdmin(obj);
if(check>0) {
resetEditTextxs();
Toast.makeText(getApplicationContext(),"Successfully Created",Toast.LENGTH_SHORT).show();
}
else Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_SHORT).show();
}
}

这是错误日志:

E/数据库:错误插入状态=活动地址=AAA电子邮件=AAA名称=AAA角色=父联系人=1211 eid=0 pass=AAAandroid.database.sqlite.SQLiteConstraintException:错误代码19:约束失败在android.database.sqlite.SQLiteStatement.nature_execute(native Method)在android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1582)在android.database.sqlite.SQLiteDatabase.insert上(SQLiteDatabase.java:1426)网址:com.thebitshoes.classproject.dao.SchoolDBHandler.registerAdmin(SchoolDBHandler.java:191)网址:com.thebitshoes.classproject.AdminSignUp.register(AdminSignUp.java:109)位于java.lang.reflect.Method.invokeNative(Native Method)位于java.lang.reflect.Method.ioke(Method.java:507)在android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewExplater.java:288)在android.view.view.performClick(view.java:2485)在android.view.view$PerformClick.run(view.java:9080)在android.os.Handler.handleCallback(Handler.java:587)在android.os.Handler.dispatchMessage(Handler.java:92)在android.os.Looper.loop(Looper.java:130)在android.app.ActivityThread.main(ActivityThreads.java:3683)位于java.lang.reflect.Method.invokeNative(Native Method)位于java.lang.reflect.Method.ioke(Method.java:507)网址:com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:597)在dalvik.system.NativeStart.main(本地方法)

您的"onCreate:">

public void onCreate(SQLiteDatabase db) {
String query_create_administrator="create table "+TBL_ADMINISTRATOR+" ( "+ADMIN_ID+" INTEGER PRIMARY KEY, "+ADMIN_NAME+
" TEXT, "+ADMIN_MAIL+" TEXT, "+ADMIN_PASSWORD+" TEXT, "+ADMIN_CONTACT+" TEXT, "+ADMIN_ADDRESS+" TEXT, "+
ADMIN_ROLE+" TEXT, "+STATUS+" TEXT)";
<= ADMIN_ID is your primary key: it cannot be null

您的注册管理员":

public long registerAdmin(Administrator obj){
SQLiteDatabase db=getWritableDatabase();
ContentValues cv=new ContentValues();
cv.put(ADMIN_ID,obj.getId());
cv.put(ADMIN_NAME,obj.getName());
cv.put(ADMIN_MAIL,obj.getMail());
cv.put(ADMIN_PASSWORD,obj.getPassword());
cv.put(ADMIN_CONTACT,obj.getContact());
cv.put(ADMIN_ADDRESS,obj.getAddress());
cv.put(ADMIN_ROLE,obj.getRole());
cv.put(STATUS,obj.getStatus());
db.insert(TBL_ADMINISTRATOR,null,cv);
<= It looks like you're TRYING to assign an admin_id...

您的错误信息:

status=Active 
address=AAA 
email=AAA name=AAA 
role=parent 
contact=1211 
eid=0 
<= But ADMIN_ID doesn't appear to be in the actual "insert"

您还没有向我们展示如何定义类"Administrator"(registerAdmin()中的"obj"参数),也没有展示"ADMIN_ID"列名的实际含义(所以我们真的不知道如何将错误消息中的名称与定义中的名称映射)。

但是消息肯定出现在"registerAdmin()"中,而且,因为您只有一个必需的字段("ADMIN_ID"),所以这肯定是开始查找的地方。

"希望能有所帮助!

==============================================

更新:这里有几个不同的问题:

  1. Q:为什么我得到SQLiteConstraintException: error code 19

    A: 错误来自registerAdmin()ADMIN_ID列(也称为"eid")。您显然已经注册了具有重复ID"0"的管理员。

    不要这样做:)主键必须是非null的,并且必须是唯一的。

  2. Q: 我应该让它在默认情况下自动递增吗?

    A: 一般来说,对于大多数其他数据库,我会回答"当然!">

    然而,我看到一些文章不鼓励在SQLLite中使用AUTO_INCREMENT。例如:http://www.sqlitetutorial.net/sqlite-autoincrement/

    我把选择权交给你。但是,如果允许SQLLite分配ID,请确保它与Java"Administrator"对象(obj)同步。

  3. 此外:如果管理员已经存在,您可能不希望插入。

    如果要修改现有管理员,则需要UPDATE该行。查看此处了解更多详细信息:

    SQLite升级/更新或插入

--尝试更新任何现有行更新玩家SET user_name="偶数",年龄=32其中user_name="偶数";--如果没有发生更新(即行不存在),则插入一个插入玩家(用户名、年龄)选择"史蒂文",32岁WHERE(Select Changes()=0)

再次-我希望这有帮助!

PS:请考虑将eid重命名为ADMIN_IDadmin_id

当你注册学生时,不要忘记应用同样的原则!

相关内容

最新更新