咱们今天来讲一下 持久化存储
先导入两个第三方库
导入以下依赖库
AppDelegate.M
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[UMessage startWithAppkey:@"your appkey" launchOptions:launchOptions];
//注册通知,如果要使用category的自定义策略,可以参考demo中的代码。
[UMessage registerForRemoteNotifications];
//iOS10必须加下面这段代码。
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate=self;
UNAuthorizationOptions types10=UNAuthorizationOptionBadge| UNAuthorizationOptionAlert|UNAuthorizationOptionSound;
[center requestAuthorizationWithOptions:types10 completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
//点击允许
//这里可以添加一些自己的逻辑
} else {
//点击不允许
//这里可以添加一些自己的逻辑
}
}];
return YES;
}
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
//1.2.7版本开始不需要用户在手动注册Devicetoken,SDK 会自动注册
//[UMessage rigisterDeviceToken:deviceToken];
}
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
[UMessage didReceiveRemoteNotification:userInfo];
}
//iOS10新增:处理前台收到通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler{
NSDictionary *userInfo =notification.request.content.userInfo;
if ([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
//应用处于前台时的远程推送接受
//关闭U-Push自带的弹出框
[UMessage setAutoAlert:NO];
//必须加这句代码
[UMessage didReceiveRemoteNotification:userInfo];
}else{
//应用处于前台时的本地推送接受
}
//当应用处于前台时提示设置 需要哪个可以设置哪一个
completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionAlert);
}
//iOS10新增:处理后台点击通知的代理方法
-(void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler{
NSDictionary * userInfo = response.notification.request.content.userInfo;
if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
//应用处于后台时的远程推送接受
//必须加这句代码
[UMessage didReceiveRemoteNotification:userInfo];
}else{
//应用处于后台时的本地推送接受
}
}
LoadData 添加查询方法 打开关闭数据库
+(instancetype) shareLoadData;
//打开数据库
-(void)openDataBase;
-(void)createDataBase;
-(void)addMusicData:(Model *)mod;
-(NSMutableArray *)selectDataBase;
//关闭数据库
-(void)closeDataBase;
实现LoadData 方法
+(instancetype)shareLoadData{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
ld = [[LoadData alloc]init];
});
return ld;
}
+(instancetype)allocWithZone:(struct _NSZone *)zone{
if (!ld) {
ld = [super allocWithZone:zone];
}
return ld;
}
-(id)copy{
return self;
}
-(id)mutableCopy{
return self;
}
-(void)openDataBase{
//创建沙盒路径
NSString *str = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSLog(@"123123123%@",str);
//在沙盒路径下创建一个db文件
NSString *path = [str stringByAppendingPathComponent:@"aiyo.db"];
NSLog(@"path == %@",path);
//如果存在直接打开 不存在 创建后打开
if (sqlite3_open([path UTF8String], &(sqliteDB)) == SQLITE_OK) {
NSLog(@"打开成功");
[self createDataBase];
}
}
//初始化数据库 创建数据库
-(void)createDataBase{
//创建预编译指针
const char *sqla = "create table if not exists aiya (id integer primary key , image text)";
//将sql语句编译到预编译指针内部
sqlite3_stmt *stmt;
//执行预编译指针
sqlite3_prepare(sqliteDB, sqla , -1, &stmt, nil);
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"创建成功");
}
//释放预编译指针
sqlite3_finalize(stmt);
}
//添加数据
-(void)addMusicData:(Model *)mod{
const char *sqla = "insert into aiya values(null,?)";
sqlite3_stmt *stmt;
sqlite3_prepare(sqliteDB, sqla, -1, &stmt, nil);
sqlite3_bind_text(stmt, 1, [mod.image UTF8String], -1, nil);
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"添加成功");
}
sqlite3_finalize(stmt);
}
//查询数据
-(NSMutableArray *)selectDataBase{
const char *sqla = "select *from aiya";
sqlite3_stmt *stmt;
sqlite3_prepare(sqliteDB, sqla, -1, &stmt, nil);
NSMutableArray *Marr = [NSMutableArray array];
while (sqlite3_step(stmt) == SQLITE_ROW) {
Model *model = [[Model alloc]init];
model.image = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
data = [[NSData alloc]initWithBase64Encoding:model.image];
[Marr addObject:data];
NSLog(@"%ld ",Marr.count);
}
return Marr;
}
-(void)closeDataBase{
sqlite3_close(sqliteDB);
}
添加一个模型属性
#import "ViewController.h"
#import <CoreImage/CoreImage.h>
#import"QRCodeGenerator.h"
#import "LoadData.h"
#import "Model.h"
#import "TwoViewController.h"
@interface ViewController ()
{
Model *mod;
}
@property (weak, nonatomic) IBOutlet UITextField *text;
@property (weak, nonatomic) IBOutlet UIImageView *image;
@end
@implementation ViewController
- (IBAction)creat:(id)sender {
self.image.image = [QRCodeGenerator qrImageForString:self.text.text imageSize:self.image.bounds.size.width];
}
- (IBAction)baocun:(id)sender {
[[LoadData shareLoadData]openDataBase];
mod = [[Model alloc]init];
NSData *data = UIImageJPEGRepresentation(self.image.image, 0.5f);
mod.image = [data base64Encoding];
[[LoadData shareLoadData]addMusicData:mod];
[[LoadData shareLoadData]closeDataBase];
TwoViewController *two = [[TwoViewController alloc]init];
[self presentViewController:two animated:YES completion:nil];
}
开始创建表格用可变数组接收
_table = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain];
_table.delegate = self;
_table.dataSource = self;
_table.rowHeight = 180;
[self.view addSubview:_table];
//自定义方法
[self select];
[_table reloadData];
-(void)select{
[[LoadData shareLoadData]openDataBase];
_Marr = [NSMutableArray array];
_Marr = [[LoadData shareLoadData]selectDataBase];
[[LoadData shareLoadData]closeDataBase];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return _Marr.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *cellID = @"";
TwoTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[TwoTableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];
}
cell.img.image = [UIImage imageWithData:_Marr [indexPath.row]];
return cell;
}
创建一个UIImageView 添加到控件自定义Cell中
-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
[self.contentView addSubview:self.img];
}
return self;
}
-(UIImageView *)img{
if (!_img) {
_img = [[UIImageView alloc]initWithFrame:CGRectMake(25, 25, 130, 130)];
}
return _img;
}