Вставка данных в sqlite (вторая таблица с внешним ключом) - PullRequest
0 голосов
/ 04 ноября 2011

Я сталкиваюсь с некоторыми трудностями при вставке данных в sqlite.Приложение представляет собой приложение для викторины, где пользователю необходимо сначала ввести имя пользователя (без пароля), а затем просмотреть результат.Перед началом теста пользователь должен сначала создать имя пользователя (если он новый), затем выбрать имя пользователя (будут перечислены все имена пользователей), поэтому пользователь должен щелкнуть соответствующее имя пользователя.Имя пользователя (таблица almag) может быть успешно вставлено, но не для таблицы результатов.Две таблицы связаны с внешним ключом, который является userId.когда пользователь завершит тест и нажмет определенную кнопку (кнопку меню), я хочу, чтобы счет был сохранен автоматически, но я все еще сталкиваюсь с трудностями, чтобы сделать это .. Я надеюсь, что кто-то может помочь.

Вот некоторые кодыприложения.

Java-файл базы данных

public class DatabaseUsername extends SQLiteOpenHelper {
private static final String DATABASE_NAME="use.db";
private static final int SCHEMA_VERSION=1;
private View _id;
public DatabaseUsername(Context context) {
    super(context, DATABASE_NAME, null, SCHEMA_VERSION);
}   
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE almag (_id INTEGER PRIMARY KEY AUTOINCREMENT, nama TEXT, jekel TEXT);");
    db.execSQL("CREATE TABLE score (_id INTEGER PRIMARY KEY AUTOINCREMENT, score INTEGER, userId INTEGER NOT NULL, FOREIGN KEY (userId) REFERENCES almag(_id) ON DELETE CASCADE);"); //create table score
    db.execSQL("PRAGMA foreign_keys = ON;");
}
@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, nama, jekel FROM almag ORDER BY nama",null));
}
public Cursor getById(String id) {
    String[] args={id};
    return(getReadableDatabase().rawQuery("SELECT _id, nama, jekel FROM almag WHERE _ID=?",args));
}
public void insert(String nama, String jekel) {
    ContentValues cv=new ContentValues();
    cv.put("nama", nama);
    cv.put("jekel", jekel);     
    getWritableDatabase().insert("almag", "nama", cv);
}
public void insertScore (int _id, int score) {
    ContentValues cv=new ContentValues();   
    cv.put("_id", _id);
    cv.put("score", score);
    getWritableDatabase().insert("score", "score", cv);
}
public void setUsername(View _id) {
    this._id = _id;
}
public String getNama(Cursor c) {
    return(c.getString(1));
}
public String getJekel(Cursor c) {
    return(c.getString(2));
}
}

TheEndActivity

public class TheEndActivity extends Activity implements OnClickListener {

DatabaseUsername helper=null;
private int _id;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.theendactivitylayout);
    helper=new DatabaseUsername(this);
    final SetGame currentGame = ((TheApplication)getApplication()).getCurrentGame();
    String result = "Your Score is " + currentGame.getRight() + "/" + currentGame.getNumRounds() + ".. ";
    String comment = Mark.getResultComment(currentGame.getRight(), currentGame.getNumRounds(), getDifficultySettings());    

    TextView results = (TextView)findViewById(R.id.endgameResult);
    results.setText(result + comment);

    int image = Mark.getResultImage(currentGame.getRight(), currentGame.getNumRounds(), getDifficultySettings());
    ImageView resultImage = (ImageView)findViewById(R.id.resultPage);
    resultImage.setImageResource(image);

    Button finishBtn = (Button) findViewById(R.id.finishBtn);
    Button answerBtn = (Button) findViewById(R.id.answerBtn);
    finishBtn.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {       
            Intent i = new Intent(TheEndActivity.this, QuizAppActivity.class);
            startActivity(i);
            helper.insertScore(_id, currentGame.getRight());
    }
    });

    answerBtn.setOnClickListener(new View.OnClickListener() {   
        @Override
        public void onClick(View v) {

                Intent i = new Intent(TheEndActivity.this, AnsActivity.class);
                startActivityForResult(i, AppRule.PLAYBUTTON);
        }
        });

}

