Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在sqlite中重置自动递增序列号_Android_Sqlite_Ormlite - Fatal编程技术网

Android 如何在sqlite中重置自动递增序列号

Android 如何在sqlite中重置自动递增序列号,android,sqlite,ormlite,Android,Sqlite,Ormlite,如何在Ormlite中更新表sqlite_序列?我只需要更新一下。我怎样才能通过ORMLite得到那张桌子 编辑 我找不到ORLite工具来做这个,所以我使用简单的sqlite查询。在我的扩展类OrmLiteSqliteOpenHelper中,我使用SQLiteDatabase进行更新 EDIT2;) 在我的项目中,我坚持课堂课和课堂周定义 class Lesson{ @DatabaseField(generatedId=true) private int id; ...

如何在Ormlite中更新表sqlite_序列?我只需要更新一下。我怎样才能通过ORMLite得到那张桌子

编辑

我找不到ORLite工具来做这个,所以我使用简单的sqlite查询。在我的扩展类OrmLiteSqliteOpenHelper中,我使用SQLiteDatabase进行更新

EDIT2;)

在我的项目中,我坚持课堂课和课堂周定义

class Lesson{
    @DatabaseField(generatedId=true)
    private int id;
    ...
}

class WeekDefinitions{
    @DatabaseField(generatedId=true)
    private int id;
    @DatabaseField(foreign=true, columnName="lesson_id")
    private Lesson lesson;
    ...
}
现在,当我添加新课程时,id是increment。比如说

id = 1 Math
id = 2 English
id = 3 Medicine
在工作日定义中:

id = 1 lesson_id = 1  nr = 20
id = 2 lesson_id = 1  nr = 22
id = 3 lesson_id = 2  nr = 32
...
id = 12 lesson_id = 3  nr = 3
SQLite将此行添加到SQLite_序列中(使用自动增量时)

现在,我删除了表中的所有行。之后,Lesson和WeekDef为空,但sqlite_序列仍然相同。这是一个问题,因为表lesson中的id从值4开始(seq from sqlite_sequence for lesson And add 1):

和工作日定义

id = 13 lesson_id = 1  nr = 20
id = 14 lesson_id = 1  nr = 22
id = 15 lesson_id = 2  nr = 32
对于lesson id=4,我应该得到weekDefinitions,但在weekDefinitions中,lessons_id的值只有1到3
这就是我的问题。我需要“重置”sqlite_序列表(或者有更好的解决方案?

如果要在ORMLite中发出常规数据库命令,可以使用
updateRaw
方法。看。还有用于其他命令的
executeRaw

lessonDao.updateRaw("delete from 'lesson';");
lessonDao.updateRaw("delete from sqlite_sequence where name='lesson';");
weekDefinitionDao.updateRaw("delete from 'weekdefinition';");
weekDefinitionDao.updateRaw(
    "delete from sqlite_sequence where name='weekdefinition';");
您还可以删除并重新创建表:

TableUtils.dropTable(WeekDefinition.class);
TableUtils.dropTable(Lesson.class);
TableUtils.createTable(Lesson.class);
TableUtils.createTable(WeekDefinition.class);
我认为真正的问题是,为什么您的应用程序依赖于这个数据库内部编号?它真的不应该在乎

  • 如果根本不显示数字,那么它可以是1或1001,而您的应用程序就无关紧要了,怎么样
  • 您也永远无法删除这些课程,但可能会添加一个隐藏的布尔字段。因此,如果它们被重新添加,隐藏字段可能被设置为false,
    Math
    仍将位于id#1

在.db文件中有一个名为
sqlite\u sequence的表

每行有两列
name
哪个是表的名称
seq
表示此表中当前最后一个值的整数

您可以将其更新为
0


但是,如果您的表使用此id作为唯一标识符,请小心。

基于Marcos Vasconcelos'构建:


此查询将
seq
设置为
Tbl
表中
col
identity列中的最大值,因此没有违反约束的风险。

这在我的数据库中对我有效:(我将id设置在一行之前,然后在删除一行之后,当我再次添加新数据行时,自动递增序列保持正常):

UPDATE SQLITE_SEQUENCE SET SEQ= 'value' WHERE NAME='table_name';

请你重新表述你的问题,并提供更多细节。我不知道你在问什么。什么是“sqlite_序列”?是否仅从数据库中的表中获取序列号?因此,您持久化的对象只有一个生成的id?Bandzio,您真的应该接受其中一个答案;这两个都很好,已经有6个多月了。谢谢,这正是我想要的for@byteC0de是否用要更新的列名替换col,用要更新的表名替换Tbl?
TableUtils.dropTable(WeekDefinition.class);
TableUtils.dropTable(Lesson.class);
TableUtils.createTable(Lesson.class);
TableUtils.createTable(WeekDefinition.class);
UPDATE sqlite_sequence SET seq = (SELECT MAX(col) FROM Tbl) WHERE name="Tbl"
UPDATE SQLITE_SEQUENCE SET SEQ= 'value' WHERE NAME='table_name';
 public void  updateSerialNumber ( long memberId){
        String query = "UPDATE SQLITE_SEQUENCE SET SEQ= '"+(memberId-1)+"' WHERE NAME='"+ReportBigHelper.TABLE_MEMBER+"'";
        database.execSQL(query);
    }