IOS中sqlite数据库利用bold类型存储与读取字典

我在做app收藏时, 发现我的数据有的是字典, 字典怎么向数据库中保存呢? 就看了好多博客, 字典应该利用数据库中的bold类型来保存,可是添加到数据库之后,读取不出来, 为此伤透了脑筋,为了解决这个问题, 花费了好时间.

以前认为bold类型就是用来存放二进制的,可以存放图片等, 而我的数据存到数据库中的确是二进制,所以读的时候全是二进制, 以致不能转换成字典。后来发现我保存数据的方法就是错的, bold类型不仅可以放二进制也可以放数据,简直颠覆了我对bold类型的看法,BLOB,只是一个数据块,完全按照输入存放,并不是只能存放二进制。

存储字典(向数据库中写入):

先将字典转为NSData类型, 再往数据库中保存, 特别注意的是, NSData 数据不能使用 sql 语句插入,因为要向数据库中写入blob类型的二进制数据,还要写入数据的长度bytes, 所以在写sql语句时不要插入blob类型的数据,不多说,直接上例子:

 sqlite3_stmt *stmt = nil;
// NSDictionary 转 NSData
NSData *data = [NSJSONSerialization dataWithJSONObject:[[List initWithList:list] objectForKey:@"cover_image"] options:NSJSONWritingPrettyPrinted  error:nil];
// 添加其他字段可以用这个insert 方法
 NSString *sqlstr = [NSString stringWithFormat:@"insert into hjl_list(Id, title, actual_count, collectors_count) values(‘%@‘, ‘%@‘, ‘%@‘, ‘%@‘)", list.Id, list.title, list.actual_count, list.collectors_count];
//sql的update语句,为了写入 blob类型的数据
NSString *sqlstr_data = [NSString stringWithFormat:@"update hjl_list set cover_img=? where Id=‘%@‘", list.Id];
int result = sqlite3_exec(db, [sqlstr UTF8String], nil, nil, nil);
// 执行 update 语句
int result2 = sqlite3_prepare(db, [sqlstr_data UTF8String], -1, &stmt, nil);
if (result == SQLITE_OK && result2 == SQLITE_OK) {
      // 使用 sqlite3_bind_blob64 语句用绑定的方式插入数据,查询的时候 bytes 才正确
        sqlite3_bind_blob64(stmt, 1, [data bytes], [data length], nil);
        if (sqlite3_step(stmt) == SQLITE_DONE) {
            NSLog(@"添加成功");
        }
        return YES;
    }
    NSLog(@"%@ 失败",sqlstr);
    return  NO;

读取数据(从数据库中读取):

sqlite3 *db = [DB openDataBase];
    sqlite3_stmt *stmt = nil;
    NSString *sqlstr = [NSString stringWithFormat:@"select * from hjl_list"];
    int result = sqlite3_prepare(db, [sqlstr UTF8String], -1, &stmt, nil);
    if (result == SQLITE_OK) {
        while (sqlite3_step(stmt) == SQLITE_ROW) {
         const void *op = sqlite3_column_blob(stmt, 4);
            int size = sqlite3_column_bytes(stmt, 4);
            NSData *data = [NSData dataWithBytes:op length:size];

// 这里的dic就是从数据库中读取的字典
            NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

            }
时间: 2024-07-31 23:02:11

IOS中sqlite数据库利用bold类型存储与读取字典的相关文章

iOS 中SQLite数据库操作

在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 demo 具体过程: 1.创建名为 SQLite_Manage 的.h .m 文件,导入头文件 <sqlite3.h> 2.数据库在一个app中只有一个,使用单例模式:(代码如下) 1 + (SQLite_Manager *)sharedManager{ 2 static SQLite_Mana

android中SQLite数据库的增删改查

1.数据库帮助类PersonSQLiteOpenHelper package com.wzw.sqllitedemo.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper

iOS中plist的创建,数据写入与读取

iOS中plist的创建,数据写入与读取功能创建一个test.plist文件,textInput作为输入,displayLabel作为显示,有一个按钮来触发保持程序triggerStorage: -(void)triggerStorage { displayLabel.text = textInput.text; NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)

蜗牛爱课- iOS中plist的创建,数据写入与读取

iOS中plist的创建,数据写入与读取功能创建一个test.plist文件-(void)triggerStorage{    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);    NSString *path=[paths    objectAtIndex:0];      NSString *filename=[path stringByAppendin

数据库对内存的存储与读取

#include "mainwindow.h"#include <QApplication>#include <QtSql/QSqlDatabase>#include <QtDebug>#include <QtSql/qsqlquery.h>#include <QByteArray>#include <QTextCodec>#include <QSqlError>#define MAX_BUFFER_S

iOS中几种常用的数据存储方式

自己稍微总结了一下下,方便大家查看 1.write直接写入文件的方法 永久保存在磁盘中,可以存储的对象有NSString.NSArray.NSDictionary.NSData.NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中, 具体步骤大致如下: 第一步:获得文件即将保存的路径: NSArray*documentPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,Y

Android中SQLite数据库的简单使用

File file = new File("hah.txt"); //只是创建了一个对象file, file指向了hah.txt这个文件,hah.txt这个文件可能存在,也可能不存在.如果文件不存在,则不会被创建. 必须要有文件输出流对文件进行了写的操作,文件才会被创建. 游标:在访问数据库中表结构时,想访问表中的某一行的时候,数据库内部有一个快速的定位方式,这个定位方式是通过索引来实现的.游标相当于数组的指针,通过游标的上下移动来查找数据. 在Android中使用SQLite数据库,

android中sqlite数据库的基本使用和添加多张表

看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大家如何在sqlite数据库中建立多张表. 首先是如何建立数据库和表: 建立一个类继承SQLiteOpenHelper,即: public class ReaderOpenHelper extends SQLiteOpenHelper 然后添加构造方法: public ReaderOpenHelper

iOS中sqlite和coreData的区别

sqlite和coreData的区别: 1.sqlite数据库的操作流程: 创建数据库,再通过定义一些字段来定义表格结构,可以利用sql语句向表格中插入记录,删除记录,修改记录,表格之间也可以建联系. sqlite和coreData的类做个对应: 表结构--------NSEntityDescription(菜单详情) 数据库中所有的表格和他们的联系--------NSmanagedObjectModel(菜谱) 数据库存放方式---------NSPersistentStoreCoordina