private int getDifficultySettings() {
    SharedPreferences settings = getSharedPreferences(AppRule.SETTINGS, 0);
    int diff = settings.getInt(AppRule.DIFFICULTY, 2);
    return diff;
}


    public boolean onKeyDown(int keyCode, KeyEvent event)
{
    switch (keyCode)
    {
    case KeyEvent.KEYCODE_BACK :
        return true;
    }

    return super.onKeyDown(keyCode, event);
}


    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

    }}

UsernameList

public class UsernameList extends ListActivity {
public final static String ID_EXTRA="com.rika.fyp.player";
Cursor model=null;
AlmagAdapter adapter=null;
EditText nama=null;
RadioGroup jekel=null;
DatabaseUsername helper=null;

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

    helper=new DatabaseUsername(this);

    nama=(EditText)findViewById(R.id.nama);
    jekel=(RadioGroup)findViewById(R.id.jekel); 
    model=helper.getAll();
    startManagingCursor(model);
    adapter=new AlmagAdapter(model);
    setListAdapter(adapter);
}

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

    helper.close();
}

@Override
public void onListItemClick(ListView list, View view,int position, long id) {

    helper.setUsername(nama);
    Intent i=new Intent(UsernameList.this, QuizAppActivity.class);

    i.putExtra(ID_EXTRA, String.valueOf(id));
    startActivity(i);
}       

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    new MenuInflater(this).inflate(R.menu.option, menu);

    return(super.onCreateOptionsMenu(menu));
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()==R.id.add) {
        startActivity(new Intent(UsernameList.this, UsernameRegister.class));

        return(true);
    }

    return(super.onOptionsItemSelected(item));
}

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

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

        }

        helper.insert(nama.getText().toString(), type);

        model.requery();
    }
};

class AlmagAdapter extends CursorAdapter {
    AlmagAdapter(Cursor c) {
        super(UsernameList.this, c);
    }

    @Override
    public void bindView(View row, Context ctxt,Cursor c) {
        AlmagHolder holder=(AlmagHolder)row.getTag();
        holder.populateFrom(c, helper);
    }

    @Override
    public View newView(Context ctxt, Cursor c,ViewGroup parent) {
        LayoutInflater inflater=getLayoutInflater();
        View row=inflater.inflate(R.layout.usernamerow, parent, false);
        AlmagHolder holder=new AlmagHolder(row);
        row.setTag(holder);
        return(row);
    }
}

static class AlmagHolder {
    private TextView nama=null;
    private TextView alamat=null;
    private ImageView icon=null;
    private View row=null;

    AlmagHolder(View row) {
        this.row=row;

        nama=(TextView)row.findViewById(R.id.title);
        icon=(ImageView)row.findViewById(R.id.icon);
    }

    void populateFrom(Cursor c, DatabaseUsername helper) {
        nama.setText(helper.getNama(c));
        if (helper.getJekel(c).equals("Pria")) {
            icon.setImageResource(R.drawable.pria);
        }
        else if (helper.getJekel(c).equals("Perempuan")) {
            icon.setImageResource(R.drawable.perempuan);
        }

    }
}}

Я получил их в logcat

ОШИБКА / База данных (319): ошибка при вставке оценки = 20 _id = 0

ОШИБКА / База данных (319): android.database.sqlite.SQLiteConstraintException: код ошибки 19: ограничение не выполнено

1 Ответ

0 голосов
/ 04 ноября 2011

Ваш onCreate() метод выглядит слишком сложным.Попробуйте вместо этого:

public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE almag (_id INTEGER PRIMARY KEY AUTOINCREMENT, nama TEXT, jekel TEXT);");
    db.execSQL("CREATE TABLE score (_id INTEGER PRIMARY KEY AUTOINCREMENT, score INTEGER, userId FOREIGN KEY REFERENCES almag(_id) ON DELETE CASCADE);"); //create table score
}

Я не могу гарантировать, что это решит вашу проблему, но в простоте есть способ прояснить ситуацию.

Также попробуйте изменить методы вставки следующим образом:

public void insert(String nama, String jekel) {
    ContentValues cv=new ContentValues();
    cv.put("nama", nama);
    cv.put("jekel", jekel);     
    getWritableDatabase().insert("almag", null, cv);
}

public void insertScore (int _id, int score) {
    ContentValues cv=new ContentValues();   
    cv.put("_id", _id);
    cv.put("score", score);
    getWritableDatabase().insert("score", null, cv);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...