Android 如何关闭SQLite自动索引功能?

Android 如何关闭SQLite自动索引功能?,android,sqlite,ormlite,Android,Sqlite,Ormlite,我的Android应用程序使用SQLite和ORMLite处理数据。需要一次插入大量数据,我希望比现在更快。为此,我想删除索引,然后插入数据,然后重新创建索引 问题: 当应用程序创建数据库时,SQLite会自动向数据库中的某些字段添加索引。他们调用了sqlite\u autoindex\u%TableName%%ColumnName%\u 1 我的ORM实体具有标记为在db中编制索引的字段。在创建表之后,ORMLite会创建索引。SQLIte自动索引复制由ORMLIte创建的索引,因此我需要配置

我的Android应用程序使用SQLiteORMLite处理数据。需要一次插入大量数据,我希望比现在更快。为此,我想删除索引,然后插入数据,然后重新创建索引

问题: 当应用程序创建数据库时,SQLite会自动向数据库中的某些字段添加索引。他们调用了
sqlite\u autoindex\u%TableName%%ColumnName%\u 1

我的ORM实体具有标记为在db中编制索引的字段。在创建表之后,ORMLite会创建索引。SQLIte自动索引复制由ORMLIte创建的索引,因此我需要配置SQLIte以关闭自动索引。 我发现查询“
PRAGMA automatic\u index=false;”
“会关闭此功能,因此我覆盖了
或mlitesqliteopenhelper的方法

@Override
public SQLiteDatabase getWritableDatabase() {
    SQLiteDatabase db = super.getWritableDatabase();
    db.execSQL("PRAGMA automatic_index = false;");
    return db;
}
那没用。问错地方了?
请帮助

SQLite自动为主键或唯一约束中的列创建索引。 (唯一的例外是INTEGER主键。)
不能禁用这些功能。

与“几乎总是”不同,您可以不生成自动索引,这可能会显著减少数据库大小(根据自己的经验)

根据我自己的经验,当您有带有默认值“ROWID”的表时,您得到了
sqlite\u autoindex\u“table\u name”\u N
。如果使用不带ROWID的
设计表
[],则该表不再有自动索引(以及“ROWID”)

但是,请注意以下[]:

  • 没有ROWID
    表,不能使用
    自动增量
  • 没有ROWID
    表,必须有一个
    主键(为此,最好使用表行的前缀)
    
  • 没有ROWID
    的表在PK值方面表现不同:SQLite中曾经有一个bug,允许它接受主键的
    NULL
    值(因此它偏离了标准)。后来,当添加了不带ROWID的
    时,决定它还将强制执行标准语义,该语义不允许主键使用
    NULL
此外,根据我自己的经验,如果有任何
UNIQUE
约束没有PK作为前缀,则仍然会生成
sqlite\u autoindex\u“table\u name”\u N
(我们必须想象一个实现可能是什么,猜测为什么会是这样)

为了避免与SQLite中“自动索引”一词的另一用法混淆,请注意以下内容[]:

不要将自动索引与内部索引(具有“sqlite\u autoindex\u table\N”等名称)混淆,有时创建这些索引是为了实现主键约束或唯一约束。这里描述的自动索引仅在单个查询期间存在,从不持久化到磁盘,并且仅对单个数据库连接可见。内部索引是主键和唯一约束实现的一部分,是持久的并持久保存到磁盘,并且对所有数据库连接都可见术语“自动索引”因遗留原因出现在内部索引的名称中,并不表示内部索引和自动索引是相关的。


从形式上讲,使用SQLite,即自动索引,实际上意味着其他东西。这种混乱无助于解决问题,阅读官方文档时必须牢记这一点。

这一点在Ormlite和Sqlcipher中适用:

SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(...);
database.rawExecSQL("PRAGMA automatic_index = 0"); 

你的模式是什么?IIRC SQLite要求索引唯一的列,并将自动为它们创建索引<代码>PRAGMA自动索引
指的是我不知道如何获取模式信息。我认为这是主要的sqlite模式。自动索引不是临时的。我在navicat中打开了我的数据库,发现索引的类型为“normal”。我犯了一个错误:(名为sqlite\u autoindex\u%TableName%\u 1的索引没有列名。navicat显示它们没有任何列。