iOS 数据持久化(四)SQLite3

iOS中有五种持久化数据的方式:属性列表、对象归档、NSUserDefaults、SQLite3和Core Data


SQLite3的数据类型

数据库在应用中最常用的,方便说数据的存取。

所有存在Sqlite 3.0版本当中的数据都拥有以下之一的数据类型:
空(NULL):该值为空
整型(INTEGEER):有符号整数,按大小被存储成1,2,3,4,6或8字节。
实数(REAL):浮点数,以8字节指数形式存储。
文本(TEXT):字符串,以数据库编码方式存储(UTF-8, UTF-16BE 或者 UTF-16-LE)。
BLOB:BLOB数据不做任何转换,以输入形式存储。

在关系数据库中,CLOB和BLOB类型被用来存放大对象。BOLB表示二进制大对象,这种数据类型通过用来保存图片,图象,视频等。CLOB表示字符大对象,能够存放大量基于字符的数据。


iOS中数据库SQLite3的使用

具体使用方法如下:

1.添加开发包libsqlite3.0.dylib

首先是设置项目文件,在项目中添加iPhone版的sqlite3的数据库的开发包,在项目下的Frameworks点击右键,然后选择libsqlite3.0.dylib文件。


libsqlite3.0.dylib文件地址: 
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/lib/libsqlite3.0.dylib

2.有码有真相:

加入FMDB这个第三方库文件,项目编程开始。

AppDelegate.h文件

//
//  AppDelegate.h
//  SQLite3Demo
//
//  Created by 李振杰 on 13-11-22.
//  Copyright (c) 2013年 swplzj. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

/**
 *  @brief  在状态栏处显示的提示框
 *
 *  @param string   显示的字符串
 *  @param duration 显示的时长
 */
+ (void)showStatusWithText:(NSString *)string duration:(NSTimeInterval)duration;

@end

AppDelegate.m文件

//
//  AppDelegate.m
//  SQLite3Demo
//
//  Created by 李振杰 on 13-11-22.
//  Copyright (c) 2013年 swplzj. All rights reserved.
//

#import "AppDelegate.h"
#import "RootViewController.h"

@interface AppDelegate ()

@property (strong, nonatomic) UIWindow *statusWindow;
@property (retain, nonatomic) UILabel *statusLabel;

- (void)dismissStatusLabel;

@end

@implementation AppDelegate

- (void)dealloc
{
    [self.statusWindow release];
    [self.statusLabel release];
    
    [_window release];
    [super dealloc];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
 
    self.statusWindow = [[UIWindow alloc] initWithFrame:CGRectZero];
    self.statusWindow.backgroundColor = [UIColor clearColor];
    self.statusWindow.windowLevel = UIWindowLevelStatusBar + 1;

    self.statusLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    self.statusLabel.backgroundColor = [UIColor clearColor];
    self.statusLabel.textColor = [UIColor whiteColor];
    self.statusLabel.font = [UIFont systemFontOfSize:13];
    [self.statusWindow addSubview:self.statusLabel];
    [self.statusWindow makeKeyAndVisible];
    
    RootViewController *rootVC = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:rootVC];
    [rootVC release];
    
    self.window.rootViewController = rootNav;
    [rootNav release];
    
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

#pragma mark - Custom methods

- (void)dismissStatusLabel
{
    CGRect rect = self.statusWindow.frame;
    rect.origin.y -= rect.size.height;
    [UIView animateWithDuration:0.8 animations:^{
        self.statusWindow.frame = rect;
    }];
}

/**
 *  @brief  在状态栏处显示的提示框
 *
 *  @param string   显示的字符串
 *  @param duration 显示的时长
 */
+ (void)showStatusWithText:(NSString *)string duration:(NSTimeInterval)duration
{
    AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    
    delegate.statusLabel.text = string;
    [delegate.statusLabel sizeToFit];
    CGRect rect = [UIApplication sharedApplication].statusBarFrame;
    CGFloat width = delegate.statusLabel.frame.size.width;
    CGFloat height = rect.size.height;
    rect.origin.x = rect.size.width = width - 5;
    rect.size.width = width;
    delegate.statusWindow.frame = rect;
    delegate.statusLabel.backgroundColor = [UIColor blackColor];
    delegate.statusLabel.frame = CGRectMake(100, 0, width, height);
    duration = (duration < 1.0 ? 1.0 : duration);
    duration = (duration > 4.0 ? 4.0 : duration);
    [delegate performSelector:@selector(dismissStatusLabel)];
}

