iOS中Sqlite轻量级数据库的使用

来源:互联网 发布:2016淘宝排名权重因素 编辑:程序博客网 时间:2024/04/30 03:03

Problem:

iOS的MVC模型中,将模型数据持久存储到iOS文件系统,通常有四种机制:属性列表、对象归档、iOS嵌入式关系数据库(SQLite3)、Apple提供的Core Data。属性列表和对象归档适合存取数据量不是很大的数据,在需要保存的数据比较多的时候,往往考虑使用数据库。SQLite3为iOS内嵌的一个轻量级的数据库,它提供了C实现的接口。为了更方便使用,你自己写一个封装了这些接口的类,如DBHelper,然后在其中定义自己的表、数据查询、插入、删除等等的接口。对于新手,那么该如何了解和开始使用SQLite3呢?这里或许能给你一些有意义的信息。


Solution:

(1) 了解SQLite,最好不过的就是去它的官方网站看详细的文档,这将是一个不错的起点。

http://www.sqlite.org/lang.html和http://www.sqlite.org/cintro.html

如果你认真把上面的文档读完了的话,那么相信你会对SQLite有了不错的理解,特别是了解了它所提供的接口。那么,你现在或许需要回忆一下以前所学过的数据库知识了,比如建表、查询、插入、删除等等的命令,当然这些命令在iOS的Sqlite使用中会略有差别。

(2) 《iOS 5基础教程》的数据持久化的那一章。

这本书不是一本很好的开发入门书籍,但是不能否认其中某些章节的内容还是不错的。如果是一个新手,一上来看这本书,或许会比较痛苦,它不太适合作为入门读得第一本书。但是如果能耐着心看上一两遍,其实发现这本书其实也还可以。而数据持久化的那一章,就有SQLite的简要介绍,可以提供一些例子给你参考。

看了这两个资料,相信你基本具备了编写代码使用SQLite数据库的能力了。


Example:

下面是自己摸索、实践并应用于项目中的代码示例。对照例子,或许能给你学习SQLite的使用带来更多的灵感。

//interface文件

//  Created by fengtao.ft on 14-5-13.#import <Foundation/Foundation.h>@interface TestDBHelper : NSObject+ (TestDBHelper *)sharedInstance;- (BOOL)insertNewRecord:(NSString *)imgURL                userId:(NSString *)userId                 email:(NSString *)email                  date:(NSString *)date;- (BOOL)deleteRecordWithUserId:(NSString *)userId                      email:(NSString *)email                       date:(NSString *)date;- (BOOL)deleteRecordWithUserId:(NSString *)userId;- (BOOL)deleteAllRecords;- (NSArray *)queryAllRecords;- (NSArray *)quereRecordWithUserId:(NSString *)userId;@end


