انتقال داده از دیتابیس با حجم زیاد

گزارش
سوال

لطفا علت گزارش خود را توضیح دهید.

گزارش لغو

سلام به همگی و همچنین مهندس جعفری پور عزیز
میخوام از دیتابیسی که حجم زیاد داره اطلاعاتی رو بخونم که این کار شاید مدتی رو زمان نیاز داشته باشه…
برای اینکه کاربر منتظر لود اطلاعات بمونه میخوام پروگرسباری رو ایجاد کنم…
برای این کار میخوام از AsyncTask استفاده کنم…
آیا لازمه هر جایی که کاربر میخواد به دیتابیس دسترسی داشته باشه، از پروگسبار و کلاس AsyncTask استفاده کنم؟
ممنون از راهنماییتون

حل شده 0
اندروید - android 17 پاسخ 2415 بازدید 0

درباره نویسنده

عاشق برنامه نویسی و جویای موفقیت هستم. یک روز هم انرژیم رو از دست نمیدم و عاشق کم خوابیم و وقتم رو به بطالت نمیگذرونم... روی تک تک ساعات زندگیم برنامه دارم و دنبال رشد فکری، شخصیتی، علمی و... هستم. از کار کردن در زمینه کدنویسی و همچنین نتورک لذت میبرم... خواهان ارتباط با افراد مثبت اندیش و پرانرژیم...

