2017-02-04 5 views
0

Я пытаюсь создать таблицу администратора. Ввод ввода из приложения и добавление его в таблицу. Мой класс admin используется для получения и установки значений. Я много пробовал, но не смог идентифицировать проблему.Почему я получаю ошибку ограничения SQLlite (Code = 19), даже если я не оставляю ни одного поля null?

Это из моего класса Data Base 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 email = AAA name = AAA role = parent contact = 1211 eid = 0 pass = AAA andr Код ошибки 19:: oid.database.sqlite.SQLiteConstraintException ограничение не удалось на android.database.sqlite.SQLiteStatement.native_execute (нативный метод) на android.database.sqlite.SQLiteStatement.execute (SQLiteStatement.java:61) на андроид .database.sqlite.SQLiteDatabase.insertWithOnConflict (SQLiteDatabase.java:1582) в android.database.sqlite.SQLiteDatabase.insert (SQLiteDatabase.java:1426) at com.thebitshoes.classproject.dao.SchoolDBHandler.registerAdmin (SchoolDBHandler.java : 191) at com.thebitshoes.classproject.AdminSignUp.register (AdminSignUp.java:109) по адресу java.lang.reflect.Method.invokeNative (собственный метод) на java.lang.reflect.Method.invoke (Method.java:507) на android.support.v7.app.AppCompatViewInflater $ DeclaredOnClickListener.onClick (AppCompatViewInflater.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 (ActivityThread.java:3683) на 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 (Native Method)

ответ

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" 

Вы не показали нам, как вы определили класс «Администратор» (параметр «OBJ» в registerAdmin()), ни то, что «admin_id» имя столбца на самом деле (так что мы действительно не знаем, как сопоставить имена в сообщении об ошибке с именами в вашем определении).

Но сообщение определенно встречается в «registerAdmin()», и, поскольку у вас есть только одно обязательное поле («ADMIN_ID»), это определенно место для начала поиска.

'Надеюсь, что это поможет!

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

UPDATE: Есть несколько различных вопросов здесь:

  1. Q: Почему я получаю SQLiteConstraintException: error code 19?

    A: Ошибка исходит от registerAdmin(), колонка ADMIN_ID (aka "eid"). Вы, видимо, уже зарегистрировали администратора, с двойным идентификатором «0».

    Не делайте этого :) Первичные ключи должны быть не пустыми и должны быть уникальными.

  2. В: Должен ли я разрешать его автоматически увеличивать по умолчанию?

    A: В общем, для большинства других баз данных я бы ответил «обязательно!».

    Однако, я видел некоторые статьи, обескураживающие AUTO_INCREMENT в SQLLite. Например: http://www.sqlitetutorial.net/sqlite-autoincrement/

    Я оставлю выбор до вас. Однако, если вы разрешаете SQLLite назначать идентификатор, убедитесь, что он синхронизирован с вашим Java-администратором (obj).

  3. ТАКЖЕ: вы не можете ХОТИТЕ вставить, если администратор уже существует.

    Если вы хотите изменить СУЩЕСТВУЮЩЕГО администратора, то вы хотите, чтобы строка 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_ID или admin_id.

И не забывайте применять те же принципы при регистрации студентов!

+0

Что такое 'eid = 0'? –

+0

Думаю, у вас уже есть запись, где eid = 0, и вы пытаетесь добавить другую с 0. – MikeT

+0

ADMIN_ID = "eid"; – ThePercept