//implementation文件
//  Created by fengtao.ft on 14-5-13.#import "TestDBHelper.h"#import <sqlite3.h>#define kTestDBName @"TestDB.sqlite"#define kImgUrl @"imgURL"#define kUserId @"userId"#define kEmail @"email"#define kDate @"date"@interface TestDBHelper (){    sqlite3 *testDB;    dispatch_queue_t testDBQueue;}@end@implementation TestDBHelperstatic TestDBHelper *sharedManager;+ (TestDBHelper *) sharedInstance{        if (nil == sharedManager){        sharedManager = [[TestDBHelper alloc] init];    }    return sharedManager;}- (NSString *)databasePath{        NSString *dbFolderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES) objectAtIndex:0];    dbFolderPath = [dbFolderPath stringByAppendingPathComponent:@"DBFolder"];    NSFileManager *manager = [NSFileManager defaultManager];    BOOL isDir;    if (![manager fileExistsAtPath:dbFolderPath isDirectory:&isDir]){        [manager createDirectoryAtPath:dbFolderPath           withIntermediateDirectories:YES                            attributes:nil                                 error:nil];    }    dbFolderPath = [dbFolderPath stringByAppendingPathComponent:kTestDBName];        return dbFolderPath;}- (id)init{        if (self = [super init]){        testDBQueue = dispatch_queue_create("TestDBQueue", NULL);        [self createDatabaseIfNotExist];    }    return self;}- (void)createDatabaseIfNotExist{        //dispatch_async(testDBQueue, ^{        NSString *dbPath = [self databasePath];        int isOpen;        isOpen = sqlite3_open([dbPath UTF8String], &testDB);        if (isOpen != SQLITE_OK){            NSLog(@"Fail to open database");            sqlite3_close(testDB);        }else{            const char *createSQL = "CREATE TABLE IF NOT EXISTS testInfoTable \                                    (imgURL TEXT, userId TEXT, email TEXT, date TEXT)";            char *errMsg;            int isCreate = sqlite3_exec(testDB, createSQL, NULL, NULL, &errMsg);            if (isCreate != SQLITE_OK){                NSLog(@"Fail to create table");            }            sqlite3_close(testDB);        }    //});    }- (BOOL)insertNewRecord:(NSString *)imgURL userId:(NSString *)userId email:(NSString *)email date:(NSString *)date{        BOOL isInsert = NO;        NSString *dbPath = [self databasePath];    if (sqlite3_open([dbPath UTF8String], &testDB) != SQLITE_OK){        sqlite3_close(testDB);    }else{        const char *insertSQL = "INSERT INTO testInfoTable (imgURL, userId, email, date) VALUES (?,?,?,?)";        sqlite3_stmt *insertStmt;        if(sqlite3_prepare_v2(testDB, insertSQL, -1, &insertStmt, NULL) == SQLITE_OK){            sqlite3_bind_text(insertStmt, 1, [imgURL UTF8String], -1, NULL);            sqlite3_bind_text(insertStmt, 2, [userId UTF8String], -1, NULL);            sqlite3_bind_text(insertStmt, 3, [email UTF8String], -1, NULL);            sqlite3_bind_text(insertStmt, 4, [date UTF8String], -1, NULL);            if(sqlite3_step(insertStmt) == SQLITE_DONE){                NSLog(@"Insert success");                isInsert = YES;            }        }        sqlite3_finalize(insertStmt);        sqlite3_close(testDB);    }        return isInsert;}- (BOOL)deleteRecordWithUserId:(NSString *)userId email:(NSString *)email date:(NSString *)date{        BOOL isDelete = NO;        NSString *dbPath = [self databasePath];    if(sqlite3_open([dbPath UTF8String], &testDB) != SQLITE_OK){        sqlite3_close(testDB);    }else{        const char *deleteSQL = "DELETE FROM testInfoTable WHERE userId = ? AND email = ? AND date = ?";        sqlite3_stmt *deleteStmt;        if(sqlite3_prepare_v2(testDB, deleteSQL, -1, &deleteStmt, NULL) == SQLITE_OK){            sqlite3_bind_text(deleteStmt, 1, [userId UTF8String], -1, NULL);            sqlite3_bind_text(deleteStmt, 2, [email UTF8String], -1, NULL);            sqlite3_bind_text(deleteStmt, 3, [date UTF8String], -1, NULL);            if(sqlite3_step(deleteStmt) == SQLITE_DONE){                NSLog(@"Delete sucess");                isDelete = YES;            }        }        sqlite3_finalize(deleteStmt);        sqlite3_close(testDB);    }        return isDelete;}- (BOOL)deleteRecordWithUserId:(NSString *)userId{        BOOL isDelete = NO;        NSString *dbPath = [self databasePath];    if(sqlite3_open([dbPath UTF8String], &testDB) != SQLITE_OK){        sqlite3_close(testDB);    }else{        const char *deleteSQL = "DELETE FROM TestInfoTable WHERE userId = ?";        sqlite3_stmt *deleteStmt;        int isPrepare = sqlite3_prepare_v2(testDB, deleteSQL, -1, &deleteStmt, NULL);        if( isPrepare == SQLITE_OK){            sqlite3_bind_text(deleteStmt, 1, [userId UTF8String], -1, NULL);            if(sqlite3_step(deleteStmt) == SQLITE_DONE){                NSLog(@"Delete success");                isDelete = YES;            }        }        sqlite3_finalize(deleteStmt);        sqlite3_close(testDB);    }        return isDelete;    }- (BOOL)deleteAllRecords{        BOOL isDelete = NO;    NSString *dbPath = [self databasePath];    if(sqlite3_open([dbPath UTF8String], &testDB) != SQLITE_OK){        sqlite3_close(testDB);    }else{        const char *deleteSQL = "DELETE FROM TestInfoTable";        sqlite3_stmt *deleteStmt;        if(sqlite3_prepare_v2(testDB, deleteSQL, -1, &deleteStmt, NULL) == SQLITE_OK){            if(sqlite3_step(deleteStmt) == SQLITE_DONE){                NSLog(@"Delete all success");                isDelete = YES;            }        }        sqlite3_finalize(deleteStmt);        sqlite3_close(testDB);           }        return isDelete;}- (NSArray *)queryAllRecords{        NSString *dbPath = [self databasePath];    NSMutableArray *dataList = nil;    if(sqlite3_open([dbPath UTF8String], &testDB) != SQLITE_OK){        sqlite3_close(testDB);    }else{        const char *querySQL = "SELECT * FROM TestInfoTable";        sqlite3_stmt *queryStmt;        if(sqlite3_prepare_v2(testDB, querySQL, -1, &queryStmt, NULL) == SQLITE_OK){            dataList = [NSMutableArray array];            while(sqlite3_step(queryStmt) == SQLITE_ROW){                const char *imgurlChar = (const char *)sqlite3_column_text(queryStmt, 0);                const char *useridChar = (const char *)sqlite3_column_text(queryStmt, 1);                const char *emailChar = (const char *)sqlite3_column_text(queryStmt, 2);                const char *dateChar = (const char *)sqlite3_column_text(queryStmt, 3);                                NSMutableDictionary *data = [NSMutableDictionary dictionaryWithCapacity:4];                [data setObject:[NSString stringWithUTF8String:imgurlChar] forKey:kImgUrl];                [data setObject:[NSString stringWithUTF8String:useridChar] forKey:kUserId];                [data setObject:[NSString stringWithUTF8String:emailChar] forKey:kEmail];                [data setObject:[NSString stringWithUTF8String:dateChar] forKey:kDate];                                [dataList addObject:data];            }        }        sqlite3_finalize(queryStmt);        sqlite3_close(testDB);    }        return dataList;}- (NSArray *)quereRecordWithUserId:(NSString *)userId{        NSString *dbPath = [self databasePath];    NSMutableArray *dataList = nil;        if(sqlite3_open([dbPath UTF8String], &testDB) != SQLITE_OK){        sqlite3_close(testDB);    }else{        const char *querySQL = "SELECT * FROM TestInfoTable WHERE userId = ?";        sqlite3_stmt *queryStmt;        if(sqlite3_prepare_v2(testDB, querySQL, -1, &queryStmt, NULL) == SQLITE_OK){            dataList = [NSMutableArray array];            sqlite3_bind_text(queryStmt, 1, [userId UTF8String], -1, NULL);            while(sqlite3_step(queryStmt) == SQLITE_ROW){                const char *imgurlChar = (const char *)sqlite3_column_text(queryStmt, 0);                const char *useridChar = (const char *)sqlite3_column_text(queryStmt, 1);                const char *emailChar = (const char *)sqlite3_column_text(queryStmt, 2);                const char *dateChar = (const char *)sqlite3_column_text(queryStmt, 3);                                NSMutableDictionary *data = [NSMutableDictionary dictionaryWithCapacity:4];                [data setObject:[NSString stringWithUTF8String:imgurlChar] forKey:kImgUrl];                [data setObject:[NSString stringWithUTF8String:useridChar] forKey:kUserId];                [data setObject:[NSString stringWithUTF8String:emailChar] forKey:kEmail];                [data setObject:[NSString stringWithUTF8String:dateChar] forKey:kDate];                                [dataList addObject:data];            }        }        sqlite3_finalize(queryStmt);        sqlite3_close(testDB);    }        return dataList;}@end

Discussion:

(一些需要注意的东西,待总结补上)

Open Source Demo:

(provide git link coming soon......)


0 0
原创粉丝点击