美团点评收银机一体机单屏收银机安装

28147人阅读
android(226)
Android开发中我们常会遇到这样一种情况:在建立一个SQLite数据库时,想同时插入大量数据。那么应该怎么做呢?
下面笔者以插入20条记录为例:
&&将同时插入大量的数据写成一条SQL语句
&最笨的方法用insert语句一条一条的输入
代码如下:
public class DateBaseOpenHelper extends SQLiteOpenHelper {
&&&& public static final String DBNAME=&radiomap&;
&&&& public static final int VERSION=1;
&&&& public DateBaseOpenHelper(Context context){
&&&& &super(context,DBNAME,null,VERSION);
&@Override
&public void onCreate(SQLiteDatabase db) {
&&// TODO Auto-generated method stub
&&&&&& db.execSQL(&create table radiomap(location varchar(20),ap1 int,ap2 int)&);
&&&&&& long a=System.currentTimeMillis();
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) select 'x=1,y=1',-80,-73 & +
&&&&&& &&&union all select 'x=2,y=3',80,40 union all select 'x=3,y=5',30,20 &+
&&& &&&& &union all select 'x=4,y=5',3,2 union all select 'x=30,y=50',30,20 union all select 'x=3,y=5',40,20&
&&&&&& &&+& union all select 'x=3,y=5',6,20 union all select 'x=3,y=5',6,7 union all select 'x=3,y=5',7,8 union all select 'x=3,y=5',8,9 union all select 'x=3,y=5',9,9& +
&&&&&& &&&&& union all select 'x=3,y=5',3,5 union all select 'x=3,y=5',7,20 union all select 'x=3,y=5',4,20 union all select 'x=3,y=5',5,20 union all select 'x=3,y=5',6,20& +
&&&&&& &&&&& union all select 'x=3,y=5',3,6 union all select 'x=3,y=5',7,7 union all select 'x=3,y=5',3,8 union all select 'x=3,y=5',8,2&);
&&&&&& long b=System.currentTimeMillis();
&&&&&& long c=b-a;
&&&&&& Log.i(&LocationActivity&, String.valueOf(c));
&&&&&& a=System.currentTimeMillis();
&&&&&& db.beginTransaction();
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',4,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',6,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',4,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',6,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',1,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',1,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',1,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',2,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',2,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',3,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',3,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',3,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',4,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=7',5,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',4,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',5,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',5,5)&);
&&&&&& db.setTransactionSuccessful();
&&&&&& db.endTransaction();
&&&&&& b=System.currentTimeMillis();
&&&&&& Log.i(&LocationActivity&, String.valueOf(b-a));
&&&&&& a=System.currentTimeMillis();
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=7,y=8',7,8)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=8,y=9',8,9)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=9,y=10',9,10)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',4,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',6,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',2,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',2,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',3,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',3,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',3,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',4,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',4,4)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',4,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',5,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=7',6,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',5,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',6,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',6,5)&);
&&&&&& b=System.currentTimeMillis();
&&&&&& Log.i(&LocationActivity&, String.valueOf(b-a));
第一种方式及:
insert into 表名(列名1,列名2)&&&&
&select&&值1,值2
&union all&
&select 值1,值2&&
&union all&
&select 值1,值2&
以上三种方式测试结果,及运行效率:
第一种方式为9ms
用事务的为:86ms
第三种直接用insert插入的为:29ms
这是因为本次测试用了20条数据,所以用事务的反而比不用的开销大时间长。若1000条以上则明显快于直接用insert插入的。
今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时2分钟!
下面是他发给我的测试代码。我晕~~~~~~
usingSystem.D
usingSystem.Data.SQL
//创建数据库文件
File.Delete(&test1.db3&);
SQLiteConnection.CreateFile(&test1.db3&);
DbProviderFactory factory=SQLiteFactory.I
using(DbConnection conn=factory.CreateConnection())
//连接数据库
conn.ConnectionString=&Data Source=test1.db3&;
conn.Open();
//创建数据表
stringsql=&create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)&;
DbCommand cmd=conn.CreateCommand();
cmd.Connection=
cmd.ExecuteNonQuery();
//添加参数
cmd.Parameters.Add(cmd.CreateParameter());
//开始计时
Stopwatch watch=newStopwatch();
watch.Start();
//连续插入1000条记录
for(inti=0; i&1000; i++)
mandText=&insert into [test1] ([s]) values (?)&;
cmd.Parameters[0].Value=i.ToString();
cmd.ExecuteNonQuery();
//停止计时
watch.Stop();
Console.WriteLine(watch.Elapsed);
哎~~~~一个常识性的错误,我加几行代码 (新增代码标记&// &-------------------&)。
usingSystem.D
usingSystem.Data.SQL
//创建数据库文件
File.Delete(&test1.db3&);
SQLiteConnection.CreateFile(&test1.db3&);
DbProviderFactory factory=SQLiteFactory.I
using(DbConnection conn=factory.CreateConnection())
//连接数据库
conn.ConnectionString=&Data Source=test1.db3&;
conn.Open();
//创建数据表
stringsql=&create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)&;
DbCommand cmd=conn.CreateCommand();
cmd.Connection=
cmd.ExecuteNonQuery();
//添加参数
cmd.Parameters.Add(cmd.CreateParameter());
//开始计时
Stopwatch watch=newStopwatch();
watch.Start();
DbTransaction trans=conn.BeginTransaction();//&-------------------
//连续插入1000条记录
for(inti=0; i&1000; i++)
mandText=&insert into [test1] ([s]) values (?)&;
cmd.Parameters[0].Value=i.ToString();
cmd.ExecuteNonQuery();
mit();//&-------------------
trans.Rollback();//&-------------------
//&-------------------
//停止计时
watch.Stop();
Console.WriteLine(watch.Elapsed);
执行一下,耗时0.2秒。这差距是不是太大了点?
为什么只是简单启用了一个事务会有这么大的差距呢?很简单,SQLite 缺省为每个操作启动一个事务,那么原代码1000次插入起码开启了1000个事务,&事务开启 + SQL 执行 + 事务关闭&自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。
最近在做android项目的时候遇到一个问题,应用程序初始化时需要批量的向sqlite中插入大量数,导致应用启动过慢。
android使用的是sqlite数据库,sqlite是比较轻量级的数据库,在Google了之后发现,sqlite事务处理的问题,在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
解决方法:
添加事务处理,把5000条插入作为一个事务
dataBase.beginTransaction();&&&&&& //手动设置开始事务
//数据插入操作循环
dataBase.setTransactionSuccessful();&&&&&& //设置事务处理成功,不设置会自动回滚不提交
dataBase.endTransaction();&&&&&& //处理完成
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:1000INSERTs
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');
...995lines 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(,'ninety four thousand one hundred forty two');
SQLite2.7.6:
SQLite2.7.6(nosync):
测试2: 使用事务25000INSERTs
CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t2 VALUES(1,59672,'fifty nine thousand six hundred seventy two');
...24997lines omitted
INSERT INTO t2 VALUES(,'eighty nine thousand five hundred sixty nine');
INSERT INTO t2 VALUES(,'ninety four thousand six hundred sixty six');
SQLite2.7.6:
SQLite2.7.6(nosync):
可见使用了事务之后却是极大的提高了数据库的效率。但是我们也要注意,使用事务也是有一定的开销的,所以对于数据量很小的操作可以不必使用,以免造成而外的消耗。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1263994次
积分:10905
积分:10905
排名:第1289名
原创:113篇
转载:238篇
评论:150条
(2)(1)(7)(24)(9)(8)(20)(6)(17)(59)(52)(51)(58)(4)(1)(1)(2)(9)(1)(3)(2)(4)(8)(2)2017年1月 总版技术专家分月排行榜第二
2016年12月 总版技术专家分月排行榜第三
2016年10月优秀大版主2016年8月论坛优秀版主2015年4月优秀版主2014年11月论坛优秀版主
2016年4月 荣获微软MVP称号2015年4月 荣获微软MVP称号2014年4月 荣获微软MVP称号2013年4月 荣获微软MVP称号2009年1月 荣获微软MVP称号2012年4月 荣获微软MVP称号2011年4月 荣获微软MVP称号2010年4月 荣获微软MVP称号
2017年1月 总版技术专家分月排行榜第二
2016年12月 总版技术专家分月排行榜第三
2016年4月荣获微软MVP荣誉称号2015年4月荣获微软MVP称号2014年4月 荣获微软MVP称号
2016年7月 MS-SQL Server大版内专家分月排行榜第一
2007年12月 VB大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。PL/SQL使用INSERT...SELECT一次插入多行数据
PL/SQL使用INSERT...SELECT一次插入多行数据 通常我们使用INSERT命令向表中插入行,而有时用户需要根据已有表和视图的记录,讲其中特定的数据添加到目标表中,这是可以使用INSERT...SELECT语句来实现。该语句实...
PL/SQL使用INSERT...SELECT一次插入多行数据
 通常我们使用INSERT命令向表中插入行,而有时用户需要根据已有表和视图的记录,讲其中特定的数据添加到目标表中,这是可以使用INSERT...SELECT语句来实现。该语句实际上包含两个部分:INSERT(插入语句)和SELECT(查询语句),其语法可表示如下:
