您的位置:首页 > 数据库

No.07 Xcode(5.1.x) 使用SQLite

2014-07-16 17:16 239 查看
1.需要在工程配置中加入libsqlite3.dylib

2.在代码中引入库文件sqlite3.h

3.需要用到的接口函数大致如下:

sqlite3_open打开或者创建数据库文件
sqlite3_close关闭由sqlite3_open建立的连接
sqlite3_execsqlite3_prepare_v2,sqlite3_step()和sqlite3_finalize()的封装,能让程序多次执行sql语句而不要写许多重复的代码
sqlite3_prepare_v2可以理解为数据库操作的开始
sqlite3_step可以理解为数据库操作的过程
sqlite3_finalize可以理解为数据库操作的结束
sqlite3_column_int

sqlite3_column_text

sqlite3_column_blob
sqlite3_step时, 通过这些函数从数据库操作中取到某行列那个单元格的值
4.程序因意外而中断时, 已经执行的数据库操作依然会保留下来

#import "sqlite3.h"

typedef void(^sqlite3_result)(sqlite3_stmt* ppStmt);

int sqlite3_search(sqlite3* db, const char* sql, sqlite3_result result)
{
sqlite3_stmt* statement = 0;

int ret = sqlite3_prepare_v2(db, sql, -1, &statement, NULL);
if (ret != SQLITE_OK)
{
NSLog(@"sqlite3_search failed. ret=%d, sql=%s", ret, sql);
}
else while (sqlite3_step(statement) == SQLITE_ROW)
{
result(statement);
}
sqlite3_finalize(statement);

return ret;
}

- (void)buttonClicked:(UIButton*)sender
{
NSString* filepath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"userinfo.dat"];
NSLog(@"%@", filepath);

// 启动程序时, 如果文件存在, 删除它
NSFileManager* fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:filepath] == YES)
[fileManager removeItemAtPath:filepath error:nil];

sqlite3* database = 0;
NSString* sql = nil;
char* err = 0;
int ret = 0;

// 打开或创建文件
ret = sqlite3_open([filepath UTF8String], &database);
if (ret != SQLITE_OK)
{
NSLog(@"sqlite3_open failed. ret=%d", ret);
return;
}

// 创建表
sql = @"CREATE TABLE IF NOT EXISTS userinfo (userid INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT, password TEXT)";
ret = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &err);
if (ret != SQLITE_OK)
{
NSLog(@"sqlite3_exec failed. ret=%d, err=%s, sql=%@", ret, err, sql);
}

// 插入数据
for (int i = 0; i < 4; i++)
{
sql = [NSString stringWithFormat:@"INSERT INTO userinfo (username, password) VALUES('name%02d', 'pswd%03d')", i, i];
ret = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &err);
if (ret != SQLITE_OK)
{
NSLog(@"sqlite3_exec failed. ret=%d, err=%s, sql=%@", ret, err, sql);
}
}

// 删除数据
sql = @"DELETE FROM userinfo WHERE username='name02'";
ret = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &err);
if (ret != SQLITE_OK)
{
NSLog(@"sqlite3_exec failed. ret=%d, err=%s, sql=%@", ret, err, sql);
}

// 修改数据
sql = @"UPDATE userinfo SET password='123456' WHERE username='name01'";
ret = sqlite3_exec(database, [sql UTF8String], NULL, NULL, &err);
if (ret != SQLITE_OK)
{
NSLog(@"sqlite3_exec failed. ret=%d, err=%s, sql=%@", ret, err, sql);
}

// 查询数据
sql = @"SELECT userid, username, password FROM userinfo";
ret = sqlite3_search(database, [sql UTF8String], ^(sqlite3_stmt *ppStmt) {
NSInteger userid   = sqlite3_column_int(ppStmt, 0);
NSString* username = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(ppStmt, 1)];
NSString* password = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(ppStmt, 2)];
NSLog(@"userid=%d, username='%@', password='%@'", userid, username, password);
});

// 关闭文件
sqlite3_close(database);
}


Mac中已经自带了sqlite3程序, 我们可以通过Mac终端来查看SQLite数据库, 测试SQL语句:

1.输入命令 SQLITE3 -column -header /filepath/xxx.sqlite 可以打开数据库, 进入数据库操作的状态, 注意路径中的空格问题

2.数据库操作状态可以使用以下命令:

.tables ==> 查看数据库中有哪些表
.quit ==> 退出数据库操作的状态, .exit命令也是这个效果

3.数据库操作状态输入SQL语句, 并以分号结尾, 可以执行SQL语句

创建: CREATE TABLE IF NOT EXISTS userInfo (id INTEGER PRIMARY KEY AUTOINCREMENT, uid TEXT, pwd TEXT);
销毁: DROP TABLE userInfo;
添加: INSERT INTO userInfo (uid, pwd) VALUES ('kitty', '123456');
删除: DELETE FROM userInfo;
查询: SELECT * FROM userInfo;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: