这可能是一个愚蠢的问题,我试图寻找类似的帖子,但如果有的话我找不到。
我开始使用 SQL,这很容易,但我怎样才能在其中保存整个对象呢?
我试图更好地解释。如果我想保存一个“汽车”对象的实例,我应该只保存它的原始值还是有办法保存整个对象?
另外,你们建议使用哪些 SQL 软件?我只尝试使用 Mac 嵌入式 sqlite
这可能是一个愚蠢的问题,我试图寻找类似的帖子,但如果有的话我找不到。
我开始使用 SQL,这很容易,但我怎样才能在其中保存整个对象呢?
我试图更好地解释。如果我想保存一个“汽车”对象的实例,我应该只保存它的原始值还是有办法保存整个对象?
另外,你们建议使用哪些 SQL 软件?我只尝试使用 Mac 嵌入式 sqlite
几个想法:
如果你打算在 Objective-C 中进行 SQLite 编程,你应该考虑FMDB。这使得 SQLite 编程变得更加容易。
不过,一般来说,Core Data是首选的对象持久性技术。
但是假设您想将对象保存在 SQLite 表中,您可以通过创建存档并将其保存在数据库中来将该对象作为 blob 存储在数据库中:
创建档案(请参阅档案和序列化编程指南):
Car *car = [[Car alloc] init];
car.make = @"Honda";
car.model = @"Accord";
car.year = 1998;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:car];
但要使其工作,您必须为您的类实现initWithCoder
和encodeWithCoder
方法,Car
如编码和解码对象部分所述:
- (NSArray *)propertyNames
{
return @[@"make", @"model", @"year"];
}
- (id) initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
for (NSString *key in [self propertyNames]) {
[self setValue:[aDecoder decodeObjectForKey:key] forKey:key];
}
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
for (NSString *key in [self propertyNames]) {
[aCoder encodeObject:[self valueForKey:key] forKey:key];
}
}
您可以将其保存为数据库中的 blob。使用sqlite3_bind_blob
或者更容易使用 FMDB:
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString *path = [documentsPath stringByAppendingPathComponent:@"cars.sqlite"];
FMDatabase *database = [FMDatabase databaseWithPath:path];
[database open];
[database executeUpdate:@"create table if not exists cars (data blob)"];
[database executeUpdate:@"insert into cars (data) values (?)", data];
您可以稍后从数据库中读取此内容(使用sqlite3_column_blob
and sqlite3_column_bytes
,或者再次使用 FMDB 让您的生活更轻松):
FMResultSet *rs = [database executeQuery:@"select data from cars"];
while ([rs next])
{
NSData *carData = [rs dataForColumnIndex:0];
Car *carFromDatabase = [NSKeyedUnarchiver unarchiveObjectWithData:carData];
NSLog(@"%@, %@, %d", carFromDatabase.make, carFromDatabase.model, carFromDatabase.year);
}
在向您展示了如何将对象存储为 blob 之后,我不鼓励您这样做。(哈哈)。我鼓励您创建一个反映对象模型的 SQLite 数据模型,并将各个属性存储在表的单独列中。
或者更好的是,使用核心数据。
你看过核心数据链接吗
它使使用 sqlite 变得非常容易,并且在 Mac 和 iOS 上受支持。
如果您愿意,可以在 SQL Server 中使用 VARBINARY(MAX) 字段类型。您可以在其中存储任何类型的对象,最大为 2 GB。
要访问它,您可以使用 ADO.NET - 如下所示:
object yourMysteryObject = (whatever you like it to be);
MemoryStream memStream = new MemoryStream();
StreamWriter sw = new StreamWriter(memStm);
sw.Write(yourMysteryObject);
SqlCommand sqlCmd = new SqlCommand("INSERT INTO TableName(VarBinaryColumn) VALUES (@VarBinary)", sqlConnection);
sqlCmd.Parameters.Add("@VarBinary", SqlDbType.VarBinary, Int32.MaxValue);
sqlCmd.Parameters["@VarBinary"].Value = memStream.GetBuffer();
sqlCmd.ExecuteNonQuery();