我知道我可以有一个rowID字段,在插入新记录时我可以检查是否已有50行,所以删除最小的rowID然后插入新的rowID.但只是想知道是否有更好的解决方案,这样我就不必做3个数据库 *** 作(1.查询#of行,2.删除最小值,3.插入)解决方法 我知道一种有效的方法,但它有点难看.它依赖于精心构造的约束和播种数据库.为简洁起见,我只用了五行而不是50行.
create table test ( row_num integer primary key check ((round(row_num) = row_num) and (row_num between 1 and 5)),other_columns char(1) not null default 'x',row_timestamp timestamp not null unique default current_timestamp);
表达式round(row_num = row_num)保证row_num列中有整数.否则,sqlite会让你在那里插入1.54或’wibble’.
other_columns列只是实际数据的占位符.
insert into test (row_num,row_timestamp) values(1,'2015-01-01 08:00:01'),(2,'2015-01-01 08:00:02'),(3,'2015-01-01 08:00:03'),(4,'2015-01-01 08:00:04'),(5,'2015-01-01 08:00:05');
实际的时间戳值并不意味着什么.不管怎样,还没有.像这样播种数据库意味着,从现在开始,您只需要执行更新语句.如果表开始时是空的,则必须处理插入和更新的不同逻辑.例如,您必须计算行以确定是插入还是更新.
create trigger update_timestampafter update on test for each rowbegin update test set row_timestamp = strftime('%Y-%m-%d %H:%M:%f','Now') where row_num = olD.row_num;end;
“update_timestamp”触发器使sqlite以几分之一秒(%f)维护时间戳.可能取决于底层 *** 作系统是否支持分数精度.
create trigger no_deletesafter delete on testfor each rowbegin -- There might be a more elegant way to prevent deletes. -- This way just inserts exactly what a delete statement deletes. insert into test (row_num,other_columns,row_timestamp) values (olD.row_num,olD.other_columns,olD.row_timestamp);end;
现在您可以更新数据了.您更新自己的数据,这里只是占位符other_columns,sqlite负责其余的工作.
update test set other_columns = 'b' where row_timestamp = (select min(row_timestamp) from test);select * from test order by row_timestamp desc;
row_num other_columns row_timestamp ---------- ------------- -----------------------1 b 2015-03-08 12:43:21.9265 x 2015-01-01 08:00:05 4 x 2015-01-01 08:00:04 3 x 2015-01-01 08:00:03 2 x 2015-01-01 08:00:02总结
以上是内存溢出为你收集整理的android – 限制SQLite中的行数全部内容,希望文章能够帮你解决android – 限制SQLite中的行数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)