博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS上路_17-简单示例-数据库
阅读量:7107 次
发布时间:2019-06-28

本文共 7706 字,大约阅读时间需要 25 分钟。

hot3.png

1.添加依赖框架:

    1)点击项目,BP,LWL,加号:

    2)libsqlite3:

3.声明数据库和UI控件:

4.创建UI:

    1)在默认ViewController上添加两个文本框和一个按钮。然后为VC添加NC:

    2)添加一组新的NC,和上一组附加到同一个工具条:

    3)关联原ViewController的UI:

5.实现数据库创建和数据插入:

////  CVUViewController.m//  0719-Sqlite////  Created by vigiles on 13-7-19.//  Copyright (c) 2013年 vigiles. All rights reserved.//#import "CVUViewController.h"@interface CVUViewController ()@end@implementation CVUViewController/* 在视图加载时创建数据库和UI */- (void)viewDidLoad{    [super viewDidLoad];        NSArray * arrDoc;   //路径阵列-数组    NSString * strDoc;  //定义数据库路径        // 获取documents(我的文档)目录所在的路径阵列    arrDoc = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    // 因为是获取document目录,只返回一个。so,取索引0    strDoc = [arrDoc objectAtIndex:0];        // 构造数据库文件的保存路径和名称    dbPath = [[NSString alloc] initWithString:[strDoc stringByAppendingPathComponent:@"user.sqlite"]];        // 文件管理器,用于管理/删除/复制文件,    NSFileManager * fm = [NSFileManager defaultManager];        // 如果数据库不存在,即尚未创建。SQLite的策略是如果有就打开,如果没有就创建    if([fm fileExistsAtPath:dbPath] == NO)    {        // 数据库编码        const char * dbEncoded = [dbPath UTF8String];                // 创建,并打开数据库        if (sqlite3_open(dbEncoded, &dbUser) == SQLITE_OK) {                        //错误信息            char * charErrMsg;                        //SQL语句=如果不存在就创建tbuser数据库(字段 类型,字段 类型)。不区分大小写            const char * sqlCreateTb ="create table if not exists TbUser (name text, id text)";                        // 创建数据表            if(sqlite3_exec(dbUser, sqlCreateTb, NULL, NULL, &charErrMsg) != SQLITE_OK){                NSLog(@"创建表单失败了!");            }                        // 关闭数据库            sqlite3_close(dbUser);                        NSLog(@"创建数据库或打开成功:%@",dbPath);//打印出字符串路径        } else        {            NSLog(@"创建/打开数据库失败了!");        }    }    else    {        // [fm removeItemAtPath:dbPath error:nil];//删除文件;        // NSLog(@"数据库文件已删除");    }    }/* 向数据库添加数据 */-(IBAction)doAddData{    //定义错误的指针,保存错误信息    char * charErrMsg;        //数据库字符编码    const char * dbEncoded = [dbPath UTF8String];        //打开数据库    if(sqlite3_open(dbEncoded, &dbUser) == SQLITE_OK)    {        //创建插入语句        NSString * strSqlInsert = [NSString                                   stringWithFormat:@"insert into TbUser(name, id) values(\"%@\",  \"%@\")",                                   self.tfName.text,                                   self.tfId.text];                //创建Sqlite语句。UTF8编码        const char * charSqlInsert= [strSqlInsert UTF8String];                //执行SQL语句        if (sqlite3_exec(dbUser, charSqlInsert, NULL, NULL, &charErrMsg) == SQLITE_OK)        {            //执行成功后清空文本框            self.tfName.text= @"";            self.tfId.text = @"";        }        else        {            NSLog(@"插入记录错误: %s", charErrMsg);            sqlite3_free(charErrMsg);//释放错误指针        }        sqlite3_close(dbUser);//关闭数据库    }}/* 关闭虚拟键盘 */-(IBAction)doHideKey{    [self.tfName resignFirstResponder];    [self.tfId resignFirstResponder];}@end

6.创建数据封装对象:

    1)创建OC文件:

    2)继承自基类:

    3)声明数据变量:

7.创建显示数据的表单类:

    1)OC文件:

    2)继承UITableViewController:

    3)声明数据变量:

8.实现数据显示:

这里又用到了对表单的操作。

