@olexandr777

SQLite query не получает обновившиеся данные с базы в Service. Почему?

Запускаю приложение, оно сразу в мейн активити запускает этот сервис, который проверяет на наличие новых планов. Первый раз проверка идет успешно, находит новый. Потом я добавляю через другое активити план, оно возвращает на мейн активити где в списке находит новый план, но сервис его не видит(выгружает как раньше, без новой записи), хотя тут в цикле гоняет проверку из beeper. Я уже всяко пробовал и все никак. Спасите :(

public class PlansCheckingService extends Service {
    public static boolean isNewPlan = false;

    private Looper serviceLooper;
    private ServiceHandler serviceHandler;

    private final class ServiceHandler extends Handler {
        private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

        private final String selection = ScheduleContract.PlansEntry.COLUMN_NAME_END_DATE + " < "
                + Long.toString(System.currentTimeMillis()) + " AND "
                + ScheduleContract.PlansEntry.COLUMN_NAME_COMPLITED + " = "
                + ScheduleContract.PlansEntry.COMPLITED_STAGES_NOT_CHECKED;

        private final String sortOrder = ScheduleContract.PlansEntry._ID + " DESC";

        private int lastPlanId = 0;
        private int newPlanId = 0;

        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public synchronized void handleMessage(Message message) {
            final Runnable beeper = new Runnable() {
                @Override
                public void run() {
                    ScheduleDbHelper helper = new ScheduleDbHelper(getApplicationContext());
                    SQLiteDatabase db = helper.getReadableDatabase();
                    Cursor lastFoundPlan;
                    Cursor newPlans;

                   // db.beginTransaction();
                    lastFoundPlan = db.query(
                            ScheduleContract.PlansEntry.TABLE_NAME,
                            null,
                            selection,
                            null,
                            null,
                            null,
                            sortOrder,
                            "1"
                    );

                    if (lastFoundPlan.getCount() > 0) {
                        lastFoundPlan.moveToFirst();
                        Log.v("App", "cursor more");
                        newPlanId = lastFoundPlan.getInt(
                                lastFoundPlan.getColumnIndex(ScheduleContract.PlansEntry._ID)
                        );

                        Log.v("lastplanid", lastPlanId + "");
                        Log.v("newplanid", newPlanId + "");

                        if (newPlanId > lastPlanId) {
                            newPlans = db.query(
                                    ScheduleContract.PlansEntry.TABLE_NAME,
                                    null,
                                    selection,
                                    null,
                                    null,
                                    null,
                                    sortOrder
                            );

                            Intent localIntent = new Intent(ScheduleContract.PLANSCHECKING_BROADCAST_ACTION);

                            localIntent.putExtra("number", newPlans.getCount());
                            Log.v("App", "service new plan");

                            try {
                                sendBroadcast(localIntent);
                            } catch (Exception e) {

                            }

                            lastPlanId = newPlanId;
                            newPlans.close();
                        }
                    }

                    lastFoundPlan.close();
                   // db.endTransaction();
                    db.close();
                    helper.close();
                }
            };

            final ScheduledFuture handler = scheduler.scheduleWithFixedDelay(beeper, 0, 5, TimeUnit.SECONDS);
        }
    }

    @Override
    public void onCreate() {
        HandlerThread thread = new HandlerThread("ServiceStartArguments",
                Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();

        serviceLooper = thread.getLooper();
        serviceHandler = new ServiceHandler(serviceLooper);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.v("APP", "Service start");

        Message message = serviceHandler.obtainMessage();
        message.arg1 = startId;

        serviceHandler.sendMessage(message);

        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        Log.v("destroy", "destroy");
    }
}
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 1
gadfi
@gadfi
https://gamega.org
что то странное у вас тут.
Правильно ли я понимаю что нужно просто выводить самую новую запись из бд, при этом бд может обновляться либо в другой активити, либо где то в сервисе ?
если да то воспользуйтесь CoontentProvider и CursorLoader, не нужно каждый раз дергать бд ради проверки это все есть из коробки
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы