بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

استفاده از چند Bundle برای دریافت اطلاعات دیتابیس (حل شد)

مدیریت گفتگو
MeY3am 10 سال پیش
آخرین تغییر: 10 سال پیش

سلام دوستان عزیزم؛

برای ارسال اطلاعات intent که حاوی اطلاعات یک دیتابیس هست به اکتیویتی دیگر از putExtra استفاده کردم و خب طبیعتأ برای دریافت اطلاعات هم از Bundle استفاده کردم، برای دریافت اطلاعات استفاده از یک Bundle بدون هیچگونه مشکلی اجرا و نمایش داده میشود ولی استفاده از دو یا چند Bundle بصورت جداگانه کرش در برنامه اتفاق میفته، با اینکه در رکوردهای جدول در دیتابیس اطلاعات وجود داره، ممنون میشم راهنمایی بفرمایید که استفاده از چند Bundle به چه صورت امکان پذیره؟

نظرات

Hajhosseini 10 سال پیش
میثم جان سوالتون گنگ هست. یا نمونه کد بذارید یا بگید دقیقا میخواید چه پارامتری به اکتیویتی ارسال کنید. شما برای ارسال 100 تا پارامتر هم نیازی به 2 Bundle ندارید!
MeY3am 10 سال پیش
علی جان میخوام اطلاعات چند رکورد جدول داخل دیتابیس رو در TextView در اکتیویتی دیگه نشون بدم، بطور مثال برای دریافت اطلاعات 3 رکورد در جدول، در کلاس اکتیویتی که حاوی TextView هستش از 3 Bundle و از if , else if استفاده کردم ولی فقط اطلاعات یک row از جدول نشون داده میشه، میخوام که هرکدام بطور مجزا اطلاعات row مربوطه رو نشون بده !
Hajhosseini 10 سال پیش
لطفا کدی که استفاده کردید رو قرار بدید. چند راه برای این کار وجود داره که اصولی هستند. بعد از دیدن کد میتونم کامل راهنماییتون کنم.

پاسخ‌ها 2

MeY3am 10 سال پیش

اول از همه فیلد مربوط به کلاس 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();
        }

 

 

نظرات

Hajhosseini 10 سال پیش

دوست عزیز هیچ دلیلی نداره از چند 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();
            }
        }

باز هر سوالی داشتید بپرسید جواب بدم. خطای لاگ کت رو هم اضافه کنید به صورت سوال.

نظرات

MeY3am 10 سال پیش
ممنون از توجهت و توضیحات کامل و بسیار مفیدت علی جان، الان دسترسی به اکلیپس ندارم، شب تست میکنم خبرشو میدم !
MeY3am 10 سال پیش
البته در لاگ کت جزء نام پکیج برنامه، هیچ توضیحات اضافه دیگه ای نداره که بدونم خطای RunTime میده یا NullPointerException و ...
Hajhosseini 10 سال پیش
دیباگ کنید ببینید روی کدوم خط اررور میده. میتونید با استفاده از try catch اررور رو چاپ کنید و ببینید مشکل چیه.
MeY3am 10 سال پیش
علی جان این چند روز بخاطر برخی مشغلات کاری اصلأ نتونستم کد رو تست کنم الان که تست کردم کد کاملأ بدون نقص و هیچگونه ایرادی اجرا شد، ممنون بخاطر کد و توضیحات کاملتون دوست من !

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .