Sqlite中INTEGER PRIMARY KEY的修正

android 的Sqlite中对于 INTEGERPRIMARYKEY
如果插入数据A,B,C,它们的_id为1,2,3,那么如果把他们都删除了,
再插入一条数据,那么它的id为为1而不是4。
因此我就写了这个工具来生成id,它能让生成相同的id相隔尽量的远。
然后在插据入数时手动设置id,及把这个作为插入参数id传进去。
删除时,也要做相应的处理。

实例1:
文件1:
SerialManager.java
packagecom.teleca;

publicclassSerialManager{
Noderoot=null;
longmin=Long.MIN_VALUE;
longmax=Long.MAX_VALUE;
longcursor=1;
public SerialManager()
{
}
public SerialManager(longmin,longmax)
{
if(min>max)
{
longtemp=min;
min=max;
max=temp;
}
this.min=min;
this.max=max;
}
publicvoidsetSerial(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);
}

}
}
publicvoid setSerial(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);
}
}
}
}
publiclong getSerial()
{

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;
}
publicboolean isKeyUsed(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;
}
}
文件2:
DBHelper.java
packagecom.teleca;
importjava.util.ArrayList;
importjava.util.List;
importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.database.Cursor;
importandroid.database.SQLException;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
importandroid.util.Log;;
publicclassDBHelper{
publicstaticStringDB_NAME="peopledb";
publicstaticStringDB_TABLE_NAME="people";
SQLiteDatabasedb;
finalDBOpenHelperdbOpenHelper;
finalstaticStringCOLS[]=newString[]
{"_id","name","phone","age"};
finalStringtag="hubin";
publicDBHelper(Contextcontext)
{
this.dbOpenHelper=newDBOpenHelper(context,DB_NAME,1);
establishDb();
}
SerialManagerserialManager=newSerialManager();
privatevoidestablishDb()
{
if(db==null)
db=dbOpenHelper.getWritableDatabase();
initSerial();
}
privatevoid initSerial()
{
serialManager.clear();
Cursorc=db.query(DBHelper.DB_TABLE_NAME,newString[]{"_id"},null,"_idDESC",null);
c.moveToFirst();
intcount=c.getCount();
c.moveToFirst();
longid=0;
for(inti=0;i<count;i++)
{
id=c.getLong(0);
serialManager.setSerial(id,true);
Log.i("hubin","id:"+id+"settoserial");
c.moveToNext();
}
c.close();
}
publicvoidcleanup()
{
if(db!=null)
{
db.close();
db=null;
}
}
publicvoidinsert(Peoplepeople)
{
ContentValuesvalues=newContentValues();
values.put("name",people.name);
values.put("phone",people.phone);
values.put("age",people.age);
longid=serialManager.getSerial();
values.put("_id",id);
people.id=db.insert(DBHelper.DB_TABLE_NAME,values);
serialManager.setSerial(id,true);
Log.i(tag,"insert:"+people.id);
}
publicvoidupdate(Peoplepeople)
{
ContentValuesvalues=newContentValues();
values.put("name",people.age);
db.update(DBHelper.DB_TABLE_NAME,values,"_id="+people.id,null);
}
publicvoiddelete(longid)
{
db.delete(DB_TABLE_NAME,"_id="+id,null);
serialManager.setSerial(id,false);
}
publicvoiddeleteAll()
{
db.delete(DB_TABLE_NAME,null);
serialManager.clear(); } publicPeopleget(longid) { Peoplepeople=newPeople(); Cursorc=null; try{ c=db.query(DB_TABLE_NAME,COLS,"_id='"+id+"'",null); Log.i(tag,"count:"+c.getCount()); if(c.getCount()>0) { c.moveToFirst(); people=newPeople(); people.id=c.getLong(0); people.name=c.getString(1); people.phone=c.getString(2); people.age=c.getInt(3); } }catch(SQLExceptione) { Log.i(tag,"",e); } finally { if(c!=null&&!c.isClosed()) { c.close(); } } returnpeople; } publicList<People>getAll() { ArrayList<People>ret=newArrayList<People>(); Cursorc=null; try { c=db.query(DB_TABLE_NAME,null); intcount=c.getCount(); c.moveToFirst(); Peoplepeople; for(inti=0;i<count;i++) { people=newPeople(); people.id=c.getLong(0); people.name=c.getString(1); people.phone=c.getString(2); people.age=c.getInt(3); ret.add(people); c.moveToNext(); } }catch(SQLExceptione) { Log.i(tag,e); } finally { if(c!=null&&!c.isClosed()) { c.close(); } } returnret; } } classDBOpenHelperextendsSQLiteOpenHelper { privatestaticfinalStringDB_CREATE="CREATETABLE" +DBHelper.DB_TABLE_NAME +"(_idINTEGERPRIMARYKEY,nameTEXTUNIQUENOTNULL," +"phoneTEXT,ageINTEGER);"; finalstaticStringtag="hubin"; publicDBOpenHelper(Contextcontext,StringdbName,intversion) { super(context,dbName,version); } publicvoidonCreate(SQLiteDatabasedb) { try{ db.execSQL(DB_CREATE); } catch(SQLExceptione) { Log.e(tag,e); } } publicvoidonOpen(SQLiteDatabasedb) { super.onOpen(db); } publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion) { db.execSQL("DROPTABLEIFEXISTS"+DBHelper.DB_TABLE_NAME); this.onCreate(db); } } 文件3: People.java packagecom.teleca; publicclassPeople{ publiclongid; publicStringname; publicStringphone; publicintage; } 文件4: Hello.java packagecom.teleca; importjava.util.List; importandroid.app.Activity; importandroid.os.Bundle; importandroid.os.Handler; importandroid.util.Log; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.Button; publicclassHelloextendsActivity{ DBHelperdbHelper; finalstaticStringtag="hubin"; /**Calledwhentheactivityisfirstcreated.*/ @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); Buttonbutton=(Button)findViewById(R.id.Button01); OnClickListenerlistener=newOnClickListener(){ publicvoidonClick(Viewv){ cmd=CMD_ADD; doAction(); } }; button.setOnClickListener(listener); Buttonbutton2=(Button)findViewById(R.id.Button02); OnClickListenerlistener2=newOnClickListener(){ @Override publicvoidonClick(Viewv){ cmd=CMD_UPDATE; doAction(); } }; button2.setOnClickListener(listener2); Buttonbutton3=(Button)findViewById(R.id.Button03); OnClickListenerlistener3=newOnClickListener(){ @Override publicvoidonClick(Viewv){ cmd=CMD_QUERY; doAction(); } }; button3.setOnClickListener(listener3); Buttonbutton4=(Button)findViewById(R.id.Button04); OnClickListenerlistener4=newOnClickListener(){ @Override publicvoidonClick(Viewv){ cmd=CMD_QUERY_ALL; doAction(); } }; button4.setOnClickListener(listener4); Buttonbutton5=(Button)findViewById(R.id.Button05); OnClickListenerlistener5=newOnClickListener(){ @Override publicvoidonClick(Viewv){ cmd=CMD_DELETE; doAction(); } }; button5.setOnClickListener(listener5); Buttonbutton6=(Button)findViewById(R.id.Button06); OnClickListenerlistener6=newOnClickListener(){ @Override publicvoidonClick(Viewv){ cmd=CMD_DELETE_ALL; doAction(); } }; button6.setOnClickListener(listener6); mHandler=newHandler(); } publicvoidonStop() { super.onStop(); Log.v(tag,"onStop"); } intcnt=0; privateHandlermHandler; intcmd=0; finalintCMD_ADD=1; finalintCMD_UPDATE=2; finalintCMD_QUERY=3; finalintCMD_QUERY_ALL=4; finalintCMD_DELETE=5; finalintCMD_DELETE_ALL=6; Peoplepeople=newPeople(); classDatabaseThreadimplementsRunnable{ publicvoidrun(){ if(dbHelper==null) dbHelper=newDBHelper(Hello.this); if(cmd==CMD_ADD){ people.name="robin"+System.currentTimeMillis()%100; people.phone=""+System.currentTimeMillis(); people.age=1; dbHelper.insert(people); }elseif(cmd==CMD_UPDATE){ people.phone=""+System.currentTimeMillis(); dbHelper.update(people); }elseif(cmd==CMD_QUERY){ Peoplep=dbHelper.get(people.id); printPeople(p); }elseif(cmd==CMD_QUERY_ALL){ List<People>list=dbHelper.getAll(); inttotal=list.size(); for(inti=0;i<total;i++) { printPeople(list.get(i)); } } elseif(cmd==CMD_DELETE) { dbHelper.delete(people.id); } elseif(cmd==CMD_DELETE_ALL) { dbHelper.deleteAll(); } cnt++; } } voidprintPeople(Peoplep) { Log.i(tag,"id:"+p.id); Log.i(tag,"name:"+p.name); Log.i(tag,"phone:"+p.phone); Log.i(tag,"age:"+p.age); } DatabaseThreaddataDealer=newDatabaseThread(); voiddoAction(){ mHandler.post(dataDealer); } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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="