iOS开发学习之路【高级主题】——数据存储

plist属性列表

创建 plist 文件

在这里插入图片描述

读写 plist 文件

- (IBAction)write:(id)sender {
    
    NSBundle *b = [NSBundle mainBundle];
    NSString *path = [b pathForResource:@"my_config" ofType:@".plist"];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithContentsOfFile:path];
    
    [dic writeToFile:@"/tmp/temp.plist" atomically:YES];
    
}
- (IBAction)read:(id)sender {
    
    NSBundle *b = [NSBundle mainBundle];
    NSString *path = [b pathForResource:@"my_config" ofType:@".plist"];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithContentsOfFile:path];
    NSLog(@"dic=%@",dic);
    
}

在这里插入图片描述
在这里插入图片描述

NSUserDefaults

NSUserDefaults 简介

  1. 可以保存一些简单的数据;
  2. 可以定制应用的行为。

保存、读取数据

- (IBAction)write:(id)sender {
    
    // 1.instance
    NSUserDefaults *d = [NSUserDefaults standardUserDefaults];
    // 2.setXXX key
    [d setBool:YES forKey:@"boolKey"];
    [d setInteger:20 forKey:@"intKey"];
    [d setFloat:3.14 forKey:@"floatKey"];
    [d setObject:@"String Value" forKey:@"strKey"];
    // 3.同步到持久状态
    [d synchronize];
    
}
- (IBAction)read:(id)sender {
    
    NSUserDefaults *d = [NSUserDefaults standardUserDefaults];
    NSInteger i = [d integerForKey:@"intKet"];
    float f = [d floatForKey:@"floatKey"];
    BOOL b = [d boolForKey:@"boolKey"];
    NSString *s = [d stringForKey:@"strKey"];
    
    NSLog(@"i=%lu,f=%f,b=%d,s=%@",i,f,b,s);
    
}

在这里插入图片描述

应用配置

  1. 创建配置文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 读取配置

    - (IBAction)get:(id)sender {
        
        NSUserDefaults *d = [NSUserDefaults standardUserDefaults];
        BOOL b = [d boolForKey:@"video_preference"];
        NSString *s = [d stringForKey:@"name_preference"];
        NSLog(@"b=%d,s=%@",b,s);
        
    }
    

在这里插入图片描述

SQLite数据库

SQLite 简介

​ SQLite 是一个开源的嵌入式数据引擎,广泛应用在嵌入式设备操作系统中,例如早期的Symbian、Android、iOS等系统中。可以使用标准的SQL语句进行操作。

使用 SQLite 实现表的增删查改

  1. in Build Phases -> Link Binary With Libraries, add “libsqlite3.tbd”.

  2. 在头文件中导入 #import "sqlite3.h"

  3. 创建Person类

    @property(nonatomic,assign)int pid;
    @property(nonatomic,copy)NSString *name;
    @property(nonatomic,copy)NSString *pwd;
    
  4. 创建DBUtil工具类

    #import <Foundation/Foundation.h>
    // 导入头文件
    #import "sqlite3.h"
    #import "Person.h"
    // 定义数据库名称
    #define DbName @"test.db"
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface DBUtil : NSObject
    
    // 获得数据库文件路径方法
    -(NSString*)getPath;
    // 打开数据库
    -(sqlite3*)open;
    // 关闭数据库
    -(void)close:(sqlite3*)db;
    // 创建表
    -(void)createTable:(sqlite3*)db;
    // 插入
    -(void)insert:(Person*)per;
    // 删除
    -(void)del:(int)pid;
    // 更新
    -(void)update:(Person*)per;
    // 查询
    -(NSMutableArray*)query;
    // 根据id查询
    -(Person*)findPerson:(int)pid;
    
    @end
    
    NS_ASSUME_NONNULL_END
    
    #import "DBUtil.h"
    
    @implementation DBUtil
    // 获得数据库文件路径方法
    -(NSString*)getPath{
        // 获取文件路径
        NSArray *docPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *path = [docPaths objectAtIndex:0];
        // 创建数据库路径
        path = [path stringByAppendingString:DbName];
        return path;
    }
    // 打开数据库
    -(sqlite3*)open{
        // 声明数据库
        sqlite3 *database;
        // 获取数据库路径
        NSString *path = [self getPath];
    //    NSLog(@"%@",path);
        // 打开数据库
        NSInteger result = sqlite3_open([path UTF8String], &database);\
        if(result == SQLITE_OK){
            // 返回数据库
            return database;
        }
        return nil;
    }
    // 关闭数据库
    -(void)close:(sqlite3*)db{
        if(db != nil){
            sqlite3_close(db);
        }
    }
    // 创建表
    -(void)createTable:(sqlite3*)db{
        // 创建表的sql语句
        char *sql = "create table PersonTable (pid integer primary key autoincrement, name text, pwd text)";
        // 执行sql语句创建表
        int result = sqlite3_exec(db, sql, 0, nil, nil);
        // 判断是否创建成功
        if(result == SQLITE_OK){
            NSLog(@"%@",@"create ok.");
        }else{
            NSLog(@"%@",@"create fail.");
        }
    }
    // 插入
    -(void)insert:(Person*)per{
        // 打开数据库
        sqlite3 *db = [self open];
        // 插入sql语句
        char *sql = "insert into PersonTable(name,pwd)values(?,?)";
        // 定义预定义语句
        sqlite3_stmt *stmt;
        // 准备预定义语句
        if(sqlite3_prepare_v2(db, sql, -1, &stmt, nil) == SQLITE_OK){
            // 绑定数据
            sqlite3_bind_text(stmt, 1, "tom", -1, nil);
            sqlite3_bind_text(stmt, 2, "123", -1, nil);
        }
        // 执行预定义语句
        if(sqlite3_step(stmt)==SQLITE_DONE){
            NSLog(@"%@",@"insert ok.");
        }else{
            NSLog(@"%@",@"insert fail.");
        }
        // 释放语句
        sqlite3_finalize(stmt);
        // 关闭数据库
        [self close:db];
    }
    // 删除
    -(void)del:(int)pid{
        // 打开数据库
        sqlite3 *db = [self open];
        // 插入sql语句
        char *sql = "delete form PersonTable where pid = ?";
        // 定义预定义语句
        sqlite3_stmt *stmt;
        // 准备预定义语句
        if(sqlite3_prepare_v2(db, sql, -1, &stmt, nil) == SQLITE_OK){
            // 绑定数据
            sqlite3_bind_int(stmt, 1, pid);
        }
        // 执行预定义语句
        if(sqlite3_step(stmt)==SQLITE_DONE){
            NSLog(@"%@",@"delete ok.");
        }else{
            NSLog(@"%@",@"delete fail.");
        }
        // 释放语句
        sqlite3_finalize(stmt);
        // 关闭数据库
        [self close:db];
    }
    // 更新
    -(void)update:(Person*)per{
        // 打开数据库
        sqlite3 *db = [self open];
        // 插入sql语句
        char *sql = "update PersonTable set name = ?, pwd = ? where pid = ?";
        // 定义预定义语句
        sqlite3_stmt *stmt;
        // 准备预定义语句
        if(sqlite3_prepare_v2(db, sql, -1, &stmt, nil) == SQLITE_OK){
            // 绑定数据
            sqlite3_bind_text(stmt, 1, [[per name] UTF8String], -1, nil);
            sqlite3_bind_text(stmt, 2, [[per pwd]UTF8String], -1, nil);
            sqlite3_bind_int(stmt, 3 , [per pid]);
        }
        // 执行预定义语句
        if(sqlite3_step(stmt)==SQLITE_DONE){
            NSLog(@"%@",@"update ok.");
        }else{
            NSLog(@"%@",@"update fail.");
        }
        // 释放语句
        sqlite3_finalize(stmt);
        // 关闭数据库
        [self close:db];
    }
    // 查询
    -(NSMutableArray*)query{
        // 打开数据库
        sqlite3 *db = [self open];
        // 插入sql语句
        char *sql = "select * from PersonTable";
        // 定义预定义语句
        sqlite3_stmt *stmt;
        // 定义可变数组
        NSMutableArray *array = [NSMutableArray arrayWithCapacity:10];
        // 准备预定义语句
        if(sqlite3_prepare_v2(db, sql, -1, &stmt, nil) == SQLITE_OK){
            while (sqlite3_step(stmt) == SQLITE_ROW) {
                int pid = sqlite3_column_int(stmt, 0);
                const char *name = (char*)sqlite3_column_text(stmt, 1);
                char *pwd = (char*)sqlite3_column_text(stmt, 2);
                
                Person *person = [[Person alloc]init];
                [person setPid:pid];
                [person setName:[NSString stringWithUTF8String:name]];
                [person setPwd:[NSString stringWithUTF8String:pwd]];
                
                [array addObject:person];
            }
        }
        // 释放语句
        sqlite3_finalize(stmt);
        // 关闭数据库
        [self close:db];
        return array;
    }
    // 根据id查询
    -(Person*)findPerson:(int)pid{
        // 打开数据库
        sqlite3 *db = [self open];
        // 插入sql语句
        char *sql = "select * from PersonTable where pid = ?";
        // 定义预定义语句
        sqlite3_stmt *stmt;
        // 实例化Person
        Person *person = [[Person alloc]init];
        // 准备预定义语句
        if(sqlite3_prepare_v2(db, sql, -1, &stmt, nil) == SQLITE_OK){
            
            sqlite3_bind_int(stmt, 1 , pid);
            
        }
        if(sqlite3_step(stmt) == SQLITE_DONE){
            int pid = sqlite3_column_int(stmt, 0);
            const char *name = (char*)sqlite3_column_text(stmt, 1);
            char *pwd = (char*)sqlite3_column_text(stmt, 2);
            
            [person setPid:pid];
            [person setName:[NSString stringWithUTF8String:name]];
            [person setPwd:[NSString stringWithUTF8String:pwd]];
        }else{
            NSLog(@"%@", @"find fail.");
        }
        // 释放语句
        sqlite3_finalize(stmt);
        // 关闭数据库
        [self close:db];
        return person;
    }
    @end
    
  5. ViewController

    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>
    @end
    
    #import "ViewController.h"
    #import "DBUtil.h"
    
    @interface ViewController ()
    @property(nonatomic,strong) DBUtil *util;
    @property(nonatomic,strong)NSMutableArray *dataSource;
    @property(nonatomic,strong)UITableView *tv;
    @end
    
    @implementation ViewController
    - (IBAction)delete:(id)sender {
    }
    - (IBAction)query:(id)sender {
        NSMutableArray *array = [self.util query];
        NSLog(@"count=%lu",array.count);
        for (Person *person in array) {
            NSLog(@"%d,%@,%@",person.pid,person.name,person.pwd);
        }
    }
    - (IBAction)update:(id)sender {
    }
    - (IBAction)insert:(id)sender {
        Person *person = [[Person alloc]init];
    //    person.pid = 1001;
        person.name = @"tom";
        person.pwd = @"123abc";
        [self.util insert:person];
        
        self.dataSource = [self.util query];
        [self.tv reloadData];
        
    }
    - (IBAction)creatTable:(id)sender {
        sqlite3 *db = [self.util open];
        [self.util createTable:db];
        [self.util close:db];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return self.dataSource.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cid"];
        if(cell == nil){
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cid"];
        }
        Person *person = [self.dataSource objectAtIndex:indexPath.row];
        cell.textLabel.text = [NSString stringWithFormat:@"%d,%@,%@", person.pid,person.name,person.pwd];
        return cell;
    }
    
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.util = [[DBUtil alloc]init];
        
        self.tv = [[UITableView alloc]initWithFrame:CGRectMake(10, 200, self.view.frame.size.width-20, self.view.frame.size.height-200)];
        [self.view addSubview:self.tv];
        self.tv.dataSource = self;
        self.tv.delegate = self;
        
        self.dataSource = [self.util query];
        // Do any additional setup after loading the view.
    }
    
    @end
    
  6. 效果
    在这里插入图片描述
    在这里插入图片描述

  7. 报错原因在这里插入图片描述 第一次运行时需要先创建表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值