咱們今天來講一下 ? 持久化存儲
先導入兩個第三方庫
導入以下依賴庫
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;
}