запретить пользователю вводить те же данные в базу данных (Android) - PullRequest
0 голосов
/ 17 декабря 2011

для предотвращения ввода пользователем тех же данных в базу данных, я использую это

db.execSQL("CREATE UNIQUE INDEX DIFFERENT ON user(name, gender)");

Мой вопрос: как я могу показать ошибку конечным пользователям, которые сообщают им, что данные, которые они вводят, уже существуют?Или есть другой способ запретить пользователю вводить те же данные и показывать ошибку пользователю?

DatabaseUsername.java (где я помещаю уникальный индекс)

public class DatabaseUsername extends SQLiteOpenHelper {
private static final String DATABASE_NAME="rikartoiy.db";
private static final int SCHEMA_VERSION=1;


public DatabaseUsername(Context context) {
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE user (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, gender TEXT);");
    db.execSQL("CREATE TABLE score (_id INTEGER PRIMARY KEY AUTOINCREMENT, score INTEGER, dateTaken TEXT, userId INTEGER NOT NULL, FOREIGN KEY (userId) REFERENCES user(_id) ON DELETE CASCADE);"); //create table score
    db.execSQL("CREATE UNIQUE INDEX DIFFERENT ON user(name, gender)")


}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // no-op, since will not be called until 2nd schema
    // version exists

}

public Cursor getAll() {
    return(getReadableDatabase()
                    .rawQuery("SELECT _id, name, gender FROM user ORDER BY name",
                                        null));
}

public Cursor getCurScore() {
    return(getReadableDatabase()
                    .rawQuery("SELECT alm._id, alm.name, alm.gender, sc._id, sc.score, sc.userId FROM user alm, score sc WHERE sc.userId = alm._id AND alm._id = ?",
                                        null));
}

public Cursor getById(String id) {
    String[] args={id};

    return(getReadableDatabase()
                    .rawQuery("SELECT _id FROM user WHERE _ID=?",
                                        args)); 
}

public void insert(String name, String gender) {
    ContentValues cv=new ContentValues();

    cv.put("name", name);
    cv.put("gender", gender);

    getWritableDatabase().insert("user", name, cv);
}

public void insertMark(int score, int userId, String dateTaken) {
    ContentValues cv=new ContentValues();

    cv.put("score", score);
    cv.put("userId", userId);
    cv.put("dateTaken", dateTaken);

    getWritableDatabase().insert("score", null, cv);
}

public String getName(Cursor c) {
    return(c.getString(1));
}

public String getGender(Cursor c) {
    return(c.getString(2));
}

public int getScore(Cursor c) {
    return(c.getInt(3));
}}

UsernameRegister.java (где пользователь вводит данные)

public class UsernameRegister extends Activity {
EditText name=null;
RadioGroup gender=null;
DatabaseUsername helper=null;
String almagId=null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.usernameregister);

    helper=new DatabaseUsername(this);

    name=(EditText)findViewById(R.id.name);
    gender=(RadioGroup)findViewById(R.id.gender);

    Button save=(Button)findViewById(R.id.save);

    save.setOnClickListener(onSave);

    almagId=getIntent().getStringExtra(UsernameList.ID_EXTRA);

    if (almagId!=null) {
        load();
    }
}

@Override
public void onDestroy() {
    super.onDestroy();

    helper.close();
}

private void load() {
    Cursor c=helper.getById(almagId);

    c.moveToFirst();        
    name.setText(helper.getName(c));

    if (helper.getGender(c).equals("Pria")) {
        gender.check(R.id.pria);
    }
    else if (helper.getGender(c).equals("Perempuan")) {
        gender.check(R.id.perempuan);
    }


    c.close();
}

private View.OnClickListener onSave=new View.OnClickListener() {
    public void onClick(View v) {
        String type=null;

        switch (gender.getCheckedRadioButtonId()) {
            case R.id.pria:
                type="Pria";
                break;
            case R.id.perempuan:
                type="Perempuan";
                break;

        }

        String namanama = name.getText().toString();

        if (almagId==null) {
            helper.insert(namanama, type);



            if(TextUtils.isEmpty(namanama)) 
            { 
                name.setError("Your name can't be empty"); 
                return; 
            }

            else if (namanama.length() < 3 ) 
            { 
                name.setError("Your name can't less than 3"); 
                return; 
            }

            else if (namanama.length() > 10 ) 
            { 
                name.setError("Your name can't more than 3"); 
                return; 
            }

        }


        finish();
    }
};}

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

Вы можете использовать возвращаемое значение mDb.insert();

Returns

    the row ID of the newly inserted row, or -1 if an error occurred 

, если оно возвращает -1, и вы уверены, что ошибка не может быть вызвана чем-то другим, кроме повторяющихся значений, сообщите пользовательские значения ужесуществовать.

Или вы можете создать функцию, которая ищет значения, введенные пользователем в базу данных, если эти значения существуют, покажите пользователю сообщение перед их вставкой.

0 голосов
/ 17 декабря 2011

Вы можете достичь той же функциональности, проверяя данные в базе данных перед вставкой, я думаю.

...