精华内容
参与话题
问答
  • nsdata

    2019-10-09 02:32:46
    NSData NSDate NSString NSArray NSDictionary 相互转换,nsdatansdate // NSData NSDate NSString NSArray NSDictionary json NSString *string = @"hello word"; NSData *data = [s...

    NSData NSDate NSString NSArray NSDictionary 相互转换,nsdatansdate

     

    //    NSData  NSDate NSString NSArray NSDictionary json
        
        
        NSString *string = @"hello word";
        NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
        NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",nil];
        NSString *dateString = @"19891123";
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"hello", @"word",
                             @"chen", @"lu",
                             @"jin", @"mei",
                             @"cerastes", @"hehe",nil];
    
    //    NSString to NSData
        NSData *string2data = [string dataUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"%@",string2data);
    //    NSData to NSString
        NSString *data2String = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"dataString = %@",data2String);
        
    //    NSArray to NSData
        
        NSData *arry2data = [NSKeyedArchiver archivedDataWithRootObject:array];
    //    NSData to NSArray
        NSArray *data2arry = [NSKeyedUnarchiver unarchiveObjectWithData:arry2data];
        NSLog(@"%@  /n %@",arry2data,data2arry);
        
    //    NSString to NSDate
        NSDate *string2date = [self convertDateFromString:dateString withFormattre:@"yyyyMMdd"];
        NSLog(@"date = %@",string2date);
        
    //    NSDate to NSString
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
        NSString *date2string = [dateFormatter stringFromDate:[NSDate date]];
        NSLog(@"%@", date2string);
        
    
    //   NSArray to NSString
        
        
        NSString *arry2String = [array componentsJoinedByString:@" "];
        
        NSLog(@"string = %@",arry2String);
        
        
    //    NSString to NSArray
        NSArray *string2Arry = [arry2String componentsSeparatedByString:@" "];
        NSLog(@" %@",string2Arry);
        
    
        
    //    NSDictionary to NSData:
        NSMutableData *dic2data = [[NSMutableData alloc] init];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dic2data];
        [archiver encodeObject:dic forKey:@"Some Key Value"];
        [archiver finishEncoding];
        NSLog(@"%@",dic2data);
        
    //    NSData to NSDictionary
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:dic2data];
        NSDictionary *data2dic = [unarchiver decodeObjectForKey:@"Some Key Value"];
        [unarchiver finishDecoding];
        NSLog(@"%@",data2dic);
        
        
    //    NSDictionary to NSString
        NSString *dic2string=[dic JSONRepresentation]; //这个方法是SBJson类库里的,需要导入SBJson.h
        NSLog(@"%@",dic2string);
        
    //    NSString to NSDictionary
        NSError *error = nil;
        NSDictionary *string2dic = [NSJSONSerialization JSONObjectWithData: [dic2string dataUsingEncoding:NSUTF8StringEncoding]
                                        options: NSJSONReadingMutableContainers
                                          error: &error];
        NSLog(@"%@",string2dic);
    




    Cocoa怎应用设计模式解答

     

    Cocoa经常把自己与众不同的工作机制建立在模式上,它的设计受到诸如语言能力或现有架构这样因素的影响。 本部分包含设计模式:可重用的面向对象软件的元素一书中编目的大多数设计模式的介绍。每个设计模式都有一个总结性的描述,以及该模式的Cocoa实现的讨论。文中列出的都是Cocoa实现的模式,每个模式的讨论都发生在特定的Cocoa环境中。我们推荐您熟悉这些模式,您会发现这些模式在Cocoa软件开发中非常有用。 Cocoa中设计模式的实现有不同的形式。下面部分中描述的一些设计—比如协议和范畴—是Objective-C语言的特性;在另外一些场合中,“模式的实例”被实现为一个类或一组相关的类(比如类簇和单件类);还有一些场合下,模式表现为一个大的框架结构,比如响应者链模式。对于某些基于模式的机制,您几乎可以“免费”使用;而另外一些机制则要求您做一些工作。即使对于Cocoa没有实现的模式,我们也鼓励您在条件许可的情况下自行实现,比如在扩展类的行为时,对象合成(装饰模式)技术通常就比生成子类更好。 有两个设计模式没有在下面的内容中进行讨论,即模型-视图-控制器(MVC)模式和对象建模。MVC是一种复合或聚合模式,就是说它基于几种不同类型的模式。对象建模在四人组的分类目录中没有对应类别,它源自关系数据库领域。然而,MVC和对象建模在Cocoa中可能是最重要和最普遍的设计模式或用语,而且它们在很大程度上是相关的。它们在几个技术的设计中发挥关键的作用,包括绑定、撤消管理、脚本控制、和文档架构。要了解更多有关这些模式的信息,请参见"模型-视图-控制器设计模式"和"对象建模"部分。 本部分包含如下主要内容:抽象工厂模式适配器模式责任链模式命令模式合成模式装饰模式表观模式跌代器模式仲裁者模式备忘录模式观察者模式代理模式单件模式模板方法模式 抽象工厂模式提供一个接口,用于创建与某些对象相关或依赖于某些对象的类家族,而又不需要指定它们的具体类。通过这种模式可以去除客户代码和来自工厂的具体对象细节之间的耦合关系。 类簇类簇是一种把一个公共的抽象超类下的一些私有的具体子类组合在一起的架构。抽象超类负责声明创建私有子类实例的方法,会根据被调用方法的不同分配恰当的具体子类,每个返回的对象都可能属于不同的私有子类。 Cocoa将类簇限制在数据存储可能因环境而变的对象生成上。Foundation框架为NSString、NSData、NSDictionary、NSSet、和NSArray对象定义了类簇。公共超类包括上述的不可变类和与其相互补充的可变类NSMutableString、NSMutableData、NSMutableDictionary、NSMutableSet、和NSMutableArray。 使用和限制 当您希望创建类簇代表的类型的可变或不可变对象时,可以使用类簇中的某个公共类来实现。使用类簇是在简洁性和扩展性之间进行折衷。类簇可以简化类接口,因此使其更易于学习和使用,但是创建类簇抽象类的定制子类则会变得更加困难。进一步阅读: "类簇" 部分提供有关Cocoa类簇的更多信息。 适配器模式将一个类接口转化为客户代码需要的另一个接口。适配器使原本由于兼容性而不能协同工作的类可以工作在一起,消除了客户代码和目标对象的类之间的耦合性。 协议协议是一个编程语言级别(Objective-C)的特性,它使定义适配器模式的实例成为可能(在 Java中的“接口”和“协议”是同义的)。如果您希望一个客户对象和另一个对象进行交流,但由于它们......余下全文>>
     

    NSIndexPath怎保存到NSUserDefaults里

     

    NSIndexPath是无法直接存储到NSUserDefaults中去的,NSUserDefaults中的value只能是NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary。如果你想保存自定义的类,那么该类必须要实现NSCoding协议,并将该类转换成NSData,才能保持到NSUserDefaults中~

    转载于:https://www.cnblogs.com/adpbky/p/4517189.html

    展开全文
  • NSData

    2019-09-26 16:16:57
    /**************** Base 64 Options ****************/ /***Base64是一组二进制到文本转化的方案,以ASSCII格式表示二进制数据,这些方案用来编码二进制数据以存储或者通过把多媒体文件转换成文本数据进行传输,这...

    /****************        Base 64 Options ****************/

    /*** Base64是一组二进制到文本转化的方案,以ASSCII格式表示二进制数据,这些方案用来编码二进制数据以存储或者通过把多媒体文件转换成文本数据进行传输,这个能保证数据在传输的过程中的完整性。Base64醉常见的用于是处理电子邮件附件,或者解码小图片。在iOS7之前,Base64的编码和解码是需要自己实现的或者是使用第三方库,但是现在苹果提供一些API来实现Base64功能 ***/

    //4.base64编码中的一些设置选择

    typedef NS_OPTIONS(NSUInteger, NSDataBase64EncodingOptions) {

     

        NSDataBase64Encoding64CharacterLineLength = 1UL << 0,

        NSDataBase64Encoding76CharacterLineLength = 1UL << 1,

        NSDataBase64EncodingEndLineWithCarriageReturn = 1UL << 4,

        NSDataBase64EncodingEndLineWithLineFeed = 1UL << 5,

     

    } NS_ENUM_AVAILABLE(10_9, 7_0);

     

    //5.base64在解码过程中的option可选条件,下面选项表示在将诶吗过程中忽略不能识别的字节

    typedef NS_OPTIONS(NSUInteger, NSDataBase64DecodingOptions) {

        NSDataBase64DecodingIgnoreUnknownCharacters = 1UL << 0 

    } NS_ENUM_AVAILABLE(10_9, 7_0);

     

    /**************** Immutable Data 不可变的Data ****************/

    @interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>

    //6.获取data长度的属性

    @property (readonly) NSUInteger length;

    //7.返回data对象的首指针

    @property (readonly) const void *bytesNS_RETURNS_INNER_POINTER;

    @end

     

    @interface NSData (NSExtendedData)

    //8.返回一个ASCII编码格式的字符串,采用的格式是data属性列表的格式。

    @property (readonly, copy) NSString *description;

    //9.取出data中指定长度的字节存入buffer这个提前声明的数组中

    - (void)getBytes:(void *)buffer length:(NSUInteger)length;

    //9.取出data中指定位置range的字节存入buffer这个提前声明的数组中

    - (void)getBytes:(void *)buffer range:(NSRange)range;

    //10.判断两个data是否相等

    - (BOOL)isEqualToData:(NSData *)other;

    //11.截图data指定位置的子data

    - (NSData *)subdataWithRange:(NSRange)range;

    //12.将data写入指定的文件

    - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

    //13.将data写入指定的url

    - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically; 

    //14.将data写入指定文件,并且有写入过程的设置条件,带错误信息

    - (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;

    //15.将data写入指定的url,并且有写入过程的设置条件,带错误信息

    - (BOOL)writeToURL:(NSURL *)url options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;

    //16.搜索在data1内部存在data2的位置,并且有搜索配置条件,并且可加入搜索的范围

    - (NSRange)rangeOfData:(NSData *)dataToFind options:(NSDataSearchOptions)mask range:(NSRange)searchRange NS_AVAILABLE(10_6, 4_0);

    //17.列举遍历字典的方法

    - (void) enumerateByteRangesUsingBlock:(void (^)(constvoid *bytes, NSRange byteRange, BOOL *stop))block NS_AVAILABLE(10_9, 7_0);

     

    @end

    /*** 创建data的所有相关方法作为一个类别几种到一块 ***/

    @interface NSData (NSDataCreation)

    //18.data的快速创建办法

    + (instancetype)data;

    //19.赋值以bytes开头,长度为length的数据,进行初始化使其成为数据对象的内容

    + (instancetype)dataWithBytes:(const void *)bytes length:(NSUInteger)length;

    //20.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。

    + (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;

    //21.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。当flag为yes的时候,生成的data对象是bytes的所有者,当data对象被释放的时候也会同时释放bytes,所以bytes必须是通过malloc在堆上分配的内存。当flag为no的时候,bytes不会被自动释放,释放bytes时要注意时机,不要再data对象还被使用的时候释放bytes。

    + (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;

    //22.加载file文件,并且有可选择读取文件的选项配置条件,带有错误信息

    + (instancetype)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError**)errorPtr;

    //23.加载url,并且有可选择读取文件的选项配置条件,带有错误信息

    + (instancetype)dataWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

    //24.从参数path指定的文件读入二进制数据,用该数据初始化NSData对象。

    + (instancetype)dataWithContentsOfFile:(NSString *)path;

    //25.从参数path指定的url读入,用该数据初始化NSData对象。

    + (instancetype)dataWithContentsOfURL:(NSURL *)url;

     

    //26.赋值以bytes开头,长度为length的数据,进行初始化使其成为数据对象的内容

    - (instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)length;

    //27.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。

    - (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;

    //28.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。当flag为yes的时候,生成的data对象是bytes的所有者,当data对象被释放的时候也会同时释放bytes,所以bytes必须是通过malloc在堆上分配的内存。当flag为no的时候,bytes不会被自动释放,释放bytes时要注意时机,不要再data对象还被使用的时候释放bytes。

    - (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;

    //29.

    - (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length deallocator:(void (^)(void *bytes,NSUInteger length))deallocator NS_AVAILABLE(10_9, 7_0);

    //30.从参数path指定的文件读入二进制数据,用该数据初始化NSData对象。如果读取文件失败,则释放调用者并返回nil,同时把错误信息写入指针errorPtr。mask是一个选项信息,用于指定是否使用虚拟内存等。

    - (instancetype)initWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError**)errorPtr;

    //31.从参数url指定的路径中读入,用该数据初始化NSData对象。如果读取文件失败,则释放调用者并返回nil,同时把错误信息写入指针errorPtr。mask是一个选项信息,用于指定是否使用虚拟内存等。

    - (instancetype)initWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;

    //32.加载flie文件路径

    - (instancetype)initWithContentsOfFile:(NSString *)path;

    //33.加载url

    - (instancetype)initWithContentsOfURL:(NSURL *)url;

    //34.用指定的NSData对象aData来创建一个新的NSData对象,参数可以是NSMutableData对象。

    - (instancetype)initWithData:(NSData *)data;

    //35.用指定的NSData对象aData来创建一个新的NSData对象,参数可以是NSMutableData对象。

    + (instancetype)dataWithData:(NSData *)data;

     

    @end

     

    /*** base64方案编码分类  iOS7之后苹果给出以下四个API供实现base64方案 头两个是处理字符串的,后两个是处理UTF-8编码数据的,这两个承兑的方法功能是一样的,但是有时候用其中一个比另一个效率要高。如果你像要bae64编码字符串然后写进文件,你应该使用UTF-8编码数据的这对方法。如果你打算base64编码字符串之后用作json,你应该使用另外一对方法 编码解码一一对应***/

    @interface NSData (NSDataBase64Encoding)

     

    //36.解码。将已经base64编码之后的字符串数据再转化为NSData数据,

    - (instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)optionsNS_AVAILABLE(10_9, 7_0);

     

    //37.编码。将一个data数据利用base64方案转化成base64之后的NSString字符串

    - (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

     

    //38.解码。将已经base64编码之后的NSData数据再转化为NSData数据

    - (instancetype)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions)optionsNS_AVAILABLE(10_9, 7_0);

     

    //39.编码.将一个data数据利用base64方案转化成base64之后的NSData数据

    - (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);

     

    示例程序:使用第一对编码解码API。

            NSString * stringExample = [NSString stringWithFormat:@"I Love You"];

        NSData * data1 = [stringExample dataUsingEncoding:NSUTF8StringEncoding];

        

        NSString * base64String   = [data1 base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];

        NSLog(@"Base64-encoded string is %@",base64String);

        //log(Base64-encoded string is SSBMb3ZlIFlvdQ==);

     

        NSData * dataFromString = [[NSData alloc] initWithBase64EncodedString:base64String options:NSDataBase64DecodingIgnoreUnknownCharacters];

        NSLog(@"string is %@",[NSString stringWithUTF8String:[dataFromString bytes]]); 

        //log(string is I Love You);

     

    @end

     

    /**************** Mutable Data 可变data ****************/

    @interface NSMutableData : NSData

    //40.可变data的可变字节

    @property (readonly) void *mutableBytes NS_RETURNS_INNER_POINTER;

    //41.可变data的长度

    @property NSUInteger length;

    @end

     

    @interface NSMutableData (NSExtendedMutableData)

    //42.给可变data追加字节

    - (void)appendBytes:(const void *)bytes length:(NSUInteger)length;

    //43.给data追加其他的data

    - (void)appendData:(NSData *)other;

    //44.为已经存在的data追加新的长度

    - (void)increaseLengthBy:(NSUInteger)extraLength;

           示例程序:

          NSMutableData * data = [NSMutableData data];

          [data increaseLengthBy:5];

          NSLog(@"dataLength———%lu",(unsigned long)data.length);

    //45.给data替换对应位置的字节

    - (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)bytes;

    //46.重置可变data对应位置的字节

    - (void)resetBytesInRange:(NSRange)range;

    //47.为可变data设置data数据

    - (void)setData:(NSData *)data;

    //48.给data替换对应位置的字节, 并且存在替换长度

    - (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength;

     

    @end0

     

    @interface NSMutableData (NSMutableDataCreation)

    //49.动态创建可变data 并且初始化指定大小

    + (instancetype)dataWithCapacity:(NSUInteger)aNumItems;

    //50.动态创建可变data 并且初始化指定长度

    + (instancetype)dataWithLength:(NSUInteger)length;

    //51.静态创建可变data 并且初始化指定大小

    - (instancetype)initWithCapacity:(NSUInteger)capacity;

    //52.静态创建可变data 并且初始化指定长度 

    - (instancetype)initWithLength:(NSUInteger)length;

     

    @end

     

    //1.data读取过程的可选配置条件

    typedef NS_OPTIONS(NSUInteger, NSDataReadingOptions) {

        NSDataReadingMappedIfSafe =   1UL << 0,     NSDataReadingUncached = 1UL << 1,

        NSDataReadingMappedAlways NS_ENUM_AVAILABLE(10_7, 5_0) = 1UL << 3,

           NSDataReadingMapped = NSDataReadingMappedIfSafe, // Deprecated name for NSDataReadingMappedIfSafe

        NSMappedRead = NSDataReadingMapped, // Deprecated name for NSDataReadingMapped

        NSUncachedRead = NSDataReadingUncached // Deprecated name for NSDataReadingUncached

    };

    //2.data写入过程的可选配置条件

    typedef NS_OPTIONS(NSUInteger, NSDataWritingOptions) {

        NSDataWritingAtomic = 1UL << 0,

        NSDataWritingWithoutOverwriting NS_ENUM_AVAILABLE(10_8, 6_0) = 1UL << 1, 

        NSDataWritingFileProtectionNoneNS_ENUM_AVAILABLE_IOS(4_0)                                  = 0x10000000,

        NSDataWritingFileProtectionCompleteNS_ENUM_AVAILABLE_IOS(4_0)                              =0x20000000,

        NSDataWritingFileProtectionCompleteUnlessOpenNS_ENUM_AVAILABLE_IOS(5_0)                    = 0x30000000,

        NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication NS_ENUM_AVAILABLE_IOS(5_0)  = 0x40000000,

        NSDataWritingFileProtectionMaskNS_ENUM_AVAILABLE_IOS(4_0)                                  = 0xf0000000,

        NSAtomicWrite = NSDataWritingAtomic  

     };

     

    /**************** Data Search Options ****************/

    //3.data在搜索过程中的可选配置条件

    typedef NS_OPTIONS(NSUInteger, NSDataSearchOptions) {

        NSDataSearchBackwards = 1UL << 0,

        NSDataSearchAnchored = 1UL << 1

    } NS_ENUM_AVAILABLE(10_6, 4_0);

     

    /*** 下方为已废弃代码,不多做解释 ***/

    @interface NSData (NSDeprecated)

     

    - (void)getBytes:(void *)buffer NS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "This method is unsafe because it could potentially cause buffer overruns. Use -getBytes:length: instead.");

    + (id)dataWithContentsOfMappedFile:(NSString *)pathNS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "Use +dataWithContentsOfURL:options:error: and NSDataReadingMappedIfSafe or NSDataReadingMappedAlways instead.");

    - (id)initWithContentsOfMappedFile:(NSString *)path NS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "Use -initWithContentsOfURL:options:error: and NSDataReadingMappedIfSafe or NSDataReadingMappedAlways instead.");

     

    - (id)initWithBase64Encoding:(NSString *)base64StringNS_DEPRECATED(10_6, 10_9, 4_0, 7_0);

    - (NSString *)base64Encoding NS_DEPRECATED(10_6, 10_9, 4_0, 7_0);

    @end

    /****************     Purgeable Data ****************/

    NS_CLASS_AVAILABLE(10_6, 4_0)

    @interface NSPurgeableData : NSMutableData <NSDiscardableContent> {

    @private

        NSUInteger _length;

        int32_t _accessCount;

        uint8_t _private[32];

        void *_reserved;

    }

     

    @end

    转载于:https://www.cnblogs.com/wangbinios/p/5520537.html

    展开全文
  • NSData support

    2020-11-25 10:21:30
    <div><p>Is there a way to import and export canvas data directly to NSData. Right now the import and export type is to a file in the documents directory. This support is to allow saving the canvas to ...
  • export as NSData

    2020-12-01 14:29:10
    m trying to save / reload the drawings with core data using NSData. I know that its relying on the documents directory now, but I can't quite figure out how to manage implementation of the NSData ...
  • From JSON to NSData?

    2020-11-26 08:19:48
    d like a <code>NSData</code>/<code>String</code> that can be used by the <code>JSONDecodable</code> protocol. <p>I tried <code>myStruct.toJSON.description</code> but the string returned contain ...
  • Add/Fetch NSData from index

    2020-11-27 03:41:36
    // - (NSData *)dataWithName:(NSString *)name error:(NSError **)error; (removed) - (BOOL)addData:(NSData *)data withName:(NSString *)name error:(NSError **)error; </code></pre> <p>I still have to add ...
  • (How to convert DKAsset into NSdata) <p>Code - <pre><code> let pickerController = DKImagePickerController() pickerController.maxSelectableCount = 5 pickerController.allowSwipeToSelect =...

空空如也

1 2 3 4 5 ... 20
收藏数 6,342
精华内容 2,536
关键字:

nsdata