سلام
من دوتا جدول دارم میخوام عنوان های جدول 2 رو از طریق جدول 1 نشون بدم.
اسم جدول هام یکیشون: poems هست و اون یکی poet
حالا تویِ جدول poems یه فیلد به نام poets_id زدم و توی جدول poets اومدم یه id و یه name زدم و اسم شاعرا رو درج کردم.
حالا میخوام از طریق poets_id اسم شاعرو همراه با شعر رو نمایش بدم.
الان از این کد برای نمایش اشعار استفاده میکنم (اینجا گفتم که اونایی که first_category_id برابر 5 هست نمایش بده)
Cursor result = db.rawQuery("SELECT * from poems WHERE first_category_id=5" , null);
باید چکار کنم؟
SELECT poems.*,poet.name AS poetname FROM poems LEFT OUTER JOIN poet ON poems.poets_id=poet.id WHERE first_category_id=5
یه مثال میزنم که بهتر متوجه بشین:
Cursor c = db.rawQuery("SELECT poems.*,poets.name AS poetname FROM poems LEFT OUTER JOIN poets ON poems.poets_id=poets.id WHERE first_category_id=5", null);
ArrayList<String> poetNames = new ArrayList<>();
if (c.moveToFirst()) {
while (c.moveToNext()) {
poetNames.add(c.getString(c.getColumnIndex("poetname")));
}
}
این کد من در فایل DatabaseHandler:
public List<HashMap <String , Object>> getAshar () {
Cursor result = db.rawQuery
("SELECT poems.*,poets.name AS poetname FROM poems LEFT OUTER JOIN poets ON poems.poets_id=poets.id WHERE first_category_id=1" , null);
List<HashMap<String , Object>> all_data= new ArrayList<>();
while (result.moveToNext())
{
HashMap<String , Object> temp= new HashMap<>();
temp.put("id", result.getString(0));
temp.put("first_category_id", result.getString(1));
temp.put("poets_id", result.getString(2));
temp.put("poetry", result.getString(3));
all_data.add(temp);
}
return all_data;
}
اینم کدی که تویِ اکتیویتی که میخوام نمایش بدم:
private ListView contentListView;
private List<HashMap<String , Object>> ashar;
private DatabaseHandler db;
contentListView = (ListView) findViewById(R.id.list_view);
db = new DatabaseHandler( getBaseContext() );
db.open();
ashar = db.getAshar();
String[] from= {"poetry", "poets_id"};
int[] to= {R.id.matne_sher, R.id.shaer};
SimpleAdapter adb = new SimpleAdapter(
getBaseContext() , ashar , R.layout.custom_sher_list , from , to
);
contentListView.setAdapter( adb );
db.close();
الان وقتیکه از کد استفاده میکنم بازم id رو میزنه
اگه میخواین با getString و پارامتر عددی کار کنید دقت کنید که الان جدول نتایج یه ستون اضافه داره و باید به این شکل بخونید:
temp.put("poetname", result.getString(4));
من الان تمام کدم اینطوره:
public List<HashMap <String , Object>> getAshar () {
Cursor c = db.rawQuery("SELECT poems.*,poets.name AS poetname FROM poems LEFT OUTER JOIN poets ON poems.poets_id=poets.id WHERE first_category_id=1", null);
ArrayList<String> poetNames = new ArrayList<>();
if (c.moveToFirst()) {
while (c.moveToNext()) {
poetNames.add(c.getString(c.getColumnIndex("poetname")));
}
}
Cursor result = db.rawQuery
("SELECT poems.*,poets.name AS poetname FROM poems LEFT OUTER JOIN poets ON poems.poets_id=poets.id WHERE first_category_id=1"
, null);
List<HashMap<String , Object>> all_data= new ArrayList<>();
while (result.moveToNext())
{
HashMap<String , Object> temp= new HashMap<>();
temp.put("id", result.getString(0));
temp.put("first_category_id", result.getString(1));
temp.put("poets_id", result.getString(2));
temp.put("poetry", result.getString(3));
temp.put("poetname", result.getString(8));
all_data.add(temp);
}
return all_data;
}
فایل های پیوست هم ستون های جدول های poems و poets هست.
البته poems چهار ستون دیگه داره.
از کد بالا که استفاده میکنم بازم نشون نمیده.
public List<HashMap <String , Object>> getAshar () {
Cursor c = db.rawQuery("SELECT poems.*,poets.name AS poetname FROM poems LEFT OUTER JOIN poets ON poems.poets_id=poets.id WHERE first_category_id=1", null);
List<HashMap<String , Object>> allData = new ArrayList<>();
while (c.moveToNext()) {
HashMap<String , Object> temp = new HashMap<>();
temp.put("id", c.getString(c.getColumnIndex("id"));
temp.put("first_category_id", c.getString(c.getColumnIndex("first_category_id"));
temp.put("poets_id", c.getString(c.getColumnIndex("poets_id"));
temp.put("poetry", c.getString(c.getColumnIndex("poetry"));
temp.put("poetname", c.getString(c.getColumnIndex("poetname"));
allData.add(temp);
}
return allData;
}