Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将sqlite表的id从listview传递给另一个活动_Java_Android_Sqlite_Listview - Fatal编程技术网

Java 将sqlite表的id从listview传递给另一个活动

Java 将sqlite表的id从listview传递给另一个活动,java,android,sqlite,listview,Java,Android,Sqlite,Listview,我很难获得sqlite的id。我有listview,然后我想得到一个sqlite表的id,然后我可以在完成测验后保存分数时使用它 场景是这样的:用户创建用户名(或单击,如果曾经创建过用户名),在他/她单击其中一个用户名后,然后进行测验,完成后,用户将获得分数,然后保存分数,稍后可以查看 数据库代码 public class DatabaseUsername extends SQLiteOpenHelper { private static final String DATABASE_NAME="

我很难获得sqlite的id。我有listview,然后我想得到一个sqlite表的id,然后我可以在完成测验后保存分数时使用它

场景是这样的:用户创建用户名(或单击,如果曾经创建过用户名),在他/她单击其中一个用户名后,然后进行测验,完成后,用户将获得分数,然后保存分数,稍后可以查看

数据库代码

public class DatabaseUsername extends SQLiteOpenHelper {
private static final String DATABASE_NAME="usernm.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 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
}

@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 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 score, int userId) {
    ContentValues cv=new ContentValues();

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


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

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

public static int getId (Cursor c) {
    return(c.getInt(1));
}}
UsernameList.java

public class UsernameList extends ListActivity {
public final static String ID_EXTRA="com.rika.fyp.player";
Cursor model=null;
Cursor mode=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();
}


 public void onListItemClick(ListView parent, View view, int position, long id) {
        Intent intent = new Intent(this, TheEndActivity.class);
        Cursor cursor = (Cursor) adapter.getItem(position);
        intent.putExtra("USER_ID", cursor.getInt(cursor.getColumnIndex("_id")));
        startActivity(intent);

        Intent i=new Intent(UsernameList.this, QuizAppActivity.class);
        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);
        }

    }
}}
TheEndActivity.java

public class TheEndActivity extends Activity implements OnClickListener {

 protected int userId;

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

    userId = getIntent().getIntExtra("USER_ID", 0);
     SQLiteDatabase db = (new DatabaseUsername(this)).getWritableDatabase();
        final Cursor cursor = db.rawQuery("SELECT alm._id, alm.nama FROM almag alm  WHERE emp._id = ?", 
                                new String[]{""+userId});


    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);

    //handle button actions
    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) {

            finish();

            helper.insertScore(currentGame.getRight(), userId);

            Intent i = new Intent(TheEndActivity.this, MainMenu.class);
            startActivity(i);               
    }
    });

    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

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

                helper.insertMark(currentGame.getRight(), userId );
                Intent i = new Intent(TheEndActivity.this, MainMenu.class);
                startActivity(i);
        }
        });
我已经尝试了上面的代码,但仍然可以得到id。我希望有人能帮助我

下面是插入分数的代码(在endActivity.java中)

在Database.java中插入标记

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

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

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

您是否尝试过使用
long id
而不是
int position

    public void onListItemClick(ListView parent, View view, int position, long id) {
        Intent intent = new Intent(this, TheEndActivity.class);
        Cursor cursor = (Cursor) adapter.getItem((int)id);
        intent.putExtra("USER_ID", cursor.getInt(cursor.getColumnIndex("_id")));
        startActivity(intent);

        Intent i=new Intent(UsernameList.this, QuizAppActivity.class);
        startActivity(i);
    }
实际上,进一步看,在这里访问数据库还有什么意义?我认为当您将listview绑定到适配器时,默认情况下_id字段映射到listview的id字段。因此,使用id应该为您提供所需的id,而不是访问数据库

所以不妨试试这个:

public void onListItemClick(ListView parent, View view, int position, long id) {
    Intent intent = new Intent(this, TheEndActivity.class);

    intent.putExtra("USER_ID", (int)id);
    startActivity(intent);

    Intent i=new Intent(UsernameList.this, QuizAppActivity.class);
    startActivity(i);
}

我正在工作,没有安卓环境设置,但我认为这应该可以工作。

谢谢。我需要从db中检索id以连接分数和用户名,然后我可以使用它查看分数。我尝试了你的建议,但出现了错误:(是的,但你没有在UserNameList.java中查询分数,你只是将用户ID传递给EndActivity活动。只需传递ID,在EndActivity中你就可以获取ID并获取分数。我试着添加以下代码:userId=getIntent().getIntExtra(“用户ID”,(int)ID);并保存分数->helper.insertMark(currentGame.getRight(),userId);。但我仍然得到了0。你仍然得到了0吗?从getIntExtra(“用户ID”…)从insertMark返回的0?是的,从insertMark,userId变成了0(无法检索数据库的ID)你说insertMark返回0,但是它的返回类型是void。你在说什么?对不起,我想你的意思不是那么对不起我的误解。没关系,现在我不明白问题是什么。列表视图与用户id不正确有什么关系?问题本质上是什么?问题发生在什么方法中,什么值进入了有问题的方法?listview来自sqlite(almag table),我想检索almag table的_id,它在score table中成为外键,问题是我无法正确检索almag table的_id(仍然为0)。似乎无法正确传递_id(insertMark的第二个参数)