アドバイスが必要です...連絡先(SMSダイアログ)を持つ連絡先と連携する私のアプリ。
最適化取得プロセスに問題があります。私はそのスキームを理解することにしました:
- 最初の起動時に、すべての「content://sms/inbox」を読み取り、一意の値 (連絡先の数でグループ化) を配列の新しい文字列 [n.count()][4] に追加します。(フィールド: 名前、番号、日付、メッセージ、タイプ)
- 必要に応じて配列をソートし、メイン アクティビティに送信します (または、そこにある db テーブルを直接読み取ることができます)。
- メイン アクティビティ クラスには、受信データからListView (list.setAdapter)を埋めるプロシージャがあります。
すべてがエミュレーターで完全に機能しますが、実際のデバイスアプリでセットアップしようとすると致命的なエラーが発生します。
前述の後に 2 つの質問があります: 1. アプリがクラッシュするのはなぜですか? (任意のアイデア) 2. アルゴリズムを修正/再構築する方法。関連する批判。ListView の連絡先に、連絡先に着信 SMS がない場合は「-」、存在する場合は SMS のメッセージを表示する機能が必要です。
ありがとう。
以下に、db からデータを挿入および読み取る手順を示します。繰り返しますが、すべてがエミュレーターで完全に機能します。データベースの作成、テーブルの作成、データの挿入、読み取り、更新を意味します。「全体像」のコードを公開します。
public void Contact_to_db () {
dbHelper = new DBHelper(this);
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query( Uri.parse( "content://sms/inbox" ), null, null, null, "DATE ASC");
int indexBody = cursor.getColumnIndex( SmsReceiver.BODY );
int indexAddr = cursor.getColumnIndex( SmsReceiver.ADDRESS );
int indexDate = cursor.getColumnIndex( SmsReceiver.DATE );
if ( indexBody < 0 || !cursor.moveToFirst() ) return;
String sender = "";
String number = "";
String message = "";
String type = "";
do {
sender = "";
message = "";
type = "";
number = cursor.getString( indexAddr );
if (getContactDisplayNameByNumber(cursor.getString( indexAddr )).equals(""))
sender = cursor.getString( indexAddr );
else
sender = getContactDisplayNameByNumber(cursor.getString( indexAddr ));
message = cursor.getString( indexBody );
SQLiteDatabase db_read = dbHelper.getReadableDatabase();
Cursor c = db_read.query(dbHelper.USER_TABLE, null, "number like " + number , null, null, null, null);
if (c.moveToFirst())
//fiend...
else {
Pattern pattern = Pattern.compile("[0-9]");
Matcher matcher = pattern.matcher(sender);
boolean look = matcher.lookingAt();
if (look)
type = "1";
else
type = "0";
SQLiteDatabase db_whrite = dbHelper.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put("name", sender);
cv.put("number", number);
cv.put("msg", message);
cv.put("date", cursor.getString( indexDate ));
cv.put("type", type);
db_whrite.insert(dbHelper.USER_TABLE, null, cv);
db_whrite.close();
}
c.close();
db_read.close();
}
}
while( cursor.moveToNext() );
cursor.close();
dbHelper.close();
}
読んで埋めて…
public void UpdateTableRows() {
SMSDataCollection = new ArrayList<HashMap<String,String>>();
HashMap<String,String> map = null;
String message = "";
SQLiteDatabase db_read = dbHelper.getReadableDatabase();
Cursor c = db_read.query(dbHelper.USER_TABLE, null, null, null, null, null, null);
prmax = c.getCount();
cnt = 0;
pbCount.setMax(prmax-1);
pbCount.setProgress(0);
int i = 0;
if (c.moveToFirst()) {
do {
message = c.getString(3);
if (!(message.equals(""))) {
if ((message.substring(0, 2).equals("SM")) && (message.length()>6)) {
try {
String CutMsg = message.substring(message.indexOf('|')+1, message.length());
String key = message.substring(2, message.indexOf('|'));
Pattern pattern = Pattern.compile("[0-9]");
Matcher matcher = pattern.matcher(key);
boolean look = matcher.lookingAt();
if (look)
message = StringCryptor.decrypt(CutMsg, Integer.parseInt(key));
} catch (Exception e) {
e.printStackTrace(); }
} else
message = StringCryptor.decrypt(message, uPassword);
}
if (message.length() > 25)
message = message.substring(0, 24) + "...";
map = new HashMap<String,String>();
map.put(KEY_SENDER, c.getString(1));
map.put(KEY_NUMBER, c.getString(2));
map.put(KEY_MESS, message);
if (c.getString(4).equals("0"))
map.put(KEY_ICON, "person_icon_a");
else
map.put(KEY_ICON, "person_icon_f");
SMSDataCollection.add(map);
h.post(updateProgress);
} while (c.moveToNext());
}
c.close();
db_read.close();
dbHelper.close();
final BinderData bindingData = new BinderData(this,SMSDataCollection);
list.post(new Runnable(){
public void run() {
list = (ListView) findViewById(R.id.SMSList);
list.setAdapter(bindingData);
list.setEnabled(true);
//pbCount.setVisibility(View.GONE);
pbRound.setVisibility(View.GONE);
img_update.setVisibility(View.VISIBLE);
}
});
}