【问题标题】:How do i auto-decrement primary key value in SQlite Android如何在 SQlite Android 中自动递减主键值
【发布时间】:2013-09-19 11:04:47
【问题描述】:

我在 android SQLite 中有一个表,我试图弄清楚如何重置 KEY_ID,我读到:DELETE FROM tablename 应该删除所有内容并将自动增量字段重置为 0,但是当我这样做时它只是删除数据。插入新记录时,自动增量会从删除前停止的位置开始。我在列表中实现了longitemclicklistner,它获取位置,我想从列表中删除特定项目。 这是我的代码

public void deleteContact(Contact contact) {
        SQLiteDatabase db = this.getWritableDatabase();
        getWritableDatabase().delete(TABLE_CONTACTS, KEY_ID + " = ?",
                new String[] { String.valueOf(contact.getID()) } );


        db.close();
    }

这是onlongclicklistner中的代码

 public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                     int pos, long id) {
                // TODO Auto-generated method stub

                Log.v("long clicked","pos"+" "+pos);

                final int p=pos+1;

                final AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this);
                b.setIcon(android.R.drawable.ic_dialog_alert);
                b.setMessage("Are you sure you want to DELETE this Entry?");
                b.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                           // continue with delete

                            db.getWritableDatabase();
                            db.deleteContact(db.getContact(p));
                            Intent i = new Intent(MainActivity.this,MainActivity.class);
                            startActivity(i);
                        }
                });
                b.setNegativeButton("No", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            // do nothing
                        }
                });

                b.show();

         }

问题是,id1 被创建,然后id2 被创建,但是当我删除id2 并创建一个新联系人时,它会得到id3。我希望它得到id2

【问题讨论】:

  • 使用 Truncate 而不是 DELETE 语句,这将删除您的数据并将自动增量设置为 0。
  • @Vigbyor TRUNCATE 在 sqlite 中不可用。

标签: android android-sqlite sqliteopenhelper sqlite


【解决方案1】:

这是AUTOINCREMENT 的一个功能。要使键重用,请从

更改列定义
INTEGER PRIMARY KEY AUTOINCREMENT

只是

INTEGER PRIMARY KEY

延伸阅读:http://sqlite.org/autoinc.html

【讨论】:

  • 我正在使用 INTEGER PRIMARY KEY,但它仍然在做同样的事情,而且我已经将数据库版本增加到,仍然没有用
  • 如果未明确指定,id INTEGER PRIMARY KEY 字段可能会获取值 MAX(id)+1。如果您在中间删除了某些内容,则其 id 不会被重用。
【解决方案2】:

你为什么需要那个?它会使插入非常慢。假设你有数据 1,2,3,4....700,你删除了 2,你会怎么做?把所有的数字都上移? (重新插入)?

或者您将下一个插入索引设置为 2?就在那时...现在删除 18、45、70。并插入一个新行。插入到 18 后...它必须搜索 45?假设您现在也跟踪所有空白空间,即使那样,您将如何满足以随机顺序删除 205、102、300、50

您可以使用堆来存储可用索引,但这也没有任何意义。也许如果您有一些特定的用例并与我们分享,我们将能够为您提供更好的帮助。

【讨论】:

  • 我有一个通用列表,每次创建新联系人时,都会将其添加到列表中,列表最多包含 200 个项目。我通过获取列表的位置来使用列表中的 DELETE() 函数。 pos+1 上的数据库条目是从数据库表中删除的。
猜你喜欢
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多