2011-12-17 20 views
0

は、私の質問は、私は彼らにデータを伝えるエンドユーザーにエラーを表示することができる方法である私は、このがデータベースに入力同じデータにユーザーを防ぐため、ユーザーを防ぐために(アンドロイド)

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(); 
    } 
};} 
+0

ここで、データはデータベースに挿入されますか?そのコードを –

+0

私はコードを追加しました:) – kumisku

+0

もしあなたが既に存在する値を挿入すると、それは間違いなく例外をスローするでしょう、例外が発生した場合、そのデータがすでに存在していることをユーザに知らせてください –

答えて

2

あなたはmDb.insert();

Returns 

    the row ID of the newly inserted row, or -1 if an error occurred 
の戻り値を使用することができます

-1が返された場合は、そのエラーが原因ではないと確信しています重複値以外のメーリングは、すでに存在するユーザ値を伝えます。

また、ユーザーがデータベースに入力した値を検索する関数を作成することもできます(これらの値が存在する場合は、挿入する前にユーザーにメッセージを表示します)。

+0

私はチェックする関数を作成するので、ユニークなインデックスを使用する必要はもうありませんか? – kumisku

+0

はいあなたはそれを削除することができます –

+0

あなたの問題が解決したら答えを受け入れることを忘れないでください –

0

挿入する前にデータベースのデータをチェックすることで、同じ機能を実現できます。

関連する問題