2

这可能是一个愚蠢的问题,我试图寻找类似的帖子,但如果有的话我找不到。

我开始使用 SQL,这很容易,但我怎样才能在其中保存整个对象呢?

我试图更好地解释。如果我想保存一个“汽车”对象的实例,我应该只保存它的原始值还是有办法保存整个对象?

另外,你们建议使用哪些 SQL 软件?我只尝试使用 Mac 嵌入式 sqlite

4

3 回答 3

3

几个想法:

  1. 如果你打算在 Objective-C 中进行 SQLite 编程,你应该考虑FMDB。这使得 SQLite 编程变得更加容易。

    不过,一般来说,Core Data是首选的对象持久性技术。

  2. 但是假设您想将对象保存在 SQLite 表中,您可以通过创建存档并将其保存在数据库中来将该对象作为 blob 存储在数据库中:

    • 创建档案(请参阅档案和序列化编程指南):

      Car *car = [[Car alloc] init];
      car.make = @"Honda";
      car.model = @"Accord";
      car.year = 1998;
      
      NSData *data = [NSKeyedArchiver archivedDataWithRootObject:car];
      

      但要使其工作,您必须为您的类实现initWithCoderencodeWithCoder方法,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_bloband 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);
      }
      
  3. 在向您展示了如何将对象存储为 blob 之后,我不鼓励您这样做。(哈哈)。我鼓励您创建一个反映对象模型的 SQLite 数据模型,并将各个属性存储在表的单独列中。

或者更好的是,使用核心数据。

于 2013-08-12T19:48:23.767 回答
1

你看过核心数据链接吗

它使使用 sqlite 变得非常容易,并且在 Mac 和 iOS 上受支持。

于 2013-08-12T19:22:06.450 回答
0

如果您愿意,可以在 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();
于 2013-08-12T19:03:27.340 回答