@end

使用FMDB第三方库,数据库管理文件


//
//  DBManager.h
//  SQLite3Demo
//
//  Created by 李振杰 on 13-11-26.
//  Copyright (c) 2013年 swplzj. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "FMDatabaseAdditions.h"

@class FMDatabase;

/**
 *  @brief 对数据连接进行管理,包括连接,关闭连接
 *  可以建立长连接
 *
 */
@interface DBManager : NSObject{
    NSString *_dbPath;
}

@property (readonly, nonatomic) FMDatabase *dataBase;

//单例模式
+ (DBManager *)defaultDBManager;

//关闭数据库
- (void)close;

@end

//
//  DBManager.m
//  SQLite3Demo
//
//  Created by 李振杰 on 13-11-26.
//  Copyright (c) 2013年 swplzj. All rights reserved.
//

#import "DBManager.h"
#import "FMDatabase.h"

//#define kDefaultDBName @"user.sqlite"
#define kDefaultDBName @"user.db"

@interface DBManager ()

@end

static DBManager *_sharedDBManager;

@implementation DBManager

- (void)dealloc
{
    [self close];
    
    [super dealloc];
}

- (id)init
{
    if (self = [super init]) {
        int state = [self initializeDBWithName:kDefaultDBName];
        if (-1 == state) {
            NSLog(@"数据库初始化失败!");
        }else {
            NSLog(@"数据库初始化成功!");
        }
    }
    return self;
}

- (int)initializeDBWithName:(NSString *)name
{
    if (!name) {
        return -1;  //数据库创建失败
    }
    
    //沙盒Doc目录
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    _dbPath = [doc stringByAppendingString:[NSString stringWithFormat:@"/%@", name]];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    BOOL exist = [fileManager fileExistsAtPath:_dbPath];
    [self connect];
    return (exist == YES ? 0 : 1);
}

//连接数据库
- (void)connect
{
    if (!_dataBase) {
        _dataBase = [[FMDatabase alloc] initWithPath:_dbPath];
    }
    if (![_dataBase open]) {
        NSLog(@"不能打开数据库");
    }
}

- (void)close
{
    [_dataBase close];
    [_sharedDBManager release];
    _sharedDBManager = nil;
}

+ (DBManager *)defaultDBManager
{
    if (!_sharedDBManager) {
        _sharedDBManager = [[DBManager alloc] init];
    }
    return _sharedDBManager;
}


@end

向创建的数据库文件中添加数据表,对表的增删改查

//
//  UserDB.h
//  SQLite3Demo
//
//  Created by 李振杰 on 13-11-26.
//  Copyright (c) 2013年 swplzj. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "DBManager.h"
#import "User.h"

@interface UserDB : NSObject{
    FMDatabase *_db;
}
//创建数据表
- (void)createTable;
//增:添加用户
- (void)updateTableWithUser:(User *)user;
//删:删除用户
- (void)deleteTableWithUserID:(NSString *)uid;
//改:修改用户信息
- (void)modifyTableWithUser:(User *)user;
//查:查找用户
- (NSArray *)queryTableWithUid:(NSString *)uid count:(int)userCount;

@end

//
//  UserDB.m
//  SQLite3Demo
//
//  Created by 李振杰 on 13-11-26.
//  Copyright (c) 2013年 swplzj. All rights reserved.
//

#import "UserDB.h"
#import "AppDelegate.h"

#define kUserTableName                             @"User"

@implementation UserDB

- (id)init
{
    self = [super init];
    if (self) {
        //首先查看有没有数据库文件,没有就创建
        _db = [DBManager defaultDBManager].dataBase;
    }
    return self;
}

//创建数据表
- (void)createTable
{
    FMResultSet *set = [_db executeQuery:[NSString stringWithFormat:@"select count(*) from sqlite_master where type = 'table' and name = '%@'", kUserTableName]];
    [set next];
    
    NSInteger count = [set intForColumnIndex:0];
    BOOL existTable = !!count;
    if (existTable) {
        //更新数据库
        [AppDelegate showStatusWithText:@"数据库已经存在!" duration:2];
    } else {
        //插入到数据库
        NSString *sqlStr = @"CREATE TABLE User (uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name VARCHAR(50), description VARCHAR(100))";
        BOOL res = [_db executeUpdate:sqlStr];
        if (!res) {
            [AppDelegate showStatusWithText:@"数据库创建失败!" duration:2];
        } else {
            [AppDelegate showStatusWithText:@"数据库创建成功!" duration:2];
        }
        
    }
}