Insert into Table2(field1,field2,...) select value1,value2,... from Table1
  这样,通过INSERT...SELECT语句一次性向目标表中插入大量数据。另外,使用该语句时,需要注意一下几点:
    INSERT语句不能从正在被插入的表和视图中选择数据。
    在INSERT INTO语句红,列的数目必须等于从SELECT语句返回列的数目。
    在INSERT INTO语句中,列的数据类型必须与SELECT语句返回列的数据类型相同。
  T-SQL中相同效果的语法如下:SELECT vale1, value2 into Table2 from Table1。
  INSERT...SELECT语句通常用来创建一个查找表,已提高检索性能。查找表可以包含分布在多个的多个表中的数据。因为多个表连接起来比简单茶韵要慢,对一个表执行SELECT查询,则明显快于执行又长又复杂的连接查询。
  今天做门诊医生站项目刚好需要从其他表中复制一些行到另外的一张表中,固写下此文。这个方法可行且高效,为证可行,截图如下:
作者 DebugLZQ下次自动登录
现在的位置:
& 综合 & 正文
sqlite3-批量insert插入多条信息-提高效率的办法
这也是之前进行了十万级别的insert插入信息,因为数量太多,所以感觉一条一条执行简直慢的要死……经过查询,找到了对应的解决办法,极大的提升了插入多条消息的效率。
之所以慢,就是因为每一条指令都成了一个事务,从而极大的降低了执行效率,解决办法就是把所有的指令归结为一个事务一次执行即可。
下面就是类比
/*开始事务*/
/*万条记录开始*/
insert into [表名] values();
/*万条记录结束*/
/*执行事务*/
利用事务,可以将几十分钟的执行指令大幅缩减到几十秒。因为因为这个过程只写一次磁盘。
还有一个思路,就是使用sqlite内存表,将数据先写到内存表,然后再更新到磁盘表。
(以下部分代码来自:/node/41507)
$conn = new PDO('sqlite::memory:');
$conn-&exec("CREATE TABLE t1 (id1 interge,str1 varchar(30))");
$conn-&exec("begin transaction");
$sql = '';
for($i=0;$i&1000000;$i++) {
$sql = "INSERT INTO t1 VALUES ({$i}, '阿斯蒂芬是否');";
$conn-&exec($sql);
$conn-&exec("commit transaction");
//内存表刷到磁盘
$conn-&exec('ATTACH "D:\test.db" AS test1');
$conn-&exec("insert into test1.t1 SELECT * FROM t1");
$conn-&exec('DETACH test1');
原始博主说这个过程和使用事务的时间差不多。我未测试。
用一个事务的办法就可以提高效率的了,暂时不深入研究了。
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 美团收银机怎么样 的文章

 

随机推荐