Android 数据库 删除记录后 _id正常指向记录位置

Android自带的数据库不支持主键id的改动,删除一个中间的记录后id变得断断续续的,id将无法正确指明记录的正确位置。于是新增加一列integer型的_id替代id,对应记录的真实位置,在创建表,删除记录,添加记录时对它进行相应改动,使它始终正确的指向记录。
下面举一例:
(1)创建表。在原有的列中多增一列_id:

String sql = "create table Note(" +
 "id integer primary key autoincreme, "+ 
            "name text, " + "_id integer)";
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(sql);
    }

(2)添加记录。将最后一条记录的_id值加1赋值给新添加记录的_id,当然如果数据库是空的,就直接给它赋值为0:


        Cursor cursor = dbWriter.query("Note", null, null, null, null, null,
                null);
        if (!cursor.moveToFirst()) {
            ID = 0;
        } else {
            cursor.moveToLast();
            ID = cursor.getInt(cursor.getColumnIndex("_id"));
            ID++;
        }

        String sql = "insert into Note(name,_id) values(?,?)";

        Object obj[] = { "这里是你想添加记录的内容", ID };
        dbWriter.execSQL(sql, obj);

(3)删除某一条记录。提供要删的记录的_id(这里以num想要删除记录的_id为例),将它删除同时将其后记录的_id均减1:

dbReader.delete("Note", "_id = ?", new String[] { ""+num});

                Cursor cursor = dbReader.query("Note", null, null, null, null,
                        null, null);
                if (cursor.moveToFirst()) {
                    do {
                        int ID = cursor.getInt(cursor.getColumnIndex("_id"));
                        if (ID > num) {
                            ID--;
                            ContentValues values = new ContentValues();
                            values.put("_id", ID);
                            dbReader.update("Note", values, "_id=?",
                                    new String[] { ID + 1 + "" });

                        }
                    } while (cursor.moveToNext());
                }

这样id不可改的问题就通过添加了一个可改的_id解决了

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值