【问题标题】:How to create sequential number but not ROWID in Android SQLite database?如何在 Android SQLite 数据库中创建序列号而不是 ROWID?
【发布时间】:2013-08-20 01:11:07
【问题描述】:

我正在开发一个包含 Android SQLite 数据库的应用程序。我在这个数据库中添加和删除行。当我删除我的行时,它基于 ROWID。但我发现,尽管我删除了该行,但 ROWID 仍然存在。因此,例如,如果我的数据库中有 3 行并删除第 2 行,我的第三行不会更改为 2,它仍然是 3。然后如果我添加一行,它将是 4。

所以我的问题是,当我删除一行并添加一个新行时,如何做到这一点,然后添加的行数将等于删除的行。因此,例如,如果我删除第一行,那么数据库将在其他行旁边显示我 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 的初学者。

提前致谢

【问题讨论】:

    标签: java android sqlite android-sqlite


    【解决方案1】:

    SQLite 跟踪表曾经拥有的最大 ROWID 使用特殊的 SQLITE_SEQUENCE 表。

    您可以更新 SQLITE_SEQUENCE 表-

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

    n 是 rowid - 1

    Similar question.

    【讨论】:

    • 这会起作用,但它也会对性能造成影响,并且会随着表的增长而增长。如果这个表会有很多插入和删除,随着表的增长,插入会变慢。
    • @DaveSwersky 我想在自动密钥生成上搞乱他们的算法也不是一件好事。
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 2023-04-03
    • 2014-11-24
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多