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 个长值,因此在内存中跟踪它并不是什么大问题。并且由于您拥有插入的记录的插入 ID,因此使用类似的东西创建单个选择语句

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

也应该相当有效。

如果你只想要一个线程来发布服务器,那么你可以修改上面的逻辑,这样你就有一个后台线程来监控 ids Set 的大小,当它达到 10 时,它会发布到服务器。

于 2012-05-29T12:17:09.487 回答
0

了解表中的行数

final String SQL_STATEMENT = "SELECT COUNT(*) FROM sample;

你可以在它是 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 回答