5

ユーザーのすべてのSMSメッセージを含むsqliteデータベースがありますが、アプリを起動すると、ユーザーが間に別のSMSアプリを使用することを決定した場合に、持っていない可能性のあるすべてのSMSを取得する必要があります.

データベースを基本の Android コンテンツ プロバイダーと同期する最良の方法を探しています。

現時点では、次のように各SMSに対して挿入または無視を行います。

insert or ignore into sms (smsID, smsCONID, smsMSG, smsNUM, smsREAD, smsTIMESTAMP, smsTYPE, smsSHORTMSG) values (?,?,?,?,?,?,?,?);

受信トレイを読み込み、スプラッシュ スクリーン アクティビティの個別の asynctasks でメッセージを送信します。これには約 10 秒ほどかかります。

私の doInBackground :

    @Override
    protected Void doInBackground(Void... arg0) {

        int thread_id = 0;
        int _id = 0;
        int read;
        String number;
        boolean first = true;
        String msg;
        long timestamp;

        /**
         * RECUPERATION DES MESSAGES RECUS
         */

        // PREPARE CURSOR
        cursorInbox.moveToFirst();

        while (cursorInbox.moveToNext()) {
            if(first){
                cursorInbox.moveToFirst();
                first = false;
            }


            // RECUPERE THREAD_ID + ID_SMS + NUMERO DU CONTACT
            thread_id = cursorInbox.getInt(cursorInbox.getColumnIndexOrThrow("thread_id"));
            _id = cursorInbox.getInt(cursorInbox.getColumnIndexOrThrow("_id"));
            number = cursorInbox.getString(cursorInbox.getColumnIndexOrThrow("address"));
            msg = cursorInbox.getString(cursorInbox.getColumnIndexOrThrow("body"));
            read = cursorInbox.getInt(cursorInbox.getColumnIndexOrThrow("read"));
            timestamp = cursorInbox.getLong(cursorInbox.getColumnIndexOrThrow("date"));

            // CREER LE SMS
            dataManip.insert(_id, thread_id, msg, number, read, timestamp, "received",ContactsFactory.getMessageShort(msg));

            i++; 
            publishProgress(i);


        }  


        Log.d(TAG,"LoadActivity - Inbox Loaded");
        return null;
    } 

改善のためのアイデア?

4

3 に答える 3

1

Android SMS プロバイダーの変更をリッスンするために別の Service に を登録するのContentObserverはどうですか? オブザーバーに変更を通知するかどうかはわかりません。ただし、そうであれば、データベースは常に同期されます。ただし、さまざまな理由でいつでもサービスが終了する可能性があるため、これだけに依存しないでください。

実際の同期では、テーブルの「_id」列がPRIMARY KEY. 「_id」でソートされたコンテンツ プロバイダーを照会します。「_id」でソートされた独自のテーブルをクエリし、すべての ID を読み取ります。次に、2 つの並べ替えられたリストを反復処理して、自分のリストにないアイテムを挿入し、コンテンツ プロバイダーにないアイテムを削除します。他の SMS アプリを使用して削除されたメッセージも削除したいと思いませんか? 「挿入または無視」ステートメントは、欠落している行を削除しません。

于 2012-12-28T10:56:47.140 に答える
1

データベースにインデックスが付けられている場合は、インデックスを削除/無効にするよりも、挿入が高速になります。後で新しいスレッド/タスクでインデックスを再構築します。

解決策2:最初のステップでメモリ内(コレクション内)でデータベースに書き込まないでください。後で書き込みを行います。

于 2012-12-24T17:09:43.583 に答える