您的位置:首页 > 数据库

[TwistedFate]数据库初级使用

2015-12-08 20:25 363 查看

SQLite数据库

使用步骤:

1. 引入libsqlite3.0框架

2. 在数据库操作类里 引入

创建单例类实现数据库的管理使用

//  单例的初始化方法
+ (SQLiteManager *)shareManager;

//  插入数据
- (void)insertTableWithStudent:(Student *)stu;

//  删除数据
- (void)deleteWithAge:(NSInteger)age;

//  更新
- (void)updateAge:(NSInteger)age byName:(NSString *)name;

//  查询
- (Student *)selectStudentWithName:(NSString *)name age:(NSInteger)age;


方法实现

//  单例类初始化方法
+ (SQLiteManager *)shareManager{

//  静态区指针
static SQLiteManager *manager = nil;

if (manager == nil) {

manager = [[SQLiteManager alloc] init];

//  调用创建表的方法
[manager createTable];

}

//  为保证程序运行期间一直存在 所以不手动释放
//  程序运行结束 自动释放
return manager;

}


创建数据库对象

//  需要在静态去定义一个指针 (让这个指针指向的对象 从程序开始到结束 一直存在)
//  程序结束后被系统自动释放
static sqlite3 *db = nil;


打开数据库

//  打开数据库
- (sqlite3 *)openDatabase{

//  判断数据库是否存在 如果存在的话 直接返回
if (db != nil) {

return db;

}

//  不存在 则创建一个并打开

//  获取Documents的路径
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

//  拼接数据库文件路径 (拼接的数据的文件的名字)
NSString *dbPath = [documentsPath stringByAppendingPathComponent:@"Student.sqlite"];

NSLog(@"%@",dbPath);

//  创建或者打开数据库
//  参数1 文件路径(需要把OC的字符串转化成C语言的) dbPath.UTF8String
//  参数2 数据库的地址
//  接收一下返回值 判断是否打开成功
int result = sqlite3_open(dbPath.UTF8String, &db);

//  用SQLITE_OK可以查表得到错误
if (result == SQLITE_OK) {

NSLog(@"打开成功");

}else{

NSLog(@"打开失败");

}

return db;

}


关闭数据库

//  关闭数据库
- (void)closeDatabase{

int result = sqlite3_close(db);

//  判断关闭是否成功
if (result == SQLITE_OK) {

//  把数据库的指针 重置为空
db = nil;
NSLog(@"关闭成功");

}else{

NSLog(@"关闭失败");

}

}


创建表

//  创建表(要有主键值)
- (void)createTable{

//  注意 一定在操作时, 先打开数据库
//  操作完毕,关闭数据

//  打开数据库
db = [self openDatabase];

//  1.写sql语句
NSString *sql = @"create table IF NOT EXISTS Student(number Integer primary key not NULL, name text not NULL, gender text not NULL, age Integer not NULL, data BLOB not NULL)";

//  2.执行sql语句
//  准备与执行的操作

int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);

if (result == SQLITE_OK) {

NSLog(@"建表成功");

}else{

NSLog(@"建表失败");

}

//  关闭数据库
[self closeDatabase];

}


插入数据

//  插入数据
- (void)insertTableWithStudent:(Student *)stu{

//  打开数据库
db = [self openDatabase];

//  写sql语句
NSString *sql = @"insert into Student(number, name, gender, age, data) values(?, ?, ?, ?, ?)";

//  创建一个跟随指针(指令集)
sqlite3_stmt *stmt = nil;

//  执行sql语句
//  预执行函数 需要用跟随指针 绑定问号
//  然后一步一步执行(判断sql语句是否正确)
int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL);
if (result == SQLITE_OK) {

//  绑定问号(根据sql语句来决定 绑定的顺序)
//  注意:绑定的顺序 从1开始

//  参数2 绑定顺序
//  参数3 绑定的值
sqlite3_bind_int(stmt, 1, (int)stu.number);

//  参数4 字符串长度 一般填- 1
sqlite3_bind_text(stmt, 2, stu.name.UTF8String, - 1, NULL);

sqlite3_bind_text(stmt, 3, stu.gender.UTF8String, - 1, NULL);

sqlite3_bind_int(stmt, 4, (int)stu.age);

//  绑定二进制数据
//  [stu.data bytes]
//  相当于获取到data数据的内容
//  (int)stu.data.length
//  相当于获取到data数据的长度
sqlite3_bind_blob(stmt, 5, [stu.data bytes], (int)stu.data.length, NULL);

//  执行绑定语句
sqlite3_step(stmt);

NSLog(@"插入成功");

}else{

NSLog(@"插入失败");

}

//  不管插入是否成功 都要释放跟随指针
sqlite3_finalize(stmt);

//  关闭数据库
[self closeDatabase];

}

*****不绑定进行插入操作******
/**
*   如果有data数据进行插入操作 sqlite3_exec函数 会把data数据转化成字符串存入数据库
*   也就是说你插入的数据没有data数据 直接使用sqlite3_exec这个函数进行操作 无需使用下面的函数进行绑定
*   NSString *sql = @"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')";
*/
//- (void)text:(Student *)stu{
//
//     NSString *sql = @"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')";
//
//     NSString *sqlNew = [NSString stringWithFormat:@"insert into Student(number, name, gender, age) values('%ld', '%@', '%@', '%ld')", stu.number, stu.name, stu.gender, stu.age];
//
//}


