Sqlite中INTEGER PRIMARY KEY的修正

来源:互联网 发布:新生儿数据泄露 编辑:程序博客网 时间:2024/04/29 03:54
android的Sqlite 中对于INTEGER PRIMARY KEY
如果插入数据A,B,C,它们的_id为1,2,3,那么如果把他们都删除了,
再插入一条数据,那么它的id为为1而不是4。
因此我就写了这个工具来生成id,它能让生成相同的id相隔尽量的远。
然后在插据入数时手动设置id,及把这个作为插入参数id传进去。
删除时,也要做相应的处理。

实例1:
文件1:
SerialManager.java
package com.teleca;

public class SerialManager {
 Node root=null;
 long min=Long.MIN_VALUE;
 long max=Long.MAX_VALUE;
 long cursor=1;
 public SerialManager()
 {
 }
 public SerialManager(long min,long max)
 {
  if(min>max)
  {
   long temp=min;
   min=max;
   max=temp;
  }
  this.min=min;
  this.max=max;
 }
 public void setSerial(long id,boolean flag)
 {
  long temp=0;
  Node node=findNode(id);
  if(flag)
  {
   if(node==null)
   {
    node=findNode(id-1);
    if(node!=null)
    {
     node.data.end=id;
     Node node2=findNode(id+1);
     if(node2!=null)
     {
      node.data.end=node2.data.end;
      this.removeNode(node2);
     }
    }
    else
    {
     Node node2=findNode(id+1);
     if(node2!=null)
     {
      node2.data.start=id;
     }
     else
      addNewNode(id,id);
    }
   }
   return;
  }
  else
  {
   if(node==null)
    return;
   Block data=node.data;
   if(data.start==data.end)
   {
    removeNode(node);
   }
   else if(id==data.start)
    data.start=id+1;
   else if(id==data.end)
    data.end=id-1;
   else
   {
    temp=data.end;
    data.end=id-1;
    addNewNode(id+1,temp);
   }
   
  }
 }
 public void setSerial(long id1,long id2)
 {
  long temp=0;
  if(id1>id2)
  {
   temp=id1;
   id1=id2;
   id2=temp;
  }
  Node node1=findNode(id1);
  Node node2=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
  {
   Block data=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);
    }
   }
  }
 }
 public long getSerial()
 {
  
  Node node=findNode(cursor);
  long start=cursor;
  while(node!=null)
  {
   cursor=node.data.end+1;
   if(cursor>max)
    cursor=min;
   else if (cursor==0)
    cursor++;
   if(cursor==start)
   {
    return 0;
   }
   node=findNode(cursor);
  }
  long res=cursor;
  cursor++;
  if(cursor>max)
   cursor=min;
  else if (cursor==0)
   cursor++;
  return res; 
 }
 public boolean isKeyUsed(long id)
 {
  return findNode(id)!=null;
 }
 private Node findNode(long id)
 {
  Node node=null;
  Node tempNode=root;
  Block block=null;
  while(tempNode!=null)
  {
   block=tempNode.data;
   if(block.start<=id&&id<=block.end)
   {
    node=tempNode;
    break;
   }
   tempNode=tempNode.next;
  }
  return node;
 }
 private void addNewNode(long id1,long id2)
 {
  Node node=new Node();
  node.data=new Block(id1,id2);
  addNode(node);
 }
 private void addNode(Node node)
 {
  if(root==null)
  {
   root=node;
   node.prev=null;
   node.next=null;
   return;
  }
  Node tempNode=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;
   }
   else if(tempNode.next==null)
   {
    tempNode.next=node;
    node.prev=tempNode;
    node.next=null;
    break;
   }
   tempNode=tempNode.next;
   
  }
   
 }
 private void removeNode(Node node)
 {
  Node prev=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;
 }
 public void clear()
 {
  Node tempNode=root;
  Node node=null;
  while(tempNode!=null)
  {
   node=tempNode;
   tempNode=tempNode.next;
   node.prev=null;
   node.next=null;
   
  }
  root=null;
  cursor=1;
 }
 public void println()
 {
  Node tempNode=root;
  while(tempNode!=null)
  {
   System.out.println("start:"+tempNode.data.start+"end:"+tempNode.data.end);
   tempNode=tempNode.next;
   
  }  
 }
}
class Node
{
 Node prev=null;
 Block data;
 Node next=null;
}
class Block
{
 long start=0;
 long end=0;
 Block(long id1,long id2)
 {
  start=id1;
  end=id2;
 }
 public long getStart() {
  return start;
 }
 public void setStart(long start) {
  this.start = start;
 }
 public long getEnd() {
  return end;
 }
 public void setEnd(long end) {
  this.end = end;
 }
}
文件2:
DBHelper.java
package com.teleca;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;;
public class DBHelper {
public static String DB_NAME="peopledb";
public static String DB_TABLE_NAME="people";
SQLiteDatabase db;
final DBOpenHelper dbOpenHelper;
final static String COLS[]=new String[]
                                      {"_id","name","phone","age"};
final String tag="hubin";
public DBHelper(Context context)
{
 this.dbOpenHelper=new DBOpenHelper(context,DB_NAME,1);
 establishDb();
}
SerialManager serialManager=new SerialManager();
private void establishDb()
{
 if(db==null)
  db=dbOpenHelper.getWritableDatabase();
 initSerial();
}
private void initSerial()
{
 serialManager.clear();
  Cursor c=db.query(DBHelper.DB_TABLE_NAME, new String[]{"_id"}, null, null, null, null, "_id DESC",null);
  c.moveToFirst();
   int count=c.getCount();
   c.moveToFirst();
   long id=0;
   for(int i=0;i<count;i++)
   {
    id=c.getLong(0);
    serialManager.setSerial(id, true);
  Log.i("hubin", "id :"+id+"set to serial");
  c.moveToNext();
   }
  c.close();
}
public void cleanup()
{
 if(db!=null)
 {
  db.close();
  db=null;
 }
}
public void insert(People people)
{
 ContentValues values=new ContentValues();
 values.put("name", people.name);
 values.put("phone", people.phone);
 values.put("age", people.age);
 long id=serialManager.getSerial();
 values.put("_id", id);
 people.id=db.insert(DBHelper.DB_TABLE_NAME, null, values);
 serialManager.setSerial(id, true);
 Log.i(tag,"insert:"+people.id);
}
public void update(People people)
{
 ContentValues values=new ContentValues();
 values.put("name", people.name);
 values.put("phone", people.phone);
 values.put("age", people.age);
 db.update(DBHelper.DB_TABLE_NAME,values,"_id="+people.id,null);
}
public void delete(long id)
{
 db.delete(DB_TABLE_NAME, "_id="+id, null);
 serialManager.setSerial(id, false);
}
public void deleteAll()
{
 db.delete(DB_TABLE_NAME, null, null);
 serialManager.clear();
}
public People get(long id)
{
 People people=new People();
 Cursor c=null;
 try{
  c=db.query(DB_TABLE_NAME, COLS,"_id= '"+id+"'",null,null,null,null);
  Log.i(tag,"count:"+c.getCount());
  if(c.getCount()>0)
  {
   c.moveToFirst();
   people=new People();
   people.id=c.getLong(0);
   people.name=c.getString(1);
   people.phone=c.getString(2);
   people.age=c.getInt(3);
  }
 }catch(SQLException e)
 {
  Log.i(tag,"",e);
 }
 finally
 {
  if(c!=null&&!c.isClosed())
  {
   c.close();
  }
 }
 return people;
}
public List<People> getAll()
{
 ArrayList<People> ret=new ArrayList<People>();
 Cursor c=null;
 try
 {
  c=db.query(DB_TABLE_NAME, COLS,null,null,null,null,null);
  int count=c.getCount();
  c.moveToFirst();
  People people;
  for(int i=0;i<count;i++)
  {
   people=new People();
   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(SQLException e)
 {
  Log.i(tag,"",e);
 }
 finally
 {
  if(c!=null&&!c.isClosed())
  {
   c.close();
  }
 }
 return ret;
}
}
class DBOpenHelper extends SQLiteOpenHelper
{
 private static final String DB_CREATE="CREATE TABLE "
  +DBHelper.DB_TABLE_NAME
  +" (_id INTEGER PRIMARY KEY,name TEXT UNIQUE NOT NULL,"
  +"phone TEXT,age INTEGER);";
 final static String tag="hubin";
 public DBOpenHelper(Context context,String dbName,int version)
 {
  super(context,dbName,null,version);
 }
 public void onCreate(SQLiteDatabase db)
 {
  try{
   db.execSQL(DB_CREATE);
  }
  catch(SQLException e )
  {
   Log.e(tag,"",e);
  }
 }
 public void onOpen(SQLiteDatabase db)
 {
  super.onOpen(db);
 }
 public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
 {
  db.execSQL("DROP TABLE IF EXISTS "+DBHelper.DB_TABLE_NAME);
  this.onCreate(db);
 }
}
文件3:
People.java
package com.teleca;
public class People {
 public long id;
 public String name;
 public String phone;
 public int age;
}
文件4:
Hello.java
package com.teleca;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Hello extends Activity {
 DBHelper dbHelper;
  final static String tag="hubin";
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button = (Button) findViewById(R.id.Button01);
        OnClickListener listener = new OnClickListener() {
         public void onClick(View v) {
          cmd = CMD_ADD;
          doAction();
         }
        };
        button.setOnClickListener(listener);
        Button button2 = (Button) findViewById(R.id.Button02);
        OnClickListener listener2 = new OnClickListener() {
         @Override
         public void onClick(View v) {
          cmd = CMD_UPDATE;
          doAction();
         }
        };
        button2.setOnClickListener(listener2);
        Button button3 = (Button) findViewById(R.id.Button03);
        OnClickListener listener3 = new OnClickListener() {
         @Override
         public void onClick(View v) {
          cmd = CMD_QUERY;
          doAction();
         }
        };
        button3.setOnClickListener(listener3);
        Button button4 = (Button) findViewById(R.id.Button04);
        OnClickListener listener4 = new OnClickListener() {
         @Override
         public void onClick(View v) {
          cmd = CMD_QUERY_ALL;
          doAction();
         }
        };
        button4.setOnClickListener(listener4);
        Button button5 = (Button) findViewById(R.id.Button05);
        OnClickListener listener5 = new OnClickListener() {
         @Override
         public void onClick(View v) {
          cmd = CMD_DELETE;
          doAction();
         }
        };
        button5.setOnClickListener(listener5);
        Button button6 = (Button) findViewById(R.id.Button06);
        OnClickListener listener6 = new OnClickListener() {
         @Override
         public void onClick(View v) {
          cmd = CMD_DELETE_ALL;
          doAction();
         }
        };
        button6.setOnClickListener(listener6);
        mHandler = new Handler();
 
    }
    public void onStop()
    {
        super.onStop();
        Log.v(tag,"onStop");
    }
    int cnt = 0;
    private Handler mHandler;
    int cmd = 0;
    final int CMD_ADD = 1;
    final int CMD_UPDATE = 2;
    final int  CMD_QUERY= 3;
    final int CMD_QUERY_ALL = 4;
    final int CMD_DELETE = 5;
    final int CMD_DELETE_ALL = 6;
    People people=new People();
    class DatabaseThread implements Runnable {
     public void run() {
      if(dbHelper==null)
       dbHelper=new DBHelper(Hello.this);
      if (cmd == CMD_ADD) {
       people.name="robin"+System.currentTimeMillis()%100;
       people.phone=""+System.currentTimeMillis();
       people.age=1;
       dbHelper.insert(people);
      } else if (cmd == CMD_UPDATE) {
       people.phone=""+System.currentTimeMillis();
       dbHelper.update(people);
      } else if (cmd == CMD_QUERY) {
       People p=dbHelper.get(people.id);
       printPeople(p);
      } else if (cmd == CMD_QUERY_ALL) {
       List<People> list=dbHelper.getAll();
       int total=list.size();
       for(int i=0;i<total;i++)
       {
        printPeople(list.get(i));
       }
      }
      else if (cmd==CMD_DELETE)
      {
       dbHelper.delete(people.id);
      }
      else if (cmd==CMD_DELETE_ALL)
      {
       dbHelper.deleteAll();
      }
      cnt++;
     }
    }
    void printPeople(People p)
    {
    Log.i(tag, "id:"+p.id);
    Log.i(tag, "name:"+p.name);
    Log.i(tag,"phone:"+p.phone);
    Log.i(tag,"age:"+p.age);
    }
    DatabaseThread dataDealer=new DatabaseThread();
    void doAction() {
     mHandler.post(dataDealer);
    }
}
原创粉丝点击