2

SMSReceiverActivity.java に次のコードがあります。

package com.example.smsTest;

import java.util.ArrayList;
import java.util.List;

import android.app.ListActivity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class SMSReceiverActivity extends ListActivity {
    private SQLiteAdapter mySQLiteAdapter;

    private List<String> bodyarr = new ArrayList<String>();
    private ArrayAdapter<Message> arrayAdpt;

    private BroadcastReceiver mIntentReceiver;
    ListView listview;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_smsreceiver);

        mySQLiteAdapter = new SQLiteAdapter(this);
        mySQLiteAdapter.openToRead();

        List<Message> bodyarr = mySQLiteAdapter.getAllMessages();

        listview=this.getListView();

        arrayAdpt = new ArrayAdapter<Message>(SMSReceiverActivity.this,
                android.R.layout.simple_list_item_1, bodyarr);
        listview.setAdapter(arrayAdpt);       
    }

    @Override
    protected void onResume() {
        super.onResume();

        IntentFilter intentFilter = new IntentFilter("SmsMessage.intent.MAIN");
        mIntentReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String msg = intent.getStringExtra("get_msg");

                //Process the sms format and extract body &amp; phoneNumber
                msg = msg.replace("\n", "");
                String body = msg.substring(msg.lastIndexOf(":")+1, msg.length());
                String pNumber = msg.substring(0,msg.lastIndexOf(":"));

                bodyarr.add(body);
                arrayAdpt.notifyDataSetChanged();

                /*
                 *  Create/Open a SQLite database
                 *  and fill with dummy content
                 *  and close it
                 */
                mySQLiteAdapter = new SQLiteAdapter(SMSReceiverActivity.this);
                mySQLiteAdapter.openToWrite();
                //mySQLiteAdapter.deleteAll();

                mySQLiteAdapter.insert(body);

                mySQLiteAdapter.close();
            }
    };

    this.registerReceiver(mIntentReceiver, intentFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        this.unregisterReceiver(this.mIntentReceiver);
    }

}

これは SQLiteAdapter.java のコードです。

package com.example.smsTest;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class SQLiteAdapter {

    public static final String MYDATABASE_NAME = "MY_DATABASE";
    public static final String MYDATABASE_TABLE = "MY_TABLE";
    public static final int MYDATABASE_VERSION = 1;
    public static final String KEY_ID = "_id";
    public static final String KEY_CONTENT = "Content";

    //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_DATABASE =
    "create table " + MYDATABASE_TABLE + " ("
    + KEY_ID + " integer primary key autoincrement, "
    + KEY_CONTENT + " text not null);";

    private SQLiteHelper sqLiteHelper;
    private SQLiteDatabase sqLiteDatabase;

    private Context context;

    public SQLiteAdapter(Context c){
        context = c;
    }

    public SQLiteAdapter openToRead() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getReadableDatabase();
        return this;
    }

    public SQLiteAdapter openToWrite() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getWritableDatabase();
        return this;
    }

    public void close(){
        sqLiteHelper.close();
    }

    public long insert(String content){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_CONTENT, content);
        return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues);
    }

    public int deleteAll(){
        return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null);
    }

    public Cursor queueAll(){
        String[] columns = new String[]{KEY_ID, KEY_CONTENT};
        Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns,
        null, null, null, null, null);

        return cursor;
    }

    public List<Message> getAllMessages() {
        String[] columns = new String[]{KEY_ID, KEY_CONTENT};
        List<Message> messages = new ArrayList<Message>();

        Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE,
                columns, null, null, null, null, null);

        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            Message message = cursorToMessage(cursor);
          messages.add(message);
          cursor.moveToNext();
        }
        // Make sure to close the cursor
        cursor.close();
        return messages;
      }

    public class SQLiteHelper extends SQLiteOpenHelper {

        public SQLiteHelper(Context context, String name,
        CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(SCRIPT_CREATE_DATABASE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

        }

    }

      private Message cursorToMessage(Cursor cursor) {
          Message message = new Message();
          message.setId(cursor.getLong(0));
          message.setMessage(cursor.getString(1));
          return message;
      }

}

Message.java コードは次のとおりです。

package com.example.smsTest;

public class Message {
      private long id;
      private String message;

      public long getId() {
        return id;
      }

      public void setId(long id) {
        this.id = id;
      }

      public String getMessage() {
        return message;
      }

      public void setMessage(String message) {
        this.message = message;
      }

      // Will be used by the ArrayAdapter in the ListView
      @Override
      public String toString() {
        return message;
      }
}

問題は、String body = msg.substring(msg.lastIndexOf(":")+1, msg.length());このコードが発火したときに の値がリストビューに更新されないことbodyarr.add(body); arrayAdpt.notifyDataSetChanged();です。このコードは SMSReceiverActivity クラスにあります。

これは、sqlite コードを追加する前に機能しています。

4

1 に答える 1