您的位置:首页 > 产品设计 > UI/UE

UI基础-数据库

2015-12-10 23:08 465 查看

数据库管理系统

SQL

My SQL

Oracle

SQL语句

SQL命令

创建表

创建表
create table IF NOT EXISTS lanOuStudent(number integer primary key not NULL, name text not NULL, gender text not NULL, age integer not NULL, imageData BLOB not NULL)


数据插入命令(Insert)

INSERT INTO `Demo_Table`(`demo_id`, `demo_name`) VALUES (1,'xiaohao');
1. insert into ...... values ......———关键字
2. Demo_Table—————————表名
3. demo_id和demo_name—————表中的字段名称
4. 1和’xiaohao’——————————要插⼊入的数据


数据更新命令(Update)

UPDATE `Demo_Table` SET `demo_name` = 'yangyang' WHERE `demo_id`=1;
1. update ...... set ......where......———关键字
2. Demo_Table—————————表名
3. demo_id和demo_name—————表中的字段名称
4. ’yangyang’——————————要更新的数据内容
5. 1——————————————要更新的数据检索条件


数据删除命令(Delete)

DELETE FROM `Demo_Table` WHERE `demo_id`=1; 1. delete from ......where......———关键字
2. Demo_Table—————————表名
3. demo_id—————表中的字段名称
4. 1——————————————要删除的数据检索条件


数据检索命令(Select)

SELECT * FROM `Demo_Table` WHERE `demo_id`=1; 1. select from ......where......———关键字
2. Demo_Table—————————表名
3. demo_id—————表中的字段名称
4. 1——————————————要查询的数据检索条件


iOS的数据库技术的实现

嵌入式数据库

SQLite嵌入式数据库

支持事件,不需要配置,不需要安装,不需要管理员;

支持大部分SQL92;

完整的数据库保存在磁盘上面一个文件,同一个数据库文件可以在不同机器上面使用,最大支持数据库到2T

整个系统少于3万行代码,少于250KB的内存占用;

源代码开发,代码95%有较好的注释,简单易用的API;

开始使用SQLite

Linux系统级的SQLite技术实现框架libsqlite3.0.dylib

1.引入

SQLite语法

sqlite3_exec()

包含两个步骤 1.准备 2.执行语句
sqlite3_exec(sqlite3 *, const char *sql, int (*callback)(void *, int, char **, char **), void *, char **errmsg)

第1个参数  是前面open函数得到的指针。
第2个参数  是一条sql语句。
第3个参数  是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。
第4个参数  是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。
第5个参数  是错误信息。


准备语句

sqlite3_prepare_v2(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **ppStmt, const char **pzTail)


执行准备的绑定语句

sqlite3_step()
int nByte -1 指sql语句长度 可以无限长
sqlite3_stmt 跟随指针 地址
const char **pzTail 截取sql语句未使用部分

绑定查询值
第二个参数 指查询的第几个问号 从1开始
sqlite3_bind_text(stmt, 1, name.UTF8String, -1, NULL);

读取数据
第二个参数 指的是 表中的列数 从0开始
char *name = (char *)sqlite3_column_text(stmt, 1);

NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 1) length:sqlite3_column_bytes(stmt, 1)];


例题

新建工程

// AppDelegate.h
RootViewController *rootVC = [[RootViewController alloc] init];
UINavigationController *navC = [[UINavigationController alloc] initWithRootViewController:rootVC];
self.window.rootViewController = navC;
[navC release];
[rootVC release];


新建SQLiteManager类继承于NSObject(单例类)

使用sql数据步骤

// 1.引入libsqlite3.0 框架
// 2.在数据库操作类里 引入<sqlite3.h>头文件
// 注:咱们使用的函数 都在这个头文件中


实现初始化方法

+ (SQLiteManager *)sharemanager
{
// 静态区指针
static SQLiteManager *manager = nil;
if (manager == nil) {
manager = [[SQLiteManager alloc] init];
// 调用创建表的方法
[manager createTable];
}
return manager;
}


对数据库进行管理

打开数据库

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

// 打开数据库
- (sqlite3 *)openDB
{
// 判断数据库是否存在 如果存在的话 直接返回
if (db != nil) {
return db;
}
// 不存在 则创建一个并打开
// 获取路径
NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
// 拼接数据库路径(拼接的数据库文件的名字)
NSString *dbPath = [documentPath 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)closeDB
{
int result = sqlite3_close(db);
// 判断是否关闭成功
if (result == SQLITE_OK) {
NSLog(@"关闭成功");
// 把数据库的指针 重置为空
db = nil;
} else {
NSLog(@"关闭失败");
}
}


创建表

- (void)createTable
{
// 注意:一定在操作时 先打开数据库
// 操作完毕 关闭数据

// 打开数据库
db = [self openDB];
// 1.写sql语句
NSString *sql = @"create table IF NOT EXISTS  LanOuStudent(number NSInteger primary key not NULL, name text not NULL, age NSInteger not NULL, gender text not NULL, imageData BLOB not NULL)";
// 2. 执行sql语句
// 3.准备与执行语句的操作
// 如果有data数据进行插入的话
// sqlite3_exec 这个函数 会把data数据转化成字符串存入数据库
// 如果插入的数据没有data数据的话 直接用sqlite3_exec 函数 插入数据就行 不用绑定了
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"建表成功");
}else {
NSLog(@"建表失败");
}

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

}




