آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

MeY3am  9 سال پیش  9 سال پیش
0 0

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

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

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

اول از همه فیلد مربوط به کلاس 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  9 سال پیش
+9 0

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

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

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

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