删除数据(根据一个条件删除)

// 删除数据(根据一个条件删除)
- (void)deleteWithAge:(NSInteger)age{

//  打开数据库
//   db = [self openDatabase];

#pragma mark --- 不当绑定删除 需要拼接sql语句

//    //  写SQL语句
//    NSString *sql = @"delete from Student where age > '%ld'";
//
//    //  拼接sql语句
//    NSString *sqlNew = [NSString stringWithFormat:@"delete from Student where age > '%ld'",age];
//
//    //  执行sql语句
//    int result = sqlite3_exec(db, sqlNew.UTF8String, NULL, NULL, NULL);
//
//    //  判断一下执行结果
//    if (result == SQLITE_OK) {
//
//        NSLog(@"删除成功");
//
//    }else{
//
//        NSLog(@"删除失败");
//
//    }
//
//    //  关闭数据库
//    [self closeDatabase];

#pragma mark --- 通过绑定删除法

//  打开数据库
db = [self openDatabase];

//  写SQL语句
NSString *sql = @"delete from Student where age > ?";

//  创建跟随指针
sqlite3_stmt *stmt = nil;

//  预执行sql语句
int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL);

if (result == SQLITE_OK) {

//  绑定问号
sqlite3_bind_int(stmt, 1, (int)age);

NSLog(@"删除成功");

}else{

NSLog(@"删除失败");

}

//  执行绑定的语句
sqlite3_step(stmt);

//  不管成功与否 都要释放跟随指针
sqlite3_finalize(stmt);

//  关闭数据库
[self closeDatabase];

}


更新数据

//  更新数据(根据一个条件来更新)
- (void)updateAge:(NSInteger)age byName:(NSString *)name{

//  打开数据库
db = [self openDatabase];

//  写sql语句
NSString *sql = [NSString stringWithFormat:@"update Student set age = '%ld' where name = '%@'", age, name];

//  执行sql语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);

if (result == SQLITE_OK) {

NSLog(@"更新成功");

}else{

NSLog(@"更新失败");

}

//  关闭数据库
[self closeDatabase];

}


根据条件查询数据

//  根据条件查询数据
- (Student *)selectStudentWithName:(NSString *)name age:(NSInteger)age{

//  打开数据库
db =  [self openDatabase];

//  写sql语句
NSString *sql = @"select * from Student where name = ? and age = ?";

//  创建跟随指针
sqlite3_stmt *stmt = nil;

//  创建一个对象
Student *stu = [[Student alloc] init];

//  预执行sql语句
int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL);

if (result == SQLITE_OK) {

//  绑定问号
sqlite3_bind_text(stmt, 1, name.UTF8String, - 1, NULL);

sqlite3_bind_int(stmt, 2, (int)age);

//  查询时 如果下一行准备好了 返回 SQLITE_ROW
//  这时可以继续查询
//  int iCol列数
//  如果你是查询所有的字段的话 那个这个列表 就根据你创建的建表的顺序一样
//  注意:从0开始
//  如果你查询的是特定的字段 那么这个列数就要根据你的sql语句来写
//  也是从0开始
while (sqlite3_step(stmt) == SQLITE_ROW) {

//  读取数据
int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);

//  读取二进制数据
NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];

//  赋值model
//  stringWithUTF8String 把C语言字符串转化成OC字符串
stu.name = [NSString stringWithUTF8String:name];
stu.gender = [NSString stringWithUTF8String:gender];
stu.number = number;
stu.age = age;

stu.data = data;

}

NSLog(@"查询成功");

}else{

NSLog(@"查询失败");

}

//  执行sql语句
sqlite3_step(stmt);

//  释放跟随指针
sqlite3_finalize(stmt);

//  关闭数据库
[self closeDatabase];

//  自动释放 对象
return [stu autorelease];

}


查询所有行(返回一个数组)

//  查询所有行(返回一个数组)
- (NSArray *)selectAllRows{

//  打开数据库
[self openDatabase];

//  写sql语句
NSString *sql = @"select * from Student";

//  创建一个可变数组备用
NSMutableArray *array = [NSMutableArray array];

//  创建跟随指针
sqlite3_stmt *stmt = nil;

//  预执行
int result = sqlite3_prepare_v2(db, sql.UTF8String, - 1, &stmt, NULL);

//  创建一个对象
Student *stu = [[Student alloc] init];

if (result == SQLITE_OK) {

while (sqlite3_step(stmt) == SQLITE_ROW) {

//  从数据库中读取数据
int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
char *gender = (char *)sqlite3_column_text(stmt, 2);
int age = sqlite3_column_int(stmt, 3);

//  读取二进制数据
NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];

//  赋值model
stu.name = [NSString stringWithUTF8String:name];
stu.gender = [NSString stringWithUTF8String:gender];
stu.number = number;
stu.age = age;

stu.data = data;

//  添加到数组
[array addObject:stu];

[stu release];

}

NSLog(@"成功");

}else{

NSLog(@"失败");

}

//  释放跟随指针
sqlite3_finalize(stmt);

//  关闭数据库
[self closeDatabase];

return array;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: