从NSData中检索一个列表,该列表以BLOB的形式存储在Flutter应用程序中的SQLite和核心数据中



我是Flutter的新手,希望能得到一些帮助。我用核心数据为iOS构建了一个SwiftUI应用程序。我的下一步是构建一个Flutter应用程序,为即将到来的版本支持iOS和Android。因此,我重新构建了整个应用程序。

原生iOS应用程序正在使用核心数据,我在那里保存了一些东西。例如一些字符串以及Double值的列表:[Double](例如[5.5, 4.3]。我使用了一个Transformable attributeType来存储它(还有一个值TransformerNameNSSecureUnarchiveFromDataTransformerName(。

我想把所有的";旧的";数据从iOS应用程序到我的新Flutter应用程序。我能够加载";旧的";我的Flutter应用程序中的数据库,并获取所有数据并将其保存到Floor的新数据库中。目前,我很难从[Double]中获取值。

我可以使用DB工具来调查";旧的";数据库该列表存储为BLOB。我看不到任何";有用的";DB工具中的值/数据。

在我的Flutter应用程序中,我试图用获取专栏的内容

Uint8List doubleList = (element["ZSHOOTS"] as Uint8List);

然后我有一个清单,里面有很多项目(数字((但不是我的(。我试着简单地铸造,但没有成功。

我的问题是,如何检索BLOB值并获得Doubles列表?在本机iOS应用程序SwiftUI中,一切都很正常。我认为SwiftUI正在将我的[Double]转换为NSData对象,并将其作为BLOB保存在数据库中。当访问应用程序中的属性时,它会自动将其转换回。现在我必须在我的Flutter应用程序中进行转换,但我不知道如何:-(

一种可能性是以SwiftUI在访问数据时执行转换的方式编写转换。但我不知道在哪里可以找到这种转变。感谢您的帮助和建议。

Core Data是一个对象图管理系统,它还提供数据持久性。它不是一个对象关系映射框架。虽然存储类型之一是SQLite,但对象图的持久化方式是核心数据专用的实现细节。

这意味着核心数据可以自由地以其认为合适的方式持久化对象图,包括将属性存储为Blob或其他可能只对核心数据框架有意义的数据类型。

IOW,这发生在核心数据级别,而不是SwiftUI级别。

核心数据可转换属性使用NSCoding进行编码。如果您采用NSCoding协议——这意味着实现init(coder:)encode(with coder:)——您应该能够使用Core data存储在SQLite中的二进制数据实例化对象。您可以通过创建NSKeyedUnarchiver的实例并使用该类中的函数来取消归档对象实例,从而使用该协议。它会调用NSCoding函数,而不会直接调用它们。

使用NSCoding可能需要使用从NSObject继承的对象。Swift结构和非NSObject类如果不是不可能的话,也会很棘手。

如果是我,我不会做以上任何事情。我会将核心数据保存在应用程序中,并通过以下方式迁移数据:(1(从核心数据中获取数据,使其创建对象实例,然后(2(以我需要的任何新格式保存数据。SQLite模式是未记录的,当苹果的框架已经为您提供了一种直接获取数据的方法时,对其进行逆向工程几乎总是一个坏主意。

请记住,尽管名称相似,但NSCoding与SwiftCodable无关。用其中一个编码的数据无法用另一个解码。您不能使用Codable来解码核心数据的SQLite Blob。

BLOB列中的数据很有可能存储为zlib压缩的json,因此您应该能够使用压缩库将其解压缩为可以更容易操作的json字符串。

如果你想验证这确实是事实,这就是我在Python中的做法:

import sqlite3
import zlib
db = sqlite3.connect("<DBNAME>.db")
cursor = db.cursor()
for column in cursor.execute('SELECT <BLOB-COLUMN-NAME> FROM <TABLE-NAME> LIMIT 1'):
print(zlib.decompress(column))

最新更新