استفاده از چند Bundle برای دریافت اطلاعات دیتابیس (حل شد)
سلام دوستان عزیزم؛
برای ارسال اطلاعات intent که حاوی اطلاعات یک دیتابیس هست به اکتیویتی دیگر از putExtra استفاده کردم و خب طبیعتأ برای دریافت اطلاعات هم از Bundle استفاده کردم، برای دریافت اطلاعات استفاده از یک Bundle بدون هیچگونه مشکلی اجرا و نمایش داده میشود ولی استفاده از دو یا چند Bundle بصورت جداگانه کرش در برنامه اتفاق میفته، با اینکه در رکوردهای جدول در دیتابیس اطلاعات وجود داره، ممنون میشم راهنمایی بفرمایید که استفاده از چند Bundle به چه صورت امکان پذیره؟
اول از همه فیلد مربوط به کلاس G
public static String display(int row, int field, String table) { Cursor cursor = G.database.rawQuery("SELECT * FROM "table_name", null); cursor.moveToPosition(row); String strfield = cursor.getString(field); return strfield ; }
کلاس اکتیویتی اول که اطلاعات intent رو میفرسته
OnClickListener ButtonClickListener = new OnClickListener() { @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn1: String text1_btn1 = G.display(0, 2, "table_name"); String text2_btn1 = G.display(0, 3, "table_name"); Intent intent1 = new Intent(ActivityAval.this, ActivityMatn.class); intent1.putExtra("TEXT_1_BTN_1", text1_btn1); intent1.putExtra("TEXT_2_BTN_1",text2_btn1); startActivity(intent1); break; case R.id.btn2: String text1_btn2 = G.display(1, 2, "table_name"); String text2_btn2 = G.display(1, 3, "table_name"); Intent intent2 = new Intent(ActivityAval.this, ActivityMatn.class); intent2.putExtra("TEXT_1_BTN_2", text1_btn2); intent2.putExtra("TEXT_2_BTN_2", ,text2_btn2); startActivity(intent2); break; case R.id.btn3: String text1_btn3 = G.display(2, 2, "table_name"); String text2_btn3 = G.display(2, 3, "table_name"); Intent intent3 = new Intent(ActivityAval.this, ActivityMatn.class); intent3.putExtra("TEXT_1_BTN_3", text1_btn3); intent3.putExtra("TEXT_2_BTN_3", ,text2_btn3); startActivity(intent3); break; default: // some code } } }; for (int i = 0; i < 3; i++) { buttons[i].setOnClickListener(ButtonClickListener); }
کلاس اکتیویتی دوم که اطلاعات intent رو دریافت میکنه و در TextViw نمایش میده
Bundle extras1 = getIntent().getExtras(); Bundle extras2 = getIntent().getExtras(); Bundle extras3 = getIntent().getExtras(); if (extras1 != null) { String TEXT_1_BTN_1 = extras1.getString("TEXT_1_BTN_1"); String TEXT_2_BTN_1 = extras1.getString("TEXT_2_BTN_1"); txt1.setText(TEXT_1_BTN_1); txt2.setText(TEXT_2_BTN_1); } else if (extras2 != null) { String TEXT_1_BTN_2 = extras2.getString("TEXT_1_BTN_2"); String TEXT_2_BTN_2 = extras2.getString("TEXT_2_BTN_2"); txt1.setText(TEXT_1_BTN_2); txt2.setText(TEXT_2_BTN_2); } else if (extras3 != null) { String TEXT_1_BTN_3 = extras3.getString("TEXT_1_BTN_3"); String TEXT_2_BTN_3 = extras3.getString("TEXT_2_BTN_3"); txt1.setText(TEXT_1_BTN_3); txt2.setText(TEXT_2_BTN_3); } else { Toast.makeText(getApplicationContext(), "NO EXIST !", Toast.LENGTH_LONG).show(); }
دوست عزیز هیچ دلیلی نداره از چند Bundle استفاده کنید. میتونید در اکتیویتی دوم به این صورت data رو بگیرید.
Bundle extras = getIntent().getExtras(); if (extras != null) { String txt1 = "",txt2 = ""; if (extras.getString("TEXT_1_BTN_1") != null && extras.getString("TEXT_2_BTN_1") != null) { txt1.setText(extras.getString("TEXT_1_BTN_1")); txt2.setText(extras.getString("TEXT_2_BTN_1")); } else if (extras.getString("TEXT_1_BTN_2") != null && extras.getString("TEXT_2_BTN_2") != null) { txt1.setText(extras.getString("TEXT_1_BTN_2")); txt2.setText(extras.getString("TEXT_2_BTN_2")); } else if (extras.getString("TEXT_1_BTN_3") != null && extras.getString("TEXT_2_BTN_3") != null) { txt1.setText(extras.getString("TEXT_1_BTN_3")); txt2.setText(extras.getString("TEXT_2_BTN_3")); } else { Toast.makeText(getApplicationContext(), "NO EXIST !", Toast.LENGTH_LONG).show(); } }
این کد کاملا درست کار میکنه و هیچ مشکلی نداره. من فکر میکردم با ارسال دیتاهای بیشتر از این مشکل دارید.
حالا مشکلتون کجاست؟ احتمال زیاد یا حروف key رو اشتباه وارد کردید که نمیتونه پیداش کنه، یا خالی ارسال میکنید، یا ویو ها کست نشده و یا ... . خطای لاگ کت رو اگر قرار بدید بهتر میشه گفت مشکل از کجاست ولی این کد هیچ مشکلی نداره.
برای استارت کردن اکتیویتی هم یه تست کنید ببینید کد زیر فرقی داره یا خیر.(فکر نکنم فرقی داشته باشه ولی ضرر نداره)
ActivityAval.this.startActivity(intent);
نکته: برای ارسال چند object نیازی نیست به تعداد object ها putExtras کنید. ممکنه شما بخواید یک آرایه رو بفرستید به یک اکتیویتی، نباید بشینید یک حلقه putExtras بنویسید که. راه حلش استفاده از Serializable هاست.
یک کلاس به صورت زیر بسازید:
public class StructScore implements Serializable{ public int score; public String name; public String date; public String imgUrl; }
حالا یک object از این کلاس بسازید. میتونه ArrayList هم باشه:
ArrayList<StructScore> scores = new ArrayList<>(); for(int i=1 ; i<= 10 ; i++) { StructScore score = new StructScore(); score.name = "name : " + i; score.date = "date : " + i; score.imgUrl = "url : " + i; score.score = i + 1; scores.add(score); }
حالا به این صورت ارسالش میکنیم:
Intent intent = new Intent(MainActivity.this,Splash.class); intent.putExtra("SOME_DATA",scores); MainActivity.this.startActivity(intent);
و در اکتیویتی بعدی به این صورت میگیرمشون:
Bundle extras = getIntent().getExtras(); if(extras != null){ ArrayList<StructScore> scores = (ArrayList<StructScore>) extras.getSerializable("SOME_DATA"); }
البته این کد ممکنه خطا داشته باشه، اگر به این روش ها نوشته بشه بهتره:
روش اول:
Bundle extras = getIntent().getExtras(); if(extras != null){ ArrayList<StructScore> scores; if( extras.getSerializable("SOME_DATA") != null) scores = (ArrayList<StructScore>) extras.getSerializable("SOME_DATA"); }
روش دوم:
Bundle extras = getIntent().getExtras(); if(extras != null){ try { ArrayList<StructScore> scores = (ArrayList<StructScore>) extras.getSerializable("SOME_DATA"); }catch (Exception e){ e.printStackTrace(); } }
باز هر سوالی داشتید بپرسید جواب بدم. خطای لاگ کت رو هم اضافه کنید به صورت سوال.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .