2015年8月14日星期五

IOS数据存储 —— 2 存储方式 - 秦锐IOS

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
IOS数据存储 ―― 2 存储方式 - 秦锐IOS  阅读原文»

IOS数据存储方式
iOS开发常用数据存储方式有:plist、偏好设置 NSUserDefaults、对象归档 NSKeyedArchiver、SQLite3和Core Data
1. plist文件 存储
  plist文件通常用于储存用户设置,利用xml属性列表归档NSDictionary、NSArray、NSNumber等类型数据
  在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用
  注意:plist不能存储自定义对象
  
2. 偏好设置 NSUserDefaults
  偏好设置用来保存“用户名、密码、字体大小、是否自动登录”等设置,主要用于存储应用的设置信息
  
3. 归档 NSKeydeArchiver
  因为前两者都有一个致命的缺陷,只能存储常用的类型。归档可以实现把自定义的对象存放在文件中。
  要使用对象归档,对象必须实现NSCoding协议。大部分Object C对象都符合NSCoding协议,也可以在自定义对象中实现NSCoding协议,要实现NSCoding协议
  
4. SQLite3
  SQLite是一款轻型的嵌入式数据库,安卓和ios开发使用的都是SQLite数据库
  在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等。
  离线缓存一般都是把数据保存到项目的沙盒中,但上述三种方法都有一个致命的缺点,那就是都无法存储大批量的数据,有性能的问题。
  如果使用归档,两个问题:
    (1)数据的存取都必须是完整的,要求写入的时候要一次性写入,读取的时候要一次性全部读取,这涉及到应用的性能问题。
    (2)如果有1000条数据,此时要把第1001条数据存入,那么需要把所有的数据取出来,把这条数据加上去之后,再存入。
  说明:以上的三种技术不能处理大批量数据的存储,大批量数据通常使用数据库来进行存储。
5. Core Data
  Core Data是对SQLite的封装,因为iOS中使用的SQLite是纯C语言的。

1. plist 文件的存储/读取方法
// 文件路径
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"data.plist"];
// 设置数据
NSArray *data = @[@"jack", @10, @"abcd"];
// 储存plist
[data writeToFile:path atomically:YES];
// 读取
NSArray *data2 = [NSArray arrayWithContentsOfFile: path];

2. 偏好设置 NSUserDefaults

/* 偏好设置——数据存储 类中有相应属性 */
- (void)save {
// 1.利用NSUserDefaults,就能直接访问软件的偏好设置(Library/Preferences)
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

// 2.存储数据
[defaults setObject:@"qr" forKey:@"name"];
[defaults setObject:
@"123" forKey:@"pwd"];
[defaults setInteger:
10 forKey:@"age"];
[defaults setBool:YES forKey:
@"auto_login"];

// 3.立刻同步
[defaults synchronize];

}
/* 偏好设置——读取数据 */
- (void)read {
NSUserDefaults
*defaults = [NSUserDefaults standardUserDefaults];
NSString
*account = [defaults objectForKey:@"account"];
BOOL autoLogin
= [defaults boolForKey:@"auto_login"];
NSLog(
@"%@ -- %d", account, autoLogin);

}

3. 对象归档 NSKeyedArchiver

/* 归档——存储自定义对象 */
Person
*p = [[Person alloc] init];
p.age
= 18;
p.name
= @"qr";
// 拼接文件名
NSString *path = NSTemporaryDirectory() stringByAppendingPathComponent:@"person.data"];
[NSKeyedArchiver archiveRootObject:p toFile:Path];
// 解档
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
/* Person 类中要实现的方法 */

// 遵守< NSCoding > 协议

// 什么时候调用:当一个对象要归档的时候就会调用这个方法归档
// 作用:告诉苹果当前对象中哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:
@"name"];
[aCoder encodeInt:_age forKey:
@"age"];
}
————————————————————————————
// 作用:告诉苹果当前对象中哪些属性需要解档
// initWithCoder什么时候调用:只要解析一个文件的时候就会调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
#warning [super initWithCoder]
// 这里不能用[super initWithCoder],什么时候调用[super initWithCoder:aDecoder]:只要父类遵守了NSCoding协议,就调用
if (self =Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议 - stoneniqiu  阅读原文»

在上一篇中,留下了许可协议的问题,目前已经解决。感谢网友武全的指点!

问题

一般我们是用WixVariable 来设定许可协议。如下所示:

<WixVariable Id="WixUILicenseRtf" Value="license.rtf" />

但在多语言中我们写成下面这样是不识别的。它会被直接当成文件路径,而报错,找不到文件。

<WixVariable Id="WixUILicenseRtf" Value="!(loc.LicenseRtf)" />

string:

<String Id="LicenseRtf">Languages\license.rtf</String>

自定义CustomLicenseDlg

这样我们需要自定义一个许可证书对话框。不过我们可以在源码的基础上稍作修改。在源码中找到LicenseAgreementDlg.wxs。

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI>
<Dialog Id="LicenseAgreementDlg" Width="370" Height="270" Title="!(loc.LicenseAgreementDlg_Title)">
<Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.LicenseAgreementDlgBannerBitmap)" />
<Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
<Control Id="Description" Type="Text" X="25" Y="23" Width="340" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.LicenseAgreementDlgDescription)" />
<Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.LicenseAgreementDlgTitle)" />
<Control Id="LicenseAcceptedCheckBox" Type="CheckBox" X="20" Y="207" Width="330" Height="18" CheckBoxValue="1" Property="LicenseAccepted" Text="!(loc.LicenseAgreementDlgLicenseAcceptedCheckBox)" />
<Control Id="Print" Type="PushButton" X="112" Y="243" Width="56" Height="17" Text="!(loc.WixUIPrint)">
<Publish Event="DoAction" Value="WixUIPrintEula">1</Publish>
</Control>
<Control Id="Back" Type="PushButton" X="180" Y

没有评论:

发表评论