文档章节

android sqlite 批量插入

tfc
 tfc
发布于 2012/08/15 20:21
字数 1026
阅读 4.4K
收藏 4

1手动处理sqlite 的事务

http://blog.csdn.net/pipisky2006/article/details/6917399

SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。
例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行 
sqlite3_exec(db, “insert into name values ‘lxkxf', ‘24'; ”, 0, 0, &zErrMsg); 
将会重复的打开关闭数据库文件100万次,所以速度当然会很慢。因此对于这种情况我们应该使用“事务”。 
具体方法如下:在执行SQL语句之前和SQL语句执行完毕之后加上 
rc = sqlite3_exec(db, "BEGIN;", 0, 0, &zErrMsg); 
//执行SQL语句 
rc = sqlite3_exec(db, "COMMIT;", 0, 0, &zErrMsg);
这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据库,这样数据库文件只被打开关闭了一次,效率自然大大的提高。有一组数据对比:
测试1: 1000 INSERTs 
CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100)); 
INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three'); 
INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty'); 
... 995 lines omitted 
INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine'); 
INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two'); 
INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two'); 
SQLite 2.7.6: 
13.061 
SQLite 2.7.6 (nosync): 
0.223

测试2: 使用事务 25000 INSERTs 
BEGIN; 
CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100)); 
INSERT INTO t2 VALUES(1,59672,'fifty nine thousand six hundred seventy two'); 
... 24997 lines omitted 
INSERT INTO t2 VALUES(24999,89569,'eighty nine thousand five hundred sixty nine'); 
INSERT INTO t2 VALUES(25000,94666,'ninety four thousand six hundred sixty six'); 
COMMIT; 
SQLite 2.7.6: 
0.914 
SQLite 2.7.6 (nosync): 
0.757

可见使用了事务之后却是极大的提高了数据库的效率。但是我们也要注意,使用事务也是有一定的开销的,所以对于数据量很小的操作可以不必使用,以免造成而外的消耗。

android中的方法,

解决方法:

添加事务处理,把5000条插入作为一个事务

dataBase.beginTransaction();        //手动设置开始事务

//数据插入操作循环

dataBase.setTransactionSuccessful();        //设置事务处理成功,不设置会自动回滚不提交

dataBase.endTransaction();        //处理完成 



2android 自带的方法

http://disanji.net/2011/03/20/android-6-insert-update-and-delete-content/

添加、更新和删除内容

   

Content Provider上执行交互,通过调用ContentResolver对象的deleteupdateinsert方法。

 

Insert

 

ContentResolver提供了两个插入新的记录的方法——insertbulkInsert。两个方法都接受你想添加的项目类型的URI;前者接受单一的ContentValues对象,后者接受一个数组。

 

简单的insert方法会返回新添加的记录的URI,而bulkInsert会返回成功添加的项目个数。

 

下面的代码片段显示了如何使用insert方法和bulkInsert方法:

 

// Create a new row of values to insert.

ContentValues newValues = new ContentValues();

 

// Assign values for each row.

newValues.put(COLUMN_NAME, newValue);

[ ... Repeat for each column ... ]

Uri myRowUri = getContentResolver().insert(MyProvider.CONTENT_URI, newValues);

 

// Create a new row of values to insert.

ContentValues[] valueArray = new ContentValues[5];

 

// TODO: Create an array of new rows

int count = getContentResolver().bulkInsert(MyProvider.CONTENT_URI, valueArray);

 

Delete

 

为了通过ContentResolver来删除一条记录,调用delete,传入你想删除的行的URI。可变通的地方,你可以指定一个where语句来删除多个行。两种技巧都在下面的片段中显示:

 

// Remove a specific row.

getContentResolver().delete(myRowUri, null, null);

 

// Remove the first five rows.

String where = “_id < 5”;

getContentResolver().delete(MyProvider.CONTENT_URI, where, null);

 

Update

 

通过在ContentResolver上调用update方法来对Content Provider进行更新。update方法需要目标Content ProviderURI,一个更新了数据的ContentValues对象,还有一个where语句来指定哪些行要被更新。

 

当执行时,与where语句匹配的行都会使用传入的ContentValues对象进行更新,并返回成功更新的行的数目。

 

// Create a new row of values to insert.

ContentValues newValues = new ContentValues();

 

// Create a replacement map, specifying which columns you want to

// update, and what values to assign to each of them.

newValues.put(COLUMN_NAME, newValue);

 

// Apply to the first 5 rows.

String where = “_id < 5”;

getContentResolver().update(MyProvider.CONTENT_URI, newValues, where, null);

本文转载自:

tfc

tfc

粉丝 3
博文 12
码字总数 4629
作品 0
长春
程序员
私信 提问
加载中

评论(0)

Android 开发中使用 SQLite 数据库

SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都...

红薯
2010/08/22
6.8W
32
一个android sqlite CRUD代码生成小工具

把之前的文章合并到这里,添加bulk批量操作函数. 源码已开源sqliteGenCRUD。 android sqlite也无非是CRUD,所以通常是Ctrl+C、Ctrl+V,不过拷贝的代码容易出错浪费不少苦逼的时间。android s...

obaniu
2014/06/30
3.2K
3
Android提高第八篇之SQLite分页读取

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! Android包含了常用于嵌入式系统的SQLite,免去了开发者自己移植安装的功夫。SQLite 支持多数 SQL92 标准,很多常用的SQL命令都...

晨曦之光
2012/03/14
1.5K
0
手机开发-如何查看android数据文件和数据库

在Android中可以使用Eclipse插件DDMS来查看,也可以使用Android工具包中的adb工具来查看。android项目中的sqlite数据库位于/data/data/项目包/databases中。 工具/原料 doc命令adb工具,ecl...

娶到笨笨
2014/03/14
407
0
Android开发_SQLite使用方法技巧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangty0223/article/details/9407509 SQLite介绍 SQLite是轻量级的、嵌入式的、关系型数据库,目前已经在iPh...

张腾元_Ternence
2013/07/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

List的一波操作

public static void main(String[] args) { List<Entity> list = new ArrayList<>(); list.add(new Entity(1)); list.add(new Entity(2)); list.add(new Entity(3)); ......

那个猩猩很亮
38分钟前
65
0
Spring基础

主要用于service层; 轻量级java开发框架; 各层 web层:struts,spring-MVC service层:spring dao层:hibernate,mybatis , jdbcTemplate --> spring-data Spring核心:控制反转IOC 切面编...

七宝1
53分钟前
30
0
解决overflow+border-radius+transform圆角问题

网上还有其他版本,但是对我来说都不好使,下面是我在Chrome上的代码。overflow:hidden依然是不能正常使用,换成unset就可以,读者如果有更好的解决方案,请留言,谢谢。 <figure> <img...

hi懒喵
58分钟前
53
0
《C语言》—— 数组

书籍使我变成了一个幸福的人,使我的生活变成轻松而舒适的诗。——高尔基 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues。 https://github.com/midou-tech/articles 点关注,不迷路!...

龙跃十二
今天
84
0
Java小案例: 1000以内的水仙花数

要求在控制台分别展示1000以内的水仙花数。 如下:↓ 水仙花数规则: 水仙花数至少是一个3位数 每位数字的立方数的累加和,正好等于该数字本身。 例如:153就是一个水仙花数。每位数字分别...

漫路h
昨天
66
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部