5

アプリのsqliteデータベースに変更が発生したときに、コンテンツオブザーバーを使用してサービスを更新しようとしています。

私は何をすべきか混乱しているので、以下にいくつかのコードをまとめました。通常、コンテンツオブザーバーは、連絡先またはバックグラウンドサービスを備えたメディアプレーヤーで使用されます。私の研究では、電話のsqliteデータベースで使用できることを読みました。

質問:1。SqliteデータベースにはURIがないため、どの情報を置き換えますPeople.CONTENT_URI

this.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver);

2.私の調査では、ContentObserverに警告するデータベースクラスに入るコードは見つかりませんでした。コンテンツオブザーバーのすべてのコードはサービスクラス内で機能しますか?

この質問は、Android SQLite DBの通知、連絡先データベースの変更をリッスンする方法に似ていることに注意してください 。どちらの質問も、私の質問に明示的に答えるものではありません。これを説明するコードがある場合、それは非常に役立ちます。

これが私のセミプセドコードです。それは動作しません。データベース情報が変更されたときにサービスを更新する方法を学ぶためにそれを使用しています。

package com.example.com.test.content.observer;

import java.sql.Date;
import java.util.Calendar;
import java.util.List;

import com.google.android.gcm.demo.app.Alerts.AlarmsService;
import com.google.android.gcm.demo.app.Alerts.Alerts;
import com.google.android.gcm.demo.app.sqllite.DatabaseSqlite;

import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.provider.Contacts.People;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.database.ContentObserver;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import android.support.v4.app.NavUtils;

public class AlarmService extends Service
{

    Handler mHandler = new Handler();
    DatabaseSqlite db = new DatabaseSqlite(this);
    List<Alerts> listAlerts;
    PendingIntent pendingIntent;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.getApplicationContext()
                .getContentResolver()
                .registerContentObserver(?????, true,
                        contentObserver);
    }


    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("TAG", "started onstart command Created from Alerts service .");
        return super.onStartCommand(intent, flags, startId);// START_STICKY;
    }

    @Override
    public void onStart(final Intent intent, int startId) {
        super.onStart(intent, startId);

         runThread();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show();
    }

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

    private class MyContentObserver extends ContentObserver {

        @SuppressLint("ParserError")
        public MyContentObserver(Handler mHandler) {
            super(mHandler);
        }

        @Override
        public void onChange(boolean selfChange) {

             runThread();

            super.onChange(selfChange);
        }



        public void runThread(){

            Thread thread = new Thread() {
                @Override
                public void run() {

                    Boolean x = true;
                    while (x) {

                        db.open();
                        listAlerts = db.getAlarmsForService();
                        db.close();
                        int alerts=listAlerts.size();
                        for (int i = 0; i < alerts; i++) {
                            Alerts item = listAlerts.get(i);
                            item.getRowId();
                            item.getRemoteServerId();
                        String alertInMills = item.getAlertDateInMills();
                        String alertDuration = item.getAlertDurationInMinutes();
                        String eventName = item.getEventName();


                        long longAlertInMills = Long.parseLong(alertInMills);



                         pendingIntent = PendingIntent.getService(AlarmsService.this, 0,intent, 0);

                         AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

                         Calendar calendar = Calendar.getInstance();

                        // go to data base for time in mills

                         calendar.setTimeInMillis(longAlertInMills);

                         alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),
                         pendingIntent);
                        //
                         System.out.println(calendar.toString());

                        }

                        //
                        System.out.println("thread");
                        x = false;

                    }

                }
            };

            thread.start();
        }

        }


    MyContentObserver contentObserver = new MyContentObserver(mHandler);

    this.getContentResolver().registerContentObserver (People.CONTENT_URI, true, contentObserver);



}
4

1 に答える 1

4

一般に、これを処理するには2つの部分があります。指摘したように、変更を受信するために登録する必要があるContentObserverと、登録されたオブザーバーに変更を通知する必要があるSQLiteDatabaseがあります。これが自分が所有するデータベースである場合は、リッスンに使用できるURIを作成できます。

(1)最初に、通常はデータベース定義ファイルでURIを定義します。

public static final Uri CONTENT_URI = Uri.parse("mycontent://packagename/something");

(2)データベースコンテンツプロバイダーの場合:

各db関数(挿入、更新、削除)はnotifyChange()、操作の完了後に呼び出して、変更が発生したことをオブザーバーに通知する必要があります。

    rowId = db.insert(tableName, null, cv);
    ...
    getContext().getContentResolver().notifyChange(newUri, null);

(3)上記で提供したのと同じリンクで説明されているように、 ContentObserverを作成してサービスに登録します( trueを返すにはオーバーライドすることを忘れないでください)。deliverSelfNotifications()

public class MyService extends Service {
    private MyContentObserver mObserver;

    @Override
    public void onStartCommand(Intent intent, int flags, int startId) {
        ...
        mObserver = new MyContentObserver();
        getContentResolver().registerContentObserver(Dbfile.CONTENT_URI, null, mObserver);
    }

    @Override
    public void onDestroy() {
        ...
        if (mObserver != null) {
            getContentResolver().unregisterContentObserver(mObserver);
            mObserver = null;
        }
    }

    // define MyContentObserver here
}

(4)ではContentObserver.onChange()、サービスに何かを投稿したり、可能であればそこで変更を処理したりできます。

また、原因が解決する場合は、URI定義をカスタマイズして、監視しているさまざまなタイプのデータを処理し、URIごとにオブザーバーを登録してから、代わりにContentObserver.onChange(boolean、Uri)をオーバーライドできます。

お役に立てれば!

于 2013-11-28T04:00:11.040 に答える