2013-08-19 30 views
0

我的工作包含了Android的SQLite數據庫的應用程序。我在這個數據庫中添加和刪除行。當我刪除我的行時,它基於ROWID。但我發現,儘管我刪除了該行,但ROWID仍然存在。因此,舉例來說,如果我有我的數據庫3行刪除第二行,我的第三排都不會改變,以2仍然3.然後,如果我添加一行,這將是4如何在Android SQLite數據庫中創建序列號但不是ROWID?

所以我的問題是,如何做到這一點,當我刪除一行,並添加一個新的,然後添加的行的數量將等於刪除的行。因此,舉例來說,如果我刪除的第一行,比數據庫會告訴我旁邊的其他行1,2,3 ...,而不是2,3,4 ...

對不起,也許這是一個有點有點複雜,但我希望它是有道理的。

這裏是我的代碼:

public HotOrNot open() throws SQLException{ 
ourHelper = new DbHelper(ourContext); 
ourDatabase = ourHelper.getWritableDatabase(); 
return this; 
} 
public void close(){ 
ourHelper.close(); 
} 

public long createEntry(String name, String hotness) { 
// TODO Auto-generated method stub 
ContentValues cv = new ContentValues(); 
cv.put(KEY_NAME, name); 
cv.put(KEY_HOTNESS, hotness); 
return ourDatabase.insert(DATABASE_TABLE, null, cv); 
} 

public String getData() { 
// TODO Auto-generated method stub 
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 
String result = ""; 

int iRow = c.getColumnIndex(KEY_ROWID); 
int iName = c.getColumnIndex(KEY_NAME); 
int iHotness = c.getColumnIndex(KEY_HOTNESS); 

for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()){ 
    result = result + c.getString(iRow) + " " + c.getString(iName) + " " + c.getString(iHotness) + "\n"; 
} 
return result; 
} 

public String getName(long l) throws SQLException{ 
// TODO Auto-generated method stub 
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null); 
if(c != null){ 
    c.moveToFirst(); 
    String name = c.getString(1); 
    return name; 
} 
return null; 
} 

public String getHotness(long l) throws SQLException{ 
// TODO Auto-generated method stub 
String[] columns = new String[]{ KEY_ROWID, KEY_NAME, KEY_HOTNESS}; 
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, KEY_ROWID + "=" + l, null, null, null, null); 
if(c != null){ 
    c.moveToFirst(); 
    String hotness = c.getString(2); 
    return hotness; 
} 
return null; 
} 

public void updateEntry(long lRow, String mName, String mHotness) throws SQLException{ 
// TODO Auto-generated method stub 
ContentValues cvUpdate = new ContentValues(); 
cvUpdate.put(KEY_NAME, mName); 
cvUpdate.put(KEY_HOTNESS, mHotness); 
ourDatabase.update(DATABASE_TABLE, cvUpdate, KEY_ROWID + "=" + lRow, null); 
} 

public void deleteEntry(long lRow1) throws SQLException{ 
// TODO Auto-generated method stub 
ourDatabase.delete(DATABASE_TABLE, KEY_ROWID + "=" + lRow1, null); 
} 
} 

我知道,它可以不使用ROWID來完成,因爲它爲每個行唯一的。 能否請您寫代碼是如何來解決這個問題,因爲我是初學者在Android和也SQLite中。

在此先感謝

回答

1

SQLite的跟蹤最大的ROWID的,使用特殊SQLITE_SEQUENCE表的表曾舉辦過 。

您可以更新SQLITE_SEQUENCE表 -

UPDATE SQLITE_SEQUENCE SET seq = <n> WHERE name = <table_name> 

ñ是ROWID - 1

Similar question.

+0

這是可行的,但它也將是一個性能命中將增長與桌子。如果這個表有很多插入和刪除,插入會隨着表的增長而變慢。 –

+0

@DaveSwersky也與他們的自動密鑰生成算法中搞亂不是我想是一件好事。 –

相關問題