0

データベースにたくさんのレコードを書き込んでいsqliteます。保存されたレコード数が 10 の倍数に達するたびに、それらの 10 個のレコードをオブジェクトに保存し、リモート サーバーに送信したいと考えています。

別のスレッドでタスクを達成するにはどうすればよいですか?

4

3 に答える 3

1

http を使用する場合は、このサンプルコードを使用できます。

Thread background = new Thread(new Runnable(){
  @Override
public void run() {
                    HttpClient httpclient = new DefaultHttpClient();
                        HttpPost httppost = new HttpPost("http://your-url.com");

try {
    // Add your data
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
    nameValuePairs.add(new BasicNameValuePair("paramName", paramValue));
            nameValuePairs.add(new BasicNameValuePair("paramName2", paramValue2));
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    // Execute HTTP Post Request
    httpclient.execute(httppost);

} catch (Exception e) {
    Log.w("error", e.toString());
} 
});
background.start();
于 2012-05-29T10:26:56.937 に答える
0

すべての挿入が単一のメソッドから発生した場合、サーバーに送信されるアイテム ID の内部キャッシュを保持し、セットが 10 に達したときに、それらの 10 レコードを取得して、バックグラウンド スレッドでサーバーへの送信を実行できます。

これの疑似コードは次のようなものかもしれません...

Set<Long> ids = new TreeSet<Long>;

public void insert(Data data) {
   long id = sqlite.insert(data);
   ids.add(id);
   if (ids.size()>=10) {
       postToServer();
   }
}

public void postToServer() {
   // build select statement using the 10 ids in the set.
   // clear the set
   ids.clear();
   // create a new thread and then post your results to the server
   // optionally update those 10 ids in the database to indicate that they have been sent to the server
}

上記のコードは、メモリ内に 10 個の long 値のキャッシュしか保持しないため、メモリ内でそれを追跡することは大したことではありません。そして、挿入されたレコードの挿入されたIDを持っているので、次のようなものを使用して単一の選択ステートメントを作成します

select * from TABLE where _ID in (YOUR ID LIST)

同様にかなり効率的である必要があります。

サーバーへのポストを 1 つのスレッドだけに実行させたい場合は、上記のロジックを変更して、ID セットのサイズを監視する単一のバックグラウンド スレッドを作成し、それが 10 に達するとポストを実行するようにすることができます。サーバー。

于 2012-05-29T12:17:09.487 に答える
0

テーブルの行数を知るには

final String SQL_STATEMENT = "SELECT COUNT(*) FROM サンプル;

10の倍数のときにカウントを確認できます

テーブル内の列のような日付がある場合は、このアプローチを使用できます。

最終文字列 orderBy = Constants.TABLE_CONVERSATION_FIELD_DATE + "DESC LIMIT 10"

return db.query(table, columns, selection, null, null, null, orderBy);

データベースから値を取得し、その値をサーバーに渡す必要があります。

于 2012-05-29T10:33:46.267 に答える