插入数据

- (void)insertTableWithStudent:(LanOuStudent *)student
{
// 打开数据库
db = [self openDB];
// 写语句
NSString *sql = @"insert into LanOuStudent(number, name, gender, age, imageData) 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)student.number);
sqlite3_bind_text(stmt, 2, student.name.UTF8String, -1, NULL);
sqlite3_bind_text(stmt, 3, student.gender.UTF8String, -1, NULL);
sqlite3_bind_int(stmt, 4, (int)student.age);
// 绑定二进制数
// [student.imageData bytes]
// 相当于获取到data数据的内容
// (int)[student.imageData length]
// 相当于获取到data数据的长度
sqlite3_bind_blob(stmt, 5, [student.imageData bytes], (int)[student.imageData length], NULL);

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

NSLog(@"插入成功");
} else {
NSLog(@"插入失败");
}
// 不管插入是否成功 都要释放跟随指针
sqlite3_finalize(stmt);

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

}


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

- (void)deleteWithAge:(NSInteger)age
{
#pragma mark ---  不当绑定删除   需要拼接sql语句
// 打开数据库
db = [self openDB];
// 写语句
NSString *sql = [NSString stringWithFormat:@"delete from LanOuStudent where age > '%ld'", age];
// 执行sql语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"删除成功");
} else {
NSLog(@"删除失败");
}
// 关闭数据库
[self closeDB];
#pragma mark ---  通过绑定删除法
// 打开数据库
db = [self openDB];
// 写语句
NSString *sql = @"delete from LanOuStudent 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);

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

NSLog(@"删除成功");
} else {
NSLog(@"删除失败");
}
// 不管成功与否 都要释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDB];

}


更新数据(根据一个条件来更新)

- (void)updateAge:(NSInteger)age byName:(NSString *)name
{
// 打开数据库
db = [self openDB];
// 写sql语句
NSString *sql = [NSString stringWithFormat:@"update lanOuStudent set age = '%ld' where name = '%@'", age, name];
// 执行语句
int result = sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@"更新成功");
} else {
NSLog(@"更新失败");
}
// 关闭数据库
[self closeDB];

}


查询数据(根据条件查询)

- (LanOuStudent *)selectStudentWithName:(NSString *)name age:(NSInteger)age
{
// 打开数据库
db = [self openDB];
// 写sql语句
NSString *sql = @"select * from lanOuStudent where name = ? and age = ?";
// 创建跟随指针
sqlite3_stmt *stmt = nil;
// 创建一个对象
LanOuStudent *stu = [[LanOuStudent 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
// 这时可以继续查询
while (sqlite3_step(stmt) == SQLITE_ROW) {
// 读取数据
// int iCol 列数
// 如果你查询所有的字段的话 那么这个列数 就根据你创建表的顺序一样
// 注意:从0开始

// 如果你查询的是特定的字段 那么这个列数 就要根据你的sql语句来写
// 也是 从0开始

int number = sqlite3_column_int(stmt, 0);
char *name = (char *)sqlite3_column_text(stmt, 1);
int age = sqlite3_column_int(stmt, 2);
char *gender = (char *)sqlite3_column_text(stmt, 3);
// 读取二进制数据
NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];
// 赋值model
// [NSString stringWithUTF8String:(const char *)]
// 把C语言字符串 转化成 OC字符串
stu.number = number;
stu.name = [NSString stringWithUTF8String:name];
stu.age = age;
stu.gender = [NSString stringWithUTF8String:gender];
stu.imageData = imageData;
}
NSLog(@"查询成功");
} else {
NSLog(@"查询失败");
}
// 释放跟随指针
sqlite3_finalize(stmt);
// 关闭数据库
[self closeDB];
return [stu autorelease];
}


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

- (NSArray *)selectAllStudents
{
// 打开数据库
db = [self openDB];

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

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

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

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

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

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);
int age = sqlite3_column_int(stmt, 2);
char *gender = (char *)sqlite3_column_text(stmt, 3);
NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(stmt, 4) length:sqlite3_column_bytes(stmt, 4)];

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

// 添加到数组
[arr addObject:stu];
[stu release];
}

NSLog(@"查询成功!");
} else {
NSLog(@"查询失败!");
}

sqlite3_finalize(stmt);
[self closeDB];
return arr;
}


实现方法

// RootViewController.h
SQLiteManager *manager = [SQLiteManager sharemanager];


插入数据

// 插入一条数据
LanOuStudent *stu = [[LanOuStudent alloc] init];
stu.name = @"jtt";
stu.number = 11;
stu.age = 16;
stu.gender = @"男";
stu.imageData = UIImagePNGRepresentation([UIImage imageNamed:@"9.jpg"]);
// 插入数据
[manager insertTableWithStudent:stu];




删除数据

[manager deleteWithAge:18];


更新数据(条件)

[manager updateAge:18 byName:@"jtt"];




查找数据(条件)

LanOuStudent *stu1 = [manager selectStudentWithName:@"jtt" age:16];


查找数据(所有)

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