پاسخ ها ( ۱۷ )

  1. محمد حسین جعفری پور
    1
    ۲۳, خرداد , ۱۳۹۷ در ۱:۴۵ ب.ظ

    لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

    گزارش لغو

    سلام چون تعداد دیتاهایی که استفاده می کنید زیاد است باید حتما از کلاس AsyncTask استفاده شود در ادامه یک مثال از کلاس AsyncTask قرار می دهم.

    برای اجرای کد async بالا از کد زیر استفاده کنید.

    یک نمونه کد دیگر هم قرار میدهم تا از آن استفاده کنید.

    موفق باشید.

    بهترین پاسخ
  2. ehsan.k
    0
    ۲۳, خرداد , ۱۳۹۷ در ۳:۰۱ ب.ظ

    لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

    گزارش لغو

    بنده از دیتابیس آفلاین استفاده میکنم
    برای این دیتابیس هم همین دستورات رو به کار ببرم؟
    اگه جواب منفیه راه کار مناسب رو به بنده بگید
    سپاس فراوان

    • محمد حسین جعفری پور
      1
      ۲۳, خرداد , ۱۳۹۷ در ۳:۳۰ ب.ظ

      لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

      گزارش لغو

      بله فرقی نمی کند شما هنگام Query گرفتن Cursor بر می گردونید که در نمونه اولی همین استفاده شده است.

  3. ehsan.k
    0
    ۲۳, خرداد , ۱۳۹۷ در ۴:۴۴ ب.ظ

    لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

    گزارش لغو

    تشکر فراوان

  4. ehsan.k
    0
    ۲۵, خرداد , ۱۳۹۷ در ۲:۳۳ ب.ظ

    لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

    گزارش لغو

    بنده از کلاس AsyncTask استفاده کردم ولی متاسفانه بخاطر باگ بزرگی که این کلاس داره(باید دوبار کلید رو بزنی تا اطلاعات رو بخونه از دیتابیس) اومدم از یه تایمر استفاده کردم تا این مشکل رو جبران کنه…
    فقط زمانی که داخل متد تایمر، متد runonUiThreadd رو که قرار میدم برنامه خییلی کند میشه و بک گراند قفل میکنه…
    علت این موضوع چیه و برای حلش باید چکار کنم؟
    کد زیر داخل متد setOnClickListener() نوشته شده:

    AsyncTaskGetData getData = new AsyncTaskGetData();
    getData.execute();
    final Timer timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
    recyclerView.setAdapter(new RecycleSampleAdapter(arrayInfo, getApplicationContext()));
    progressBar.setVisibility(View.GONE);
    }
    }, ۱, ۱۰۰۰);

    آیا میشه از کتابخونه volley هم استفاده کرد یا این کتابخونه فقط برای دیتابیس های آنلاین استفاده میشه؟

  5. ehsan.k
    0
    ۲۶, خرداد , ۱۳۹۷ در ۱۱:۱۳ ق.ظ

    لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

    گزارش لغو

    و یه سوال اینکه آیا بنده باید فرآیند گرفتن اطلاعات از سمت دیتابیس رو در متد doInBackground کلاس AsyncTask انجام بدم و بعد از اضافه شدن اطلاعات به آرایه، آرایه رو به عنوان مقدار برگشتی برگردونم و در متد onCreate برنامه، آدپتر رو با توجه به آرایه ارسالی کلاس AsyncTask برای RecyclerView ست کنم…؟
    آیا همین روند درسته؟

  6. ehsan.k
    0
    ۱۳, تیر , ۱۳۹۷ در ۹:۰۵ ق.ظ

    لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

    گزارش لغو

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

    • محمد حسین جعفری پور
      1
      ۱۳, تیر , ۱۳۹۷ در ۲:۰۰ ب.ظ

      لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

      گزارش لغو

      متد runonUiThreadd یک ترد گرافیکی است و فقط یکدونه ازش در اندروید به ازایه هر فرگ یا اکتیویتی یک uithread داریم سرهمین زیاد نباید باهاشون کار کرد و فقط باید در صورت نیاز باهاش کار کرد در مورد cursor و دیتابیس SQlite فقط میتون بگم باهاش کار نکنید فوق العاده کند هست چون داده که زیاد می شود اصلا نمی تونه برنامه ریزی کنه و به جاش باید از دیتابیس Relam استفاده کنید البته کار باهاش یکم سخته.

      موفق باشید.

  7. ehsan.k
    0
    ۱۹, تیر , ۱۳۹۷ در ۱۱:۲۱ ب.ظ

    لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

    گزارش لغو

    سلام خدمت شما جناب مهندس
    بنده از RecyclerView برای نمایش اطلاعات دیتابیس و برای این موضوع از کلاس AsyncTask استفاده کردم.
    زمانی که کاربر داده جدیدی رو میخواد و RecyclerView در حال بروزرسانی میشه و پروگرسبار به نمایش درمیاد اگه دست کاربر به صفحه نمایش کشیده بشه، برنامه کرش میکنه!!!!!
    علتش چی میتونه باشه؟
    چون بنظرم کد درست هست و مشکلی نداره چرا که جاهای دیکه ازش استفاده کردم و مشکلی نداشته…
    ممنون میشم راهنماییم کنین.

    • محمد حسین جعفری پور
      1
      ۲۰, تیر , ۱۳۹۷ در ۱۲:۴۰ ق.ظ

      لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

      گزارش لغو

      سلام و درود باید Log دیده شود و اینکه setcancable مربوط به Progressbar را برابر برابر false قرار دهید تا امکان کلیک بروی صفحه به گونه ای از بین رود.

      • ehsan.k
        0
        ۲۰, تیر , ۱۳۹۷ در ۸:۴۸ ق.ظ

        لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

        گزارش لغو

        بنده از متد setClickable استفاده کردم ولی تغییری نکرد.
        متد setCancelable نامعتبر هست برای پروگسبار…
        در واقع با لمس صفحه برنامه کرش نمیکنه.
        با اسکرول کردن RecyclerView در حین این که برنامه داره اطلاعات رو از دیتابیس میگیره و پروگرسبار در حال نمایشه برنامه کرش میکنه…

        خطا:

        ۰۷-۱۱ ۰۸:۴۷:۴۳٫۸۲۱ ۲۵۰۱-۱۲۹۸۶/? E/SQLiteLog: (284) automatic index on crash_info_summary(package_name_touched)
        ۰۷-۱۱ ۰۸:۴۷:۴۳٫۹۶۱ ۲۵۰۱-۱۲۹۸۶/? E/SQLiteLog: (284) automatic index on crash_info_summary(package_name_touched)
        ۰۷-۱۱ ۰۸:۴۷:۴۴٫۰۸۲ ۱۲۵۸۱-۱۲۵۸۹/? E/SQLiteLog: (283) recovered 453 frames from WAL file /data/data/com.android.providers.media/databases/internal.db-wal

        • ehsan.k
          0
          ۲۰, تیر , ۱۳۹۷ در ۸:۵۰ ق.ظ

          لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

          گزارش لغو

          خط ۲۸۴ ای که بهش اشاره کرده دقیقا انتهای حلقه خوندن اطلاعات از cursor هستش که داخل متد doInbackgroun نوشته شده…

          • محمد حسین جعفری پور
            1
            ۲۰, تیر , ۱۳۹۷ در ۳:۱۸ ب.ظ

            لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

            گزارش لغو

            اطلاعات موجود در دیتابیس مشکل دارند یا انقدر سنگین هستند که نمی تواند sqlite آن ها را مدیریت کند.

    • محمد حسین جعفری پور
      1
      ۲۰, تیر , ۱۳۹۷ در ۳:۱۷ ب.ظ

      لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

      گزارش لغو

      شما باید focosuble و همینطور clickable مربوط به reyclerview یا list را dispose کنید تا کاربر هنگام بروز رسانی نتواند بروی آن کلیک کند. فقط بروی view ها یا آیتم ها آن تست نکنید بروی خودو Recyclerview هم تست رو انجام بدید باید کار کند.

      موفق باشید.

      • ehsan.k
        0
        ۲۱, تیر , ۱۳۹۷ در ۹:۰۱ ق.ظ

        لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

        گزارش لغو

        بنده ازین دو کد هم استفاده کردم برای ریسکالر ویو ولی تاثیری نداشت…
        در واقع زمانی که درحال خواندن اطلاعات هست اگه کاربر به سمت بالا اسکرول کنه که ویوهای پایین ترو ببینه (یعنی ویوی ۵ به بعد رو) برنامه کرش میکنه و این کد خطا رو میده مبنی بر اینکه این پوزیشن براش نامعتبره…

        java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{2acd1e77 position=5 id=-1, oldPos=-1, pLpos:-1 no parent} android.support.v7.widget.RecyclerView{4d3656f VFED..C. .F…… 0,291-540,924 #7f080108 app:id/recyclerView}, adapter:gp.com.concourchee.RecycleSampleAdapter@19c4327c, layout:android.support.v7.widget.LinearLayoutManager@7d37705, context:gp.com.concourchee.ActivitySampleField@1dd390e8

        برای حل این مسئله باید چه روشی رو اتخاذ کنم؟
        ممنون از راهنماییاتون

        • محمد حسین جعفری پور
          0
          ۲۱, تیر , ۱۳۹۷ در ۱۲:۲۳ ب.ظ

          لطفا علت گزارش خود را در رابطه با این پاسخ بنویسید.

          گزارش لغو

          در واقع این باگ به خاطر لود کند است مطمئنن چون اگر از کلاس Async Task استفاده شده باشد نباید همچین خطایی رخ دهد شما می توانید یک کاری بکنید چک کنید position مخالف null یا همان -۱ باشد.

ارسال نظر