////  TabShowData.m//  SqliteTest////  Created by vigiles on 13-7-19.//  Copyright (c) 2013年 vigiles. All rights reserved.//#import "TabShowData.h"@interface TabShowData ()@end@implementation TabShowData- (void)viewDidLoad{    [super viewDidLoad];        NSLog(@"加载显示页面");        NSArray * arrDocShow;   //路径阵列-数组    NSString * strDocShow;  //定义数据库路径        // 获取documents(我的文档)目录所在的路径阵列    arrDocShow = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    // 因为是获取document目录,只返回一个。so,取索引0    strDocShow = [arrDocShow objectAtIndex:0];        // 获取已有的数据库路径    dbPathShow = [[NSString alloc] initWithString:[strDocShow stringByAppendingPathComponent:@"user.sqlite"]];        //动态数组进行初始化    self.arrDataShow = [[NSMutableArray alloc] init];        //对路径进行编码    const char * dbEncodedShow = [dbPathShow UTF8String];        //数据库模型    sqlite3_stmt * statement;        //数据库打开成功    if(sqlite3_open(dbEncodedShow, &dbUserShow) == SQLITE_OK)    {        NSLog(@"打开数据库成功");                //查询语句        NSString * strSqlSelect = [NSString stringWithFormat:@"select name, id from TbUser "];                //对语句编码        const char * charSqlSelect = [strSqlSelect UTF8String];                if(sqlite3_prepare_v2(dbUserShow, charSqlSelect, -1, &statement, NULL) == SQLITE_OK)//数据库查询成功        {            NSLog(@"查询数据成功");                        while (sqlite3_step(statement) == SQLITE_ROW)//对数据库进行循环遍历            {                ObjData * objUser = [[ObjData alloc] init];//创建一个数据封装对象                                objUser.objName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement,0)];//获取索引为0的数据                objUser.objId = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];//获取索引为1的数据                                [self.arrDataShow addObject:objUser];//对数据进行初始化                                NSLog(@"遍历数据...");            }        } else {            NSLog(@"查询数据模型出现错误: %s", sqlite3_errmsg(dbUserShow));//如果出现问题就打印出来        }                // 销毁Statement对象        sqlite3_finalize(statement);            }}- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{    return 1;//返回一个分组}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{    return [self.arrDataShow count];//返回分组的数量}- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{    NSString * identifier = @"CellShow";//标示符        UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:identifier forIndexPath:indexPath];//从队列中抓取一个单元格        if (cell == nil)    {        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];//单元格初始化    }        //字符串赋值,进行类型转换,根据index.path    cell.textLabel.text =((ObjData *)[self.arrDataShow objectAtIndex:indexPath.row]).objName;        cell.detailTextLabel.text =((ObjData *)[self.arrDataShow objectAtIndex:indexPath.row]).objId;        return cell;}- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{    if (editingStyle == UITableViewCellEditingStyleDelete)    {        if (editingStyle == UITableViewCellEditingStyleDelete)        {            // 获取要删除的信息            ObjData * objUser = [self.arrDataShow objectAtIndex:indexPath.row];                        sqlite3_stmt *statement;            NSString * querySql = [NSString stringWithFormat:@"delete from TbUser where id = \"%@\"",objUser.objId];            const char * sql = [querySql UTF8String];                        // 编译SQL 语句,创建Statement 对象            if(sqlite3_prepare_v2(dbUserShow, sql, -1, &statement, NULL) != SQLITE_OK)            {                NSAssert1(0, @"创建删除对象模型失败:'%s'", sqlite3_errmsg(dbUserShow));            }            if (sqlite3_step(statement)  != SQLITE_DONE)            {                NSAssert1(0, @"删除失败:'%s'", sqlite3_errmsg(dbUserShow));            }                        // 重置数据库信息            sqlite3_reset(statement);            // 删除当前的状态            sqlite3_finalize(statement);                        // 从数组中去掉删除的信息            [self.arrDataShow removeObject:objUser];                        // 从表格显示中删除            [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];                    }    }}@end

9.关联TableViewController和显示类:

    1)修改表单的映射类:

    2)修改单元格的标示符:

    3)配置表单代理:

10.测试:

可以成功执行插入数据操作。但显示数据却不是即时的。

另:

本例使用Xcode5没有成功。报错信息:

这似乎和NC自带的TVC有关。

- end

转载于:https://my.oschina.net/vigiles/blog/145792

你可能感兴趣的文章
arm-linux-gcc4.4.3编译s3c2410平台linux内核
查看>>
gitlab服务器
查看>>
我的友情链接
查看>>
Case_Compressed Mode_Background
查看>>
python 利用pexpect进行多机远程命令执行
查看>>
Python学习系列 (第一章):Python 的简介
查看>>
【转载】addShutdownHook的用处
查看>>
CSS3学习3----举例
查看>>
一个可以检测网络内主机类型的脚本
查看>>
利用Zabbix监控Lync的实时在线人数
查看>>
使用strace+pstack利器分析程序性能
查看>>
类和对象、实例的关系理解
查看>>
Nginx 负载均衡
查看>>
学习日志---非递归二叉树游标遍历(前中后层序)
查看>>
数据库同步自动断开问题的处理
查看>>
错误页定义方法
查看>>
Guid.NewGuid() 和 new Guid()的区别
查看>>
我的友情链接
查看>>
vim技巧
查看>>
DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.1.2Beta)
查看>>