在Android/SQLite中获取未使用rowid的有效方法?

在Android/SQLite中获取未使用rowid的有效方法?,android,sqlite,Android,Sqlite,假设您不想为下面的表myTable回收行ID 为此,您定义: CREATE TABLE myTable ( id INTEGER PRIMARY KEY AUTOINCREMENT , <Other columns> ) 创建表myTable ( id整数主键自动递增, ) 然后,您希望在android/SQLite环境中获得下一个未使用的rowid 你将如何有效地做到这一点 也许我们需要一个目标 android.database.sqlite.SQLiteDatabas

假设您不想为下面的表myTable回收行ID

为此,您定义:

CREATE TABLE myTable
(
  id INTEGER PRIMARY KEY AUTOINCREMENT ,
  <Other columns>
)
创建表myTable
(
id整数主键自动递增,
)
然后,您希望在android/SQLite环境中获得下一个未使用的rowid

你将如何有效地做到这一点

也许我们需要一个目标 android.database.sqlite.SQLiteDatabase 也许(?)反对 android.database.sqlite.SQLiteStatement

但完成这项任务最有效的方法是什么

注: 我不想在myTable中创建行。 当然,您可以创建行并删除它
如果这是执行作业的最佳方法。

您可以从中读取该序列的当前值。

如您所确定,创建一行并删除它是一种有效的方法。另一种方法是运行

SELECT id FROM myTable ORDER BY id DESC
然后查看返回的第一行的id,并将其递增1。但要注意并发性。如果在检查未使用的行后立即插入内容,则可能会出现一些意外行为


编辑:查看CL.的答案。它更实用。此外,您还可以手动更新该表的序列号,以确保您的行不会被使用

我一直不明白为什么有人需要这么做,但这是可以做到的:

提到自动增量值存储在
sqlite\u序列
表中,该表在使用自动增量时自动在数据库中创建


解释了一种查询sqlite_序列的方法,以查找当前最大ID,然后可以向其中添加1,99.9%的时间是下一个ID发出的时间。

因此答案如下:

db.execSQL("UPDATE sqlite_sequence set seq=seq+1 WHERE name='myTable'");

SQLiteStatement st = db.compileStatement("SELECT seq from sqlite_sequence WHERE name='myTable'");
long v = st.simpleQueryForLong();
st.close();
现在v是未使用的rowid,其他任何人都无法获得。 也许这些语句必须在同一事务中


对于简单且非常常见的任务来说,不是那么简单吗?

在您使用的
SQLiteOpenHelper
中,启动一个事务。插入一些数据,然后回滚

这样,您就可以获得下一行id,如下所示:

public long nextId() {
    long rowId = -1;

    SQLiteDatabase db = getWritableDatabase();
    db.beginTransaction();
    try {
        ContentValues values = new ContentValues();
        // fill values ...

        // insert a valid row into your table
        rowId = db.insert(TABLE_NAME, null, values);

        // NOTE: we don't call  db.setTransactionSuccessful()
        // so as to rollback and cancel the last changes
    } finally {
        db.endTransaction();
    }
    return rowId;
}

该表包含上次使用的id。然后我必须更新1,然后选择该表以执行此简单而重要的任务???简单且非常常见的任务将只是插入一条新记录。为什么不想这样做呢?再一次:我不想在需要id的同时将记录插入表中,但我必须确保id是为我保留的。所以插入不起作用。Insert+delete有效,但效果不太好。SQLite手册中有一条警告:“修改此表可能会干扰自动增量密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。”您还应该牢记,自动增量行并不总是下一个精确的数字。某些情况可能会导致自动增量值提供的数字a)大于当前值1,或b)先前删除的另一行id。我会插入一个空行来保留一个ID,然后用更新填充丢失的数据。