objective-c中的SQL和oop

objective-c中的SQL和oop,sql,objective-c,database,sqlite,Sql,Objective C,Database,Sqlite,这可能是一个愚蠢的问题,我试图寻找类似的帖子,但如果有,我找不到 我开始使用SQL,这很简单,但是如何在其中保存整个对象呢 我试着更好地解释。如果我想保存一个“car”对象的实例,我应该只保存它的基本值,还是有办法保存整个对象 另外,你们建议使用哪种SQL软件?我只尝试使用Mac embedded sqlite如果愿意,可以在SQL Server中使用VARBINARY(MAX)字段类型。您可以在其中存储任何类型的对象,最大为2GB 要访问它,您可以使用ADO.NET-类似以下内容: objec

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

我开始使用SQL,这很简单,但是如何在其中保存整个对象呢

我试着更好地解释。如果我想保存一个“car”对象的实例,我应该只保存它的基本值,还是有办法保存整个对象

另外,你们建议使用哪种SQL软件?我只尝试使用Mac embedded sqlite

如果愿意,可以在SQL Server中使用VARBINARY(MAX)字段类型。您可以在其中存储任何类型的对象,最大为2GB

要访问它,您可以使用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();
如果愿意,可以在SQL Server中使用VARBINARY(MAX)字段类型。您可以在其中存储任何类型的对象,最大为2GB

要访问它,您可以使用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();

你看过核心数据了吗


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

您看过核心数据了吗

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

以下是一些想法:

>P>如果你要在Objtovi-C中进行SQLite编程,你应该考虑。这使得SQLite编程更加容易

不过,一般来说,是首选的对象持久化技术

  • 但假设您希望将对象保存在SQLite表中,则可以通过创建存档并将其保存在数据库中,将该对象作为blob存储在数据库中:

    • 创建存档(请参阅):

      但要使其工作,您必须为
      Car
      类实现
      initWithCoder
      encodeWithCoder
      方法,如本节所述:

    • 您可以将其保存为数据库中的blob。使用
      sqlite3\u bind\u 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\u column\u blob
      sqlite3\u column\u bytes
      ,或者再次使用FMDB使您的生活更轻松):

  • 在向您展示了如何将对象存储为blob之后,我不鼓励您这样做。(哈哈)。我鼓励您创建一个反映对象模型的SQLite数据模型,并将各个属性存储在表的不同列中

  • 或者更好地使用核心数据。

    一些想法:

    >P>如果你要在Objtovi-C中进行SQLite编程,你应该考虑。这使得SQLite编程更加容易

    不过,一般来说,是首选的对象持久化技术

  • 但假设您希望将对象保存在SQLite表中,则可以通过创建存档并将其保存在数据库中,将该对象作为blob存储在数据库中:

    • 创建存档(请参阅):

      但要使其工作,您必须为
      Car
      类实现
      initWithCoder
      encodeWithCoder
      方法,如本节所述:

    • 您可以将其保存为数据库中的blob。使用
      sqlite3\u bind\u 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\u column\u blob
      sqlite3\u column\u bytes
      ,或者再次使用FMDB使您的生活更轻松):

  • 在向您展示了如何将对象存储为blob之后,我不鼓励您这样做。(哈哈)。我鼓励您创建一个反映对象模型的SQLite数据模型,并将各个属性存储在表的不同列中

  • 或者更好,使用核心数据

    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);
    }