iOS 数据储存--SQLite 操作数据库-FMDB,sqlite数据类型,保存图片,demo
1、SQLite 语句中 数据类型的储存
/* 不区分大小写
char(长度)。字符串
NULL. 空值
INTEGER. 整型
REAL.浮点型
TEXT.文本类型
BLOB. 二进制类型,用来存储文件,比如图片。
2、通过单利 操作数据库保存 :Id Name UIImage .h+.m
#import <Foundation/Foundation.h> @interface SaveDateToLocal : NSObject +(SaveDateToLocal*)SaveDateToLocalShare; /**
添加数据 @param Id id
@param Image uiimage
@param Name string
*/
-(void)SaveDateAddDateWithId:(NSString*)Id ImageviewImage:(UIImage*)Image nickName:(NSString*)Name; /**
修改数据 @param Id id
@param Name name
@param Image uiimage
*/
-(void)SaveDatechangeMessageWithId:(NSString*)Id Name:(NSString*)Name Image:(UIImage *)Image; /**
查找数据 @param Id id
@return 包含数据的字典
*/
-(NSDictionary*)SaveDatesearchMessageWithId:(NSString*)Id; /**
删除数据 @param Id id
*/
-(void)SaveDatedeleteMessageWithId:(NSString*)Id; @end
.m
将图片转化成base64编码格式的字符串,直接以字符串的形式存放入数据库
存取方法不做过多介绍,上篇已经做过介绍,主要展示以下转化过程: [html] view plain copy
//图片转化为base64字符串
UIImage *originImage = [UIImage imageNamed:@"origin.png"];
NSData *data = UIImageJPEGRepresentation(originImage, 1.0f);
NSString *encodedImageStr =[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];;
NSLog(@"Encoded image:%@", encodedImageStr); [html] view plain copy
//base64字符串转化为图片
NSData *decodedImageData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];
UIImage *decodedImage = [UIImage imageWithData:decodedImageData];
NSLog(@"Decoded image size: %@", NSStringFromCGSize(decodedImage.size)); */
#import "SaveDateToLocal.h"
#import <FMDatabase.h> @implementation SaveDateToLocal
static SaveDateToLocal * saveDateToLocal =nil;
static FMDatabase * dataBase = nil;//静态变量全局使用 +(SaveDateToLocal*)SaveDateToLocalShare{ static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{ saveDateToLocal =[[self alloc]init]; NSString * strpath =[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/userchat.db"]; //创建数据库
dataBase = [FMDatabase databaseWithPath:strpath];
//打开数据库
BOOL ret = [dataBase open];
if (ret == NO) {
NSLog(@"数据库打开失败");
}else{
NSLog(@"数据库打开成功");
} //1.准备sqlite语句
/* 不区分大小写
char(长度)。字符串
NULL. 空值
INTEGER. 整型
REAL.浮点型
TEXT.文本类型
BLOB. 二进制类型,用来存储文件,比如图片。
*/
//userchat 数据库名字
//(Id char(30), Name char(40), Image blob ) 数据名字+类型
NSString *sqlite = @"create table if not exists userchat(Id char(30), Name char(40), Image blob );";
//2.执行sqlite语句 int result = [dataBase executeUpdate:sqlite];
//3.sqlite语句是否执行成功 if (result == YES) {
NSLog(@"创建表成功");
} else {
NSLog(@"创建表失败");
} }); return saveDateToLocal; } //插入数据
-(void)SaveDateAddDateWithId:(NSString*)Id ImageviewImage:(UIImage*)Image nickName:(NSString*)Name{ //插入之前 先查询有没有 有了就替换 NSDictionary * dict =[self SaveDatesearchMessageWithId:Id]; if (dict) { //有值 替换/更新
[self SaveDatechangeMessageWithId:Id Name:Name Image:Image]; }
else{ NSString *sql = @"insert into userchat(Id , Name, Image) values(?, ?, ?);"; //图片转化为data
NSData *data =UIImageJPEGRepresentation(Image, 1.0); NSLog(@"Encoded image:%@", data);
//? 在这里 类似OC中的 %@
BOOL ret = [dataBase executeUpdate:sql,Id, Name, data];
if (ret == YES) {
NSLog(@"插入成功");
}else{ NSLog(@"插入失败");
} }
} -(void)SaveDatechangeMessageWithId:(NSString*)Id Name:(NSString*)Name Image:(UIImage *)Image
{ //图片转化为data字符串
NSData *data =UIImageJPEGRepresentation(Image, 1.0); // 1、创建sql语句
NSString *sql = @"update userchat set Name =? , Image = ? where Id = ?;";
// 2、执行sql语句
BOOL ret = [dataBase executeUpdate:sql, Name,data,Id];
if (ret == YES) {
NSLog(@"修改数据成功");
}
} -(NSDictionary*)SaveDatesearchMessageWithId:(NSString*)Id
{ NSMutableDictionary * dict =[NSMutableDictionary dictionary]; // 1、写sql语句
NSString *sql = @"select *from userchat where Id = ? ;";
FMResultSet *set = [dataBase executeQuery:sql,Id];
//使用while循环
while ([set next]) {
//FMResultSet是一个集合,保存所有符合条件的数据
//next是一个自动循环的指针,调用next可以遍历整个集合
//当遍历完成以后,next会指向空,循环退出 //将数据从集合中取出
NSString *name = [set stringForColumn:@"Name"]; if (name.length>) {
NSData * image = [set dataForColumn:@"Image"]; //NSData *decodedImageData = [image dataUsingEncoding:NSUTF8StringEncoding];
UIImage *decodedImage = [UIImage imageWithData:image]; NSDictionary * userchat =@{@"Name":name,@"Image":decodedImage}; [dict setDictionary:userchat]; break ; } } return dict;
} -(void)SaveDatedeleteMessageWithId:(NSString*)Id
{
NSString *sql = @"delete from userchat where Name = ?;";
BOOL ret = [dataBase executeUpdate:sql,Id];
if (ret == YES) {
NSLog(@"删除成功");
}else{ NSLog(@"删除shibai");
}
}
@end
iOS 数据储存--SQLite 操作数据库-FMDB,sqlite数据类型,保存图片,demo的更多相关文章
- Qt之操作数据库(SQLite)实例
QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持.QSqlDatabase对象象征了数据库的关联.Qt使用驱动 ...
- Qt之操作数据库(SQLite)
SQLite 简介 SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需 ...
- IOS 数据储存
IOS 数据存储 ios数据存储包括以下几种存储机制: 属性列表 对象归档 SQLite3 CoreData AppSettings 普通文件存储 1.属性列表 // // Persistence1 ...
- LKDBHelper Sqlite操作数据库
首先这里要说明一下,为什么用FMDB而不用Core Data呢,因为我们不知道Core Data是如何映射对象里面的属性关系的,如果我们更改了属性的话,就会报错 首先是创建LKDBHelper对象 L ...
- Xamarin.Forms 使用本地数据库之 SQLite
前言 Xamarin.Forms支持使用SQLite数据库引擎.本文介绍了Xamarin.Forms应用程序如何读取和写入数据到使用SQLite.Net的本地SQLite数据库. 在Xamarin.F ...
- 常用数据库2 sqlite及SQL注入
知识内容: 1.sqlite数据库介绍 2.sqlite数据库操作 3.SQL注入 一.sqlite数据库介绍 1.sqlite数据库 sqlite数据库:轻量级的数据库,一般开发中使用sqlite数 ...
- SQLite -附加数据库
SQLite -附加数据库 考虑情况下当你有多个数据库可用,您希望使用其中任何一个.SQLite附加DTABASE语句用于选择一个特定的数据库,这个命令之后,所有SQLite语句将执行以下附加数据库. ...
- iOS数据持久化存储
本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每 ...
- Django中的模型(操作数据库)
目录 Django配置连接数据库 在Django中操作数据库 原生SQL语句操作数据库 ORM模型操作数据库 增删改查 后台管理 使用后台管理数据库 模型是数据唯一而且准确的信息来源.它包含您正在储存 ...
随机推荐
- python 读取本地文件批量插入mysql
Uin_phone.txt 本地文件内容 有1000条,这里只是展示前几条,供参考 133584752 133584759 133584764 133584773 133584775 13358477 ...
- 使用dropwizard(6)-国际化-easy-i18n
前言 Dropwizard官方文档并没有提供国际化的模块,所以只能自己加.Spring的MessageResource用的很顺手,所以copy过来. Easy i18n 在整合Dropwizard的时 ...
- 基于Jquery UI的autocompelet改写,自动补全控件,增加下拉选项,动态设置样式,点击显示所有选项,并兼容ie6+
Jquery UI的autocompelete改写 注意:实现功能,除了原版的自动补全内容外,增加一个点击显示所有选项,样式能动态设置. 加载数据的来源为后台数据库读取. 具体代码如下: 引用 从官方 ...
- 关于node的前端项目编译时内存溢出问题
最近在做一个基于vue 的多页面项目 , 页面n++多,编译时发生node内存溢出问题,继而百度之,得到解答,故记录之. '如图' 只需在 package.json 里面 加上 --max ...
- css3实现聊天气泡
1: <div class="comment"></div><style type="text/css"> .comment ...
- 关于MVC Ajax.BeginForm()异步上传文件的问题
问题描述: 如果用juqery原生的异步上传方式,只要如下方法即可 $.ajax({ type: "GET", url: "test.json", data: ...
- 为什么选择Django?
Web开发是Python语言应用领域的重要部分,也是工作岗位比较多的领域.如果你对基于Python的Web开发有兴趣,正打算开始学习使用Python做Web开发,或者已经是一个Web开发者有工作需要, ...
- Android 7.0 中 ContentProvider 实现原理
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:汪毅雄 导语: 本文描述了ContentProvider发布者和调用者这两在Framework层是如何实现的. 作为Android的四大 ...
- poj 3111 K Best 最大化平均值 二分思想
poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ...
- Nodejs的运行原理-科普篇
前言 Nodejs目前处境稍显尴尬,很多语言都已经拥有异步非阻塞的能力.阿里的思路是比较合适的,但是必须要注意,绝对不能让node做太多的业务逻辑,他只适合接收生成好的数据,然后或渲染后,或直接发送到 ...