您必须将数据库转换为使用 Room 支持且与实体匹配的特定列类型关联性。
For NVARCHAR(200)你需要有TEXT将 NVARCHAR(200) 替换为将该列定义为字符串的实体。
For DATE如果您使用基于字符串的日期,则取决于实体定义,例如YYYY-MM-DD hh:mm:ss 那么实体应该是字符串并且列亲和力TEXT。如果将日期存储为时间戳,则实体应该很长并且列亲和力INTEGER.
答案在这里无法将表迁移到 Room,因为布尔值在 Sqlite 中保存的方式出现错误 https://stackoverflow.com/questions/56193992/cant-migrate-a-table-to-room-do-to-an-error-with-the-way-booleans-are-saved-in/56194741#56194741进行转换以将 BOOL 更改为 INTEGER。
您可以对此进行调整(尽管我对 DATE 持谨慎态度)以适应。
额外的
您可能会发现以下内容很有用。您可以在您最喜欢的 SQLite 管理器工具中针对预先存在的数据库运行它。
WITH potentialRoomChanges AS (
SELECT sm.name AS tablename, pti.name AS columnname, pti.type, dflt_value, pk,
CASE
WHEN instr(upper(pti.type),'INT') THEN 'INTEGER'
WHEN instr(upper(pti.type),'CHAR') OR instr(upper(pti.type),'CLOB') OR instr(upper(pti.type),'TEXT') THEN 'TEXT'
WHEN instr(upper(pti.type),'BLOB') THEN 'BLOB'
WHEN instr(upper(pti.type),'REAL') OR instr(upper(pti.type),'FLOA') OR instr(upper(pti.type),'DOUB') THEN 'REAL'
ELSE 'NUMERIC'
END AS roomtype ,
CASE WHEN pti.[notnull] THEN 'Investigate NOT NULL USE' END AS nnindicator,
sql
FROM sqlite_master AS sm JOIN pragma_table_info(sm.name) AS pti
WHERE
sm.type = 'table'
AND sm.name NOT LIKE 'sqlite_%'
AND sm.name <> 'android_metadata'
AND (
upper(pti.type) <> roomtype
OR instr(roomtype,'NUMERIC')
OR nnindicator IS NOT NULL
OR dflt_value IS NOT NULL
OR pk > 0
)
ORDER BY sm.name,pti.cid
)
SELECT tablename, columnname, type, roomtype,
CASE WHEN upper(type) <> upper(roomtype) THEN 'Investigate TYPE should be ' ||roomtype END AS typechange_notes,
CASE WHEN roomtype = 'NUMERIC' THEN 'Investigate NUMERIC' END AS numeric_notes,
CASE WHEN dflt_value IS NOT NULL THEN 'Investigate DEFAULT VALUE of '||dflt_value END AS default_notes,
CASE WHEN pk > 0 THEN 'Investigate PRIMARY KEY inclusion' END AS primarykey_notes,
nnindicator AS notnull_notes
FROM potentialRoomChanges
;
示例输出:-
希望列/文本是不言自明的。这基于定义的列类型(可能与使用的类型不同)。例如您可能认为浮点(显示第 5 行)是真实的。但是,根据派生类型关联,已应用第一条规则(如果类型包括 INT,则为 INTEGER)。
规则按照SQLite 版本 3 - 3.1 中的数据类型。柱亲和力的测定 https://www.sqlite.org/datatype3.html.
NUMERIC根据我对 room 的有限经验,它不是它使用的类型,因此应始终将其更改为其他类型之一。