注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

xUtils 数据库的同步读写问题  

2015-06-17 09:20:17|  分类: android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
这里说明2个问题:
1、google建议用线程来操作数据库,因为这是一个耗时操作。但往往发现,插入几百条数据,读取几百条数据,貌似不影响ui操作,许多人就觉得不需要另开一个线程来操作。其实是不对的。
当你在主线程中 insert 20000条数据,你会发现将近耗时几秒,在这几秒时间内,你是不能操作任何界面的,因为主线程被阻塞了,直到数据 insert 完全
2、关于数据库事物的理解。事物的存在是为了对一次数据库操作的一致性而采取的保护措施。但我发现,加了事物后,insert 20000条数据只要1-2秒时间,不加事物,那将变成6-7秒时间。
不理解,加了事物应该更加耗时才对,结果却可以大大缩短 insert 时间。

看下下面的例子,有2个线程,一个 insert 20000条数据,一个读取。你可以同时点击n次按钮,也就是同时 insert n次的20000条数据,同时读取 n次的数据库。
不会产生内存耗尽,以及同步操作数据库报错问题,也不会产生一个线程单次为插入未完成,一个线程就开始读取数据的问题。当然,是先读还是先写,那要看java虚拟机的分配。
public class DbActivity extends Activity {

DbUtils db = null;

private List<User> userList1 = new ArrayList<User>();
private List<User> userList2 = new ArrayList<User>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_db);

//单例模式获取db对象
db = DbUtils.create(this);
db.configDebug(false);

for (int i = 0; i < 20000; i++) {
User user = new User();
user.setUsername(i+"");
userList1.add(user);
}

for (int i = 0; i < 20000; i++) {
User user = new User();
user.setUsername(i+"");
userList2.add(user);
}

}

//插入数据及读取数据
public void insert(View view) {
//开启线程写入数据库
Thread thread=new Thread(new Runnable()
{
@Override
public void run()
{
try {
//必须开启事物
db.configAllowTransaction(true);
db.saveAll(userList2);
} catch (DbException e) {
e.printStackTrace();
}

}
});
thread.start();

//开启线程读取数据库
Thread thread1=new Thread(new Runnable()
{
@Override
public void run()
{
try {
List<User> list = db.findAll(User.class);//通过类型查找
} catch (DbException e) {
e.printStackTrace();
}

}
});
thread1.start();
}
}

也就是不需要自己写个线程池来解决同步数据插入问题
  评论这张
 
阅读(200)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018