2017-02-04 45 views
0

我想創建一個管理表。從應用程序的輸入並將其添加到表。我的管理員類用於獲取和設置值。 我嘗試了很多,但無法確定問題。即使我沒有離開任何字段爲空,爲什麼我會得到SQLlite約束錯誤(代碼= 19)?

這是從我的數據庫Helper類

@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通過= AAA andr oid.database.sqlite.SQLiteConstraintException:錯誤代碼19:約束失敗 at android.database.sqlite.SQLiteStatement.native_execute(Native Method) at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61) at android (SQLiteDatabase.java:1426) at com.thebitshoes.classproject.dao.SchoolDBHandler.registerAdmin(SchoolDBHandler.java(SQLiteDatabase.java:1482) :191) at com.thebitshoes.classproject.AdminSignUp.register(AdminSignUp.java:109) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:507) at android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) at 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) at android.os.Looper.loop(Looper.java:130) at android.app.ActivityThread.main(ActivityThread.java:3683) at java.lang.reflect.Method.invokeNative(本地方法) at java.lang.reflect.Method.invoke(Method.java:507) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839) at com.android.internal.os。 ZygoteInit.main(ZygoteInit.java:597) 在dalvik.system.NativeStart.main(本機方法)

回答

1

你 「的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 

你registerAdmin「:

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" 

你還沒有告訴我們你是如何定義的類「管理員」,也不是什麼「ADMIN_ID」列名其實(在registerAdmin()在「目標文件」參數)是(所以我們真的不知道如何將錯誤消息中的名稱與定義中的名稱進行映射)。

但是這個消息絕對是在「registerAdmin()」中出現的,因爲你只有一個必填字段(「ADMIN_ID」),所以這絕對是開始尋找的地方。

'希望有幫助!

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

更新:這裏有幾個不同的問題:

  1. 問:爲什麼我收到SQLiteConstraintException: error code 19

    答:錯誤來自registerAdmin(),列ADMIN_ID(又名「eid」)。你顯然已經註冊了一個管理員,重複ID爲「0」。

    不要這樣做:)主鍵必須是非空的,並且必須是唯一的。

  2. 問:我應該讓它默認自動增加嗎?答:一般來說,對於大多數其他數據庫,我會回答「當然!」。

    但是,我看到一些文章勸阻SQLLite中的AUTO_INCREMENT。例如:http://www.sqlitetutorial.net/sqlite-autoincrement/

    我會離開你的選擇。但是,如果允許SQLLite分配ID,請確保它與Java「管理員」對象(obj)同步。

  3. ALSO:如果管理員已經存在,您可能不需要要插入

    如果你想修改一個EXISTING管理員,那麼你想要UPDATE這一行。再次

    SQLite UPSERT/UPDATE OR INSERT

 
     -- Try to update any existing row 
     UPDATE players 
     SET user_name='steven', age=32 
     WHERE user_name='steven'; 

     -- If no update happened (i.e. the row didn't exist) then insert one 
     INSERT INTO players (user_name, age) 
     SELECT 'steven', 32 
     WHERE (Select Changes() = 0); 

- 我希望幫助:在這裏尋找更多詳情!

PS: 請考慮將eid重命名爲ADMIN_IDadmin_id

並且不要忘記在註冊學生時應用相同的原則!

+0

什麼是'eid = 0'? –

+0

我認爲你可能已經有一個條目,其中eid = 0,並且你試圖用0添加另一個條目。 – MikeT

+0

ADMIN_ID =「eid」; – ThePercept

相關問題