Android 如何关闭SQLite自动索引功能?
我的Android应用程序使用SQLite和ORMLite处理数据。需要一次插入大量数据,我希望比现在更快。为此,我想删除索引,然后插入数据,然后重新创建索引 问题: 当应用程序创建数据库时,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创建的索引,因此我需要配置
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
主键(为此,最好使用表行的前缀)李>
的表在PK值方面表现不同:SQLite中曾经有一个bug,允许它接受主键的没有ROWID
值(因此它偏离了标准)。后来,当添加了不带ROWID的NULL
时,决定它还将强制执行标准语义,该语义不允许主键使用
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显示它们没有任何列。