我使用的数据库有三个表,学生,答案,问题 答案表包含studentid,questionid,answer 我在SQLITE中用三个表构建了一个数据库,所以当加载应用程序时,我设置学生去检查答案。 问题是从这个表中获取历史记录,在ListView中,我之前使用过一个适配器,但在它显示从表中显示的直接信息之前很容易,但是对于表的答案,我必须得到studentntid和显示名称,获取问题并显示问题本身。 适配器不起作用,因为类没有我想要显示的相同的东西,所以我创建了一个方法,可以给我我想要的信息:
public ArrayList getTableHisto() {
ArrayList lst = new ArrayList();
int zise = lst.size();
SQLiteDatabase db = this.getReadableDatabase();
Cursor c = db.rawQuery(" SELECT Q." + KEY_QUESTION + " , U." + KEY_NOM + " , U." + KEY_PRENOM + " , A." + KEY_DATE + " , " + KEY_REPONSE + " from " + TABLE_QUESTION + " Q, " + TABLE_USER + " U, " + TABLE_ANSWER + " A WHERE Q." + KEY_ID_QUESTION + " = A." + KEY_ID_QUESTION + "AND A." + KEY_MATRICULE + " = U." + KEY_MATRICULE, null);
if (c.moveToFirst()) {
while (c.isAfterLast() == false) {
String nom = c.getString(c.getColumnIndex(KEY_NOM)).toString();
// String prenom = c.getString(c.getColumnIndex(KEY_PRENOM)).toString();
String quest = c.getString(c.getColumnIndex(KEY_QUESTION)).toString();
String reponse = c.getString(c.getColumnIndex(KEY_REPONSE)).toString();
String date = c.getString(c.getColumnIndex(KEY_DATE)).toString();
lst.add(nom);
// lst.add(prenom);
lst.add(quest);
lst.add(reponse);
lst.add(date);
c.moveToNext();
}
}
return lst;
}
我认为它正在工作,因为我尝试了sql查询,但问题是将它改编为在histrow.java中有四列的ListView:
<LinearLayout
android:layout_width="368dp"
android:layout_height="495dp"
android:orientation="horizontal"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<TextView
android:id="@+id/hname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="nom" />
<TextView
android:id="@+id/hquest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="ques" />
<TextView
android:id="@+id/hrep"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="rep" />
<TextView
android:id="@+id/hdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="date" />
</LinearLayout>
历史记录页面只有一个ID为list的ListView 如果有人有任何想法,请不要犹豫。 感谢
答案 0 :(得分:0)
您需要使用自定义适配器或使用CursorAdapter,后者可能是最简单的,因为它们不需要自定义它。
如果您使用CursorAdapter,而不是从提取的Cursor构建ArrayList,则直接使用Cursor。
你可以: -
public Cursor getTableHistoAsCursor() {
SQLiteDatabase db = this.getReadableDatabase();
return db.rawQuery(" SELECT Q." + KEY_QUESTION + " , U." + KEY_NOM + " , U." + KEY_PRENOM + " , A." + KEY_DATE + " , " + KEY_REPONSE + " from " + TABLE_QUESTION + " Q, " + TABLE_USER + " U, " + TABLE_ANSWER + " A WHERE Q." + KEY_ID_QUESTION + " = A." + KEY_ID_QUESTION + "AND A." + KEY_MATRICULE + " = U." + KEY_MATRICULE, null);
}
相应的活动可以是: -
public class MainActivity extends AppCompatActivity {
DatabaseHelper mDBHlpr; //<<<< Note 1
SimpleCursorAdapter mSCA;
Cursor mCsr;
ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //<<<< Note 2
mListView = (ListView) findViewById(R.id.yourlistview); //<<<< Note 3
mDBHlpr = new DatabaseHelper(this); //<<<< Note 1
mCsr = mDBHlpr.getTableHistoAsCursor();
mSCA = new SimpleCursorAdapter(this,
R.layout.yourlayout, //<<<< Note 2
new String[]{KEY_NOM, KEY_QUESTION, KEY_REPONSE, KEY_DATE}, //<<<< Note 4
new int[]{R.id.hname, R.id.hquest, R.id.hrep, R.id.hdate}, //<<<< Note 5
0
);
mListView.setAdapter(mSCA);
}
KEY_NOM
,KEY_QUESTION
等可能需要进一步限定,例如DatabaseHelper.KEY_NOM
(注1)或更改为使用硬编码字符串,例如"name"
,"question"
等取决于如何定义。