//保存数据
- (void)updateTableWithUser:(User *)user
{
    NSMutableString *query = [NSMutableString stringWithFormat:@"INSERT INTO User"];
    NSMutableString *keys = [NSMutableString stringWithFormat:@" ("];
    NSMutableString *values = [NSMutableString stringWithFormat:@" ( "];
    NSMutableArray *arguments = [NSMutableArray arrayWithCapacity:5];
    if (user.name) {
        [keys appendString:@"name,"];
        [values appendString:@"?,"];
        [arguments addObject:user.name];
    }
    if (user.description) {
        [keys appendString:@"description,"];
        [values appendString:@"?,"];
        [arguments addObject:user.description];
    }
    
    [keys appendString:@")"];
    [values appendString:@")"];
    [query appendFormat:@" %@ VALUES%@", [keys stringByReplacingOccurrencesOfString:@",)" withString:@")"], [values stringByReplacingOccurrencesOfString:@",)" withString:@")"]];
    NSLog(@"插入一条语句:%@", query);
    [AppDelegate showStatusWithText:@"插入一条数据!" duration:2];
    [_db executeUpdate:query withArgumentsInArray:arguments];
    
}

//删除用户信息
- (void)deleteTableWithUserID:(NSString *)uid
{
    NSString *query = [NSString stringWithFormat:@"DELETE FROM User WHERE uid = '%@'", uid];
    [AppDelegate showStatusWithText:@"删除一条数据!" duration:2];
    [_db executeUpdate:query];
}

//修改用户信息
- (void)modifyTableWithUser:(User *)user
{
    if (!user.uid) {
        return;
    }
    NSString *query = @"UPDATE User SET";
    NSMutableString *temp = [NSMutableString stringWithCapacity:0];
    if (user.name) {
        [temp appendFormat:@"name = '%@',", user.name];
    }
    if (user.description) {
        [temp appendFormat:@"description = '%@',", user.description];
        [temp appendFormat:@")"];
        query = [query stringByAppendingFormat:@"%@ WHERE uid = '%@'", [temp stringByReplacingOccurrencesOfString:@",)" withString:@""], user.uid];
        NSLog(@"修改一条数据:%@", query);
        [AppDelegate showStatusWithText:@"修改了一条数据!" duration:2];
        [_db executeUpdate:query];
    }
}

//查找用户
- (NSArray *)queryTableWithUid:(NSString *)uid count:(int)userCount
{
    NSString *query = @"SELECT uid, name, description FROM User";
    if (!uid) {
        query = [query stringByAppendingFormat:@" ORDER BY uid DESC limit %d", userCount];
    } else {
        query = [query stringByAppendingFormat:@" WHERE uid > %@ ORDER BY uid DESC limit %d", uid, userCount];
    }
    NSLog(@"query = %@", query);
    FMResultSet *rs = [_db executeQuery:query];
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:[rs columnCount]];
    while ([rs next]) {
        User *user = [[User alloc] init];
        user.uid = [rs stringForColumn:@"uid"];
        user.name = [rs stringForColumn:@"name"];
        user.description = [rs stringForColumn:@"description"];
        NSLog(@"user.uid = %@\nuser.name = %@\nuser.des = %@\n", user.uid, user.name, user.description);
        [array addObject:user];
        [user release];
    }
    [rs close];
    NSLog(@"array = %@\n", array);
    return array;
}


@end

数据模型类

//
//  User.h
//  SQLite3Demo
//
//  Created by 李振杰 on 13-11-26.
//  Copyright (c) 2013年 swplzj. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (copy, nonatomic) NSString *uid;
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *description;

@end

//
//  User.m
//  SQLite3Demo
//
//  Created by 李振杰 on 13-11-26.
//  Copyright (c) 2013年 swplzj. All rights reserved.
//

#import "User.h"

@implementation User

@synthesize uid, name, description;

@end


关于数据库的操作在上面代码中基本都包含,你也可以点击下载SQLite3Demo源码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值