id生成器

在android的Sqlite中对于INTEGERPRIMARYKEY,
如果插入数据A,B,C,它们的_id为1,2,3,那么如果把他们都删除了,再插入一条数据,那么它的id为1而不是4。
因此我就写了这个工具来生成id,它能让生成相同的id相隔尽量的远。

SerialManager.java文件
packagecom.teleca;

publicclass SerialManager {
Noderoot=null;
longmin=Long.MIN_VALUE;
longmax=Long.MAX_VALUE;
longcursor=1;
public SerialManager ()
{
}
publicSerialManager(longmin,longmax)
{
if(min>max)
{
longtemp=min;
min=max;
max=temp;
}
this.min=min;
this.max=max;
}
publicvoid setSerial(longid,booleanflag)
{
longtemp=0;
Nodenode=findNode(id);
if (flag)
{
if(node==null)
{
node=findNode(id-1);
if (node!=null)
{
node.data.end=id;
Nodenode2=findNode(id+1);
if (node2!=null) { node.data.end=node2.data.end; this.removeNode(node2); } } else { Nodenode2=findNode(id+1); if(node2!=null) { node2.data.start=id; } else addNewNode(id,id); } } return; } else { if(node==null) return; Blockdata=node.data; if(data.start==data.end) { removeNode(node); } elseif(id==data.start) data.start=id+1; elseif(id==data.end) data.end=id-1; else { temp=data.end; data.end=id-1; addNewNode(id+1,temp); } } } publicvoidsetSerial(longid1,longid2) { longtemp=0; if(id1>id2) { temp=id1; id1=id2; id2=temp; } Nodenode1=findNode(id1); Nodenode2=null; if(node1==null) { node1=findNode(id1-1); if(node1!=null) { node1.data.end=id2; node2=findNode(id2+1); if(node2!=null) { node1.data.end=node2.data.end; this.removeNode(node2); } return; } else { node2=findNode(id2); if(node2==null) { node2=findNode(id2+1); if(node2!=null) node2.data.start=id1; else addNewNode(id1,id2); return; } else { node2.data.start=id1; return; } } } else { Blockdata=node1.data; if(id2<=data.end) { return; } else { node2=findNode(id2); if(node2==null) { data.end=id2; return; } else { data.end=node2.data.end; removeNode(node2); } } } } publiclonggetSerial() { Nodenode=findNode(cursor); longstart=cursor; while(node!=null) { cursor=node.data.end+1; if(cursor>max) cursor=min; elseif(cursor==0) cursor++; if(cursor==start) { return0; } node=findNode(cursor); } longres=cursor; cursor++; if(cursor>max) cursor=min; elseif(cursor==0) cursor++; returnres; } publicbooleanisKeyUsed(longid) { returnfindNode(id)!=null; } privateNodefindNode(longid) { Nodenode=null; NodetempNode=root; Blockblock=null; while(tempNode!=null) { block=tempNode.data; if(block.start<=id&&id<=block.end) { node=tempNode; break; } tempNode=tempNode.next; } returnnode; } privatevoidaddNewNode(longid1,longid2) { Nodenode=newNode(); node.data=newBlock(id1,id2); addNode(node); } privatevoidaddNode(Nodenode) { if(root==null) { root=node; node.prev=null; node.next=null; return; } NodetempNode=root; while(tempNode!=null) { if(tempNode.data.start>node.data.end) { if(tempNode==root) { node.prev=null; node.next=root; tempNode.prev=node; root=node; } else { node.prev=tempNode.prev; node.next=tempNode; tempNode.prev.next=node; tempNode.prev=node; } break; } elseif(tempNode.next==null) { tempNode.next=node; node.prev=tempNode; node.next=null; break; } tempNode=tempNode.next; } } privatevoidremoveNode(Nodenode) { Nodeprev=node.prev; if(prev==null) { root=node.next; } else { prev.next=node.next; } if(node.next!=null) node.next.prev=prev; node.prev=null; node.next=null; } publicvoidclear() { NodetempNode=root; Nodenode=null; while(tempNode!=null) { node=tempNode; tempNode=tempNode.next; node.prev=null; node.next=null; } root=null; cursor=1; } publicvoidprintln() { NodetempNode=root; while(tempNode!=null) { System.out.println("start:"+tempNode.data.start+"end:"+tempNode.data.end); tempNode=tempNode.next; } } } classNode { Nodeprev=null; Blockdata; Nodenext=null; } classBlock { longstart=0; longend=0; Block(longid1,longid2) { start=id1; end=id2; } publiclonggetStart(){ returnstart; } publicvoidsetStart(longstart){ this.start=start; } publiclonggetEnd(){ returnend; } publicvoidsetEnd(longend){ this.end=end; } } 测试程序如下: importjava.util.Random; importcom.teleca.SerialManager; publicclasstestimplementsRunnable{ staticRandomrandom=newRandom(System.currentTimeMillis()); staticlongbuffer[]=newlong[10]; staticintindex=0; staticlongcounter[]=newlong[100]; staticintcountIndex=0; staticSerialManagerserialManager=newSerialManager(Short.MIN_VALUE,Short.MAX_VALUE); publicvoidrun() { inti=0; for(i=0;i<100;i++) serialManager.setSerial(random.nextLong()%Short.MAX_VALUE,true); longtemp=0; booleanblErro=false; booleanblRun=true; while(blRun) { temp=serialManager.getSerial(); for(intj=0;j<buffer.length;j++) { if(buffer[j]!=0&&buffer[j]==temp) { blErro=true; break; } } if(temp==0) { blErro=true; System.out.println("allserialhasbeenused"); } if(blErro) break; buffer[index]=temp; serialManager.setSerial(buffer[index],true); longval=0; for(i=0;i<buffer.length;i++) { val=random.nextLong()%buffer.length; if(val<0) val=-val; val=buffer[(int)val]; if(val==0||serialManager.isKeyUsed(val)) break; } serialManager.setSerial(val,false); index++; index=index%buffer.length; if(counter[countIndex]++>=Short.MAX_VALUE) { countIndex++; System.out.println("countIndex:"+countIndex); if(countIndex>=counter.length) { blRun=false; countIndex=counter.length-1; } } if(counter[countIndex]%1000==0) { System.out.println(temp+"countIndex:"+countIndex+"num:"+counter[countIndex]); try{ Thread.sleep(1); }catch(Exceptione) { e.printStackTrace(); } } } if(blErro) { System.out.println("erro:---------"+temp); serialManager.println(); } else System.out.println("Itpassedthetest!"); } /** *@paramargs */ publicstaticvoidmain(String[]args){ //TODOAuto-generatedmethodstub Threadt=newThread(newtest()); t.start(); } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


SQLite架构简单,又有Json计算能力,有时会承担Json文件/RESTful的计算功能,但SQLite不能直接解析Json文件/RESTful,需要用Java代码硬写,或借助第三方类库,最后再拼成insert语句插入数据表,代码非常繁琐,这里就不展示了。参考前面的代码可知,入库的过程比较麻烦,不能只用SQL,还要借助Java或命令行。SPL是现代的数据计算语言,属于简化的面向对象的语言风格,有对象的概念,可以用点号访问属性并进行多步骤计算,但没有继承重载这些内容,不算彻底的面向对象语言。...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。本教程将告诉您如何使用 SQLite 编程,并让你迅速上手。.................................
安卓开发,利用SQLite实现登陆注册功能
相比大多数数据库而言,具有等优势,广泛应用于、等领域。
有时候,一个项目只有一个数据库,比如只有SQLite,或者MySQL数据库,那么我们只需要使用一个固定的数据库即可。但是一个项目如果写好了,有多个用户使用,但是多个用户使用不同的数据库,这个时候,我们就需要把软件设计成可以连接多个数据库的模式,用什么数据库,就配置什么数据库即可。4.Users实体类,这个实体类要和数据库一样的,形成一一对应的关系。11.Sqlite数据库,需要在代码里面创建数据库,建立表,再建立数据。8.我们开启MySQL数据库,然后进行调试,看程序的结果。2.安装SqlSugar。
基于Android的背单词软件,功能强大完整。
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。说白了就是使用起来轻便简单,
Android的简单购物车案例
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库...
Qt设计较为美观好看的登录注册界面(包含SQLite数据库以及TCP通信的应用)
SQLite是用C语言开发的跨平台小型数据库,可嵌入其他开发语言,也可在单机执行。SPL是用Java开发的跨平台的数据计算语言,可嵌入Java,可在单机执行,可以数据计算服务的形式被远程调用。两者的代码都是解释执行的。...
新建库.openDATA_BASE;新建表createtableLIST_NAME(DATA);语法:NAME关键字...<用逗号分割>删除表droptableNAME;查看表.schema查看表信息新建数据insertintoLIST_NAMEvalues();语法:CLASS,PARAMETER...,CLASS是类别,PARAMETER是参数<用逗号分割新建的
importsqlite3classDemo01:def__init__(self):self.conn=sqlite3.connect("sql_demo_001.db")self.cursor1=self.conn.cursor()self.cursor1.execute("select*fromtable_001wherename=?andid=?",('ssss&#0
 在客户端配置文件<configuration>节点下,添加:<connectionStrings>      <add name="localdb" connectionString="Data Source=config/local.db;Version=3;UseUTF16Encoding=True;" providerName="System.Data.SQLite.SQLiteFactory"/&g
提到锁就不得不说到死锁的问题,而SQLite也可能出现死锁。下面举个例子:连接1:BEGIN(UNLOCKED)连接1:SELECT...(SHARED)连接1:INSERT...(RESERVED)连接2:BEGIN(UNLOCKED)连接2:SELECT...(SHARED)连接1:COMMIT(PENDING,尝试获取EXCLUSIVE锁,但还有SHARED锁未释放,返回SQLITE_BUSY)连接2:INSERT...
SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成。Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。在使用SQLite前,我们先要搞清楚几个概念:表
设计思想————首先要确定有几个页面、和每个页面的大致布局由于是入门,我也是学习了不是很长的时间,所以项目比较low。。。。第一个页面,也就是打开APP的首页面:今天这个博客,先实现添加功能!:首先对主界面进行布局:其中activity_main.xml的代码为<?xmlversion="1.0"encoding="