轉載自:http://wiki.eoe.cn/page/iOS_blog_page_14738.html
我現在要使用SQLite3.0創建一個數據庫,然後在數據庫中創建一個表格。
首先要引入SQLite3.0的lib庫。然後包含頭文件#import
【1】 打開數據庫,如果沒有,那麼創建一個
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
sqlite3* database_;
-(BOOL) open{
NSArray *paths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory
stringByAppendingPathComponent:@"mydb.sql"];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL find = [fileManager fileExistsAtPath:path];
//找到數據庫文件mydb.sql
if (find) {
NSLog(@"Database file have already existed.");
if(sqlite3_open([path UTF8String], &database_) != SQLITE_OK)
{
sqlite3_close(database_);
NSLog(@"Error: open database file.");
return NO;
}
return YES;
}
if(sqlite3_open([path UTF8String], &database_) == SQLITE_OK) {
bFirstCreate_ = YES;
[self createChannelsTable:database_];//在後面實現函數
createChannelsTable
return YES;
} else {
sqlite3_close(database_);
NSLog(@"Error: open database file.");
return NO;
}
return NO;
}
|
【2】創建表格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//創建表格,假設有五個字段,(id,cid,title,imageData ,imageLen )
//說明一下,id爲表格的主鍵,必須有。
//cid,和title都是字符串,imageData是二進制數據,imageLen
是該二進制數據的長度。
- (BOOL) createChannelsTable:(sqlite3*)db{
char *sql = "CREATE TABLE channels (id integer primary key,
cid text,
title text,
imageData BLOB,
imageLen integer)";
sqlite3_stmt *statement;
if(sqlite3_prepare_v2(db, sql, -1, &statement, nil) !=
SQLITE_OK) {
NSLog(@"Error: failed to prepare statement:create channels
table");
return NO;
}
int success = sqlite3_step(statement);
sqlite3_finalize(statement);
if ( success != SQLITE_DONE) {
NSLog(@"Error: failed to dehydrate:CREATE TABLE channels");
return NO;
}
NSLog(@"Create table 'channels' successed.");
return YES;
}
|
【3】 向表格中插入一條記錄
假設channle是一個數據結構體,保存了一條記錄的內容。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
- (BOOL) insertOneChannel:(Channel*)channel{
NSData* ImageData = UIImagePNGRepresentation( channel.image_);
NSInteger Imagelen = [ImageData length];
sqlite3_stmt *statement;
static char *sql = "INSERT INTO channels
(cid,title,imageData,imageLen)
VALUES(?,?,?,?)";
//問號的個數要和(cid,title,imageData,imageLen)裏面字段的個數匹配,代表未知的值,將在下面將值和字段關聯。
int success = sqlite3_prepare_v2(database_, sql, -1, &statement,
NULL);
if (success != SQLITE_OK) {
NSLog(@"Error: failed to insert:channels");
return NO;
}
//這裏的數字1,2,3,4代表第幾個問號
sqlite3_bind_text(statement, 1, [channel.id_ UTF8String], -1,
SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 2, [channel.title_ UTF8String], -1,
SQLITE_TRANSIENT);
sqlite3_bind_blob(statement, 3, [ImageData bytes], Imagelen,
SQLITE_TRANSIENT);
sqlite3_bind_int(statement, 4, Imagelen);
success = sqlite3_step(statement);
sqlite3_finalize(statement);
if (success == SQLITE_ERROR) {
NSLog(@"Error: failed to insert into the database with
message.");
return NO;
}
NSLog(@"Insert One Channel#############:id =
[%@",channel.id](mailto:%@%22,channel.id)_);
return YES;
}
|
【4】數據庫查詢
這裏獲取表格中所有的記錄,放到數組fChannels中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
- (void) getChannels:(NSMutableArray*)fChannels{
sqlite3_stmt *statement = nil;
char *sql = "SELECT * FROM channels";
if (sqlite3_prepare_v2(database_, sql, -1, &statement, NULL) !=
SQLITE_OK) {
NSLog(@"Error: failed to prepare statement with message:get
channels.");
}
//查詢結果集中一條一條的遍歷所有的記錄,這裏的數字對應的是列值。
while (sqlite3_step(statement) == SQLITE_ROW) {
char* cid = (char*)sqlite3_column_text(statement, 1);
char* title = (char*)sqlite3_column_text(statement, 2);
Byte* imageData = (Byte*)sqlite3_column_blob(statement, 3);
int imageLen = sqlite3_column_int(statement, 4);
Channel* channel = [[Channel alloc] init];
if(cid)
channel.id_ = [NSString stringWithUTF8String:cid];
if(title)
channel.title_ = [NSString stringWithUTF8String:title];
if(imageData){
UIImage* image = [UIImage imageWithData:[NSData
dataWithBytes:imageData length:imageLen]];
channel.image_ = image;
}
[fChannels addObject:channel];
[channel release];
}
sqlite3_finalize(statement);
}
|
iphone訪問本地數據庫sqlite3
Phone也支持訪問本地數據庫**Sqlite 3**。這裏簡單的介紹一下**iPhone**上**Sqlite 3**的使用方法。
首先需要在項目中引用 Sqlite 3的開發包,下面是在iPhone SDK
3.0下的目錄:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/libsqlite3.0.dylib
到這裏你需要事先用命令來創建 Sqlite
3的數據庫文件,並在其中創建自己的表等等,然後作爲資源文件添加到項目,然後在程序第一次運行的時候複製到程序下的Documents或其他目錄下,關於
Sqlite 3的基本操作網上已經有不少文章,這裏就不重複了。
在iPhone中使用 Sqlite 3主要步驟如下:
1 首先獲取iPhone上 Sqlite 3的數據庫文件的地址
2 打開 Sqlite 3的數據庫文件
3 定義SQL文
4 邦定執行SQL所需要的參數
5 執行SQL文,並獲取結果
6 釋放資源
7 關閉 Sqlite 3數據庫。
下面結合代碼來示範一下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// 首先獲取iPhone上Sqlite3的數據庫文件的地址
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];
// 打開Sqlite3的數據庫文件
sqlite3 *database;
sqlite3_open([path UTF8String], &database);
// 定義SQL文
sqlite3_stmt *stmt;
const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";
sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);
// 邦定第一個int參數
sqlite3_bind_int(stmt, 1, 1);
// 邦定第二個字符串參數
sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);
// 執行SQL文,並獲取結果
sqlite3_step(stmt);
// 釋放資源
sqlite3_finalize(stmt);
// 關閉Sqlite3數據庫
sqlite3_close(database);
|