原帖地址:http://www.cnblogs.com/Boblii/archive/2013/06/04/sqlite_update_binary_data.html
近做了一个iPhone应用,开发环境使用的实xcode 4.6,同时使用了arc模式开发,为了提高数据库操作的可读性以及可操作性,在数据访问重
抛弃了sqlite的标准操作,我使用的实FMDB--一个对基本sqlite语法进行封装后便于数据访问与C# ado.net有点类似。
使用FMDB很方便的实现了(通过数据库字段名而不是字段索引)数据的读取,插入,更新,删除。但是我在更新图片时发现通过格式化字符(@“%@”,data/*NSData*/)传入的二进制数据更新到数据库后不能显示图片。如果使用的时INSERT 方法能将图片信息正确保存到数据库重,因为在FMDB中处理INSERT时会调用到下面的方法
- (void)bindObject:(id)obj toColumn:(int)idx inStatement:(sqlite3_stmt*)pStmt {
if ((!obj) || ((NSNull *)obj == [NSNull null])) {
sqlite3_bind_null(pStmt, idx);
}
// FIXME - someday check the return codes on these binds.
else if ([obj isKindOfClass:[NSData class]]) {
sqlite3_bind_blob(pStmt, idx, [obj bytes], (int)[obj length], SQLITE_STATIC);
} ......
通过 这句标准sqlite语句 才能有效的将二进制信息保存到数据库 sqlite3_bind_blob(pStmt, idx, [obj bytes], (int)[obj length], SQLITE_STATIC);
后来我测试了几次,如果使用UPDATE语句是不可能调用上面的方法的,那么需要怎样才能更新图片等二进制信息呢?(可能对于FMDB我还没完全了解,不知道有没有处理更新二进制数据的方法,我也没时间去找了,于是就在FMDB源码中添加了一个方法,用来保存二进制数据)如下:
- (BOOL)executeUpdate:(NSString*)sql imageData:(NSData*)imageData{
if(!imageData || [imageData length] < 4)
return NO;
sqlite3_stmt *statement;
int success = sqlite3_prepare_v2(_db, [sql UTF8String], -1, &statement, NULL);
if (success != SQLITE_OK) {
//NSLog(@"Error: failed to update picture");
return NO;
}
sqlite3_bind_blob(statement, 1, [imageData bytes], [imageData length], SQLITE_TRANSIENT);
success = sqlite3_step(statement);
sqlite3_finalize(statement);
if (success != SQLITE_DONE) {
//NSLog(@"Error: failed to update picture into the database ");
return NO;
}
return YES;
}
其实就是自己添加了一个标准的sqlite更新方法,希望能给大家带来帮助,如果有更好的方法,不令赐教。
本文链接
分享到:
相关推荐
1.数组存储到数据库的思路:存储前,数组归档(NSKeyedArchiver)为二进制数据,再存入数据库;从数据库取出时肯定也是取出的二进制数据,这时要将二进制数据解档(NSKeyedUnArchiver)为数组; 2.自定义模型存储到...
对象归档是Objective-C中的一个特性,允许开发者将Objective-C对象转换为二进制数据,然后存储到磁盘上。这一过程称为编码(archiving),而从磁盘读取并恢复对象称为解码(unarchiving)。归档通常用于存储应用程序...
这里我们创建了一个名为`Images`的表,包含`id`(主键,自动递增)、`imageName`(图片名)和`imageData`(图片数据,以二进制形式存储)三列。 4. **插入数据**:使用`executeUpdate:`方法执行`INSERT INTO`语句...
通过使用FMDB这样的Objective-C库,开发者可以在iOS应用中方便地操作SQLite数据库,创建表、插入、更新和查询数据。 2. **Core Data**:Apple的Core Data框架是iOS和macOS开发中的首选数据管理工具,提供了一种模型...
开发者可以创建文本文件(如.txt或.json)或二进制文件(如.data或.plist)来存储Char数组或其他类型的数据。`FileManager`类提供了读写文件的基本操作,包括创建、读取、修改和删除文件。 3. **SQLite数据库...
SQLite数据库文件是一个普通的二进制文件,可以随应用一起分发,也可以在不同设备之间共享。 在iOS中使用SQLite,通常需要以下步骤: 1. **安装SQLite库**:尽管iOS系统内置了SQLite,但为了方便编程,开发者通常...
这允许将对象转换为二进制数据并写入文件,反之亦然。实现`NSCoding`协议即可实现归档: ```swift class User: NSObject, NSCoding { var name: String func encode(with coder: NSCoder) { coder.encode(name...
SQLite是一种ACID(原子性、一致性、隔离性和持久性)兼容的数据库引擎,支持SQL标准,并且提供了多种数据类型,包括整型、浮点型、字符串和BLOB(二进制大对象)。SQLite通过文件来存储数据库,这意味着你可以轻易...
SQLite是一个关系型数据库管理系统,它包含在应用程序的二进制包中,不需要额外安装。由于其小巧、高效的特点,特别适合移动设备,如iOS和Android设备。 二、SQLite与iOS集成 在iOS中,SQLite可以通过C语言API直接...
例如,可以将一个字典转换为二进制格式并写入文件,当需要时再读取回内存。这种方式适用于数据结构相对简单的场景,但不支持自定义对象的存储。 接下来,我们讨论**对象归档(Object Archiving)**。对象归档是...
此外,SQLite支持的数据类型包括整数、浮点数、字符串、BLOB(二进制大对象)等,这使得它可以适应各种类型的数据存储需求。源码中可能有示例展示如何将这些数据类型与Swift或Objective-C的对象进行映射。 同时,...
FMDB通过桥接C语言的SQLite接口,使得Objective-C程序员可以方便地进行数据库操作,包括创建表、插入数据、更新数据、删除数据以及查询数据等。 ### YXSqliteDatabaseHandleLib特点 1. **易用性**:...
它的优点包括体积小、速度快、可靠性高,并支持多种数据类型,如整型、浮点型、字符串和二进制数据。 在iOS中使用SQLite,我们需要引入Foundation框架,它提供了对SQLite的基本支持。首先,创建一个SQLite数据库...
在iOS开发中,有时我们需要将图片数据存储到数据库中,以便于后续的读取和操作。Objective-C作为苹果平台的主要编程语言,提供了多种方法来处理这种情况。本篇将详细讲解如何将图片存入SQLite数据库,并从数据库中...
例如,要保存一个字符串和图片数据: ```objc NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *name = @"default string"; [defaults setObject:name forKey:@"name"]; UIImage *...
例如,图片、音频文件或其他二进制数据可以通过`NSData`对象进行操作。 在选择合适的存储方式时,应考虑数据的复杂性、性能需求、数据量和查询需求。属性列表和对象归档适合小量简单数据,SQLite3和CoreData适用于...
Foundation框架中的`NSFileManager`用于文件管理,`NSString`和`NSData`处理文本和二进制数据,而`FMDB`或苹果原生的`sqlite3`库则提供了与SQLite数据库交互的方法。 1. **SQLite基础知识**:SQLite是一个关系型...
将自定义对象保存到SQLite需要将其转化为可以存储的数据格式,通常是JSON或二进制数据。Objective-C中的`NSKeyedArchiver`和`NSKeyedUnarchiver`可以用于对象的序列化和反序列化,将对象转换为字节流并还原。 3. ...
4. NSPersistentStore:表示实际的存储,可以是SQLite数据库、XML、二进制或其他自定义格式。 进行CoreData的基本读取操作包括以下步骤: 1. 设置代理和托管对象上下文。 2. 创建一个针对特定Entity的fetchRequest...