SQLiteObject_C
前言
简单介绍一下写这个类的初衷,在编写项目的时候数据持久化存储是必不可少的,所以项目中会频繁使用 sqlite 数据库。虽然现在有很多相关用于 sqlite C语言 API 封装的工具类库(比如常用的 FMDB 等),但仍然发现有一个令人不满意的地方。在使用 FMDB 提供的 API 做查增删改等操作时,需要我们手动书写 SQL 语句来执行 API,这时就需要我手动编写 SQL 语句字符串。有时我们编写的 SQL 语句可能会比较复杂,然后很容易出现 SQL 语句书写错误的情况,然后就可以检查你的 SQL 字符串哪里出现了错误,既浪费时间又费脑力。然后我就思考我是否可以写一个用于描述 SQL 语句的工具类(当然工具类必须满足我的预期),答案是肯定的,SQLiteLanguage 就是用来描述 SQL 语句的类(main 文件里有实例代码)。SQLiteLanguage 定义了一些 SQL 关键字的方法,后续将会不断完善(如果有做得不对的地方,希望得到各位大神的指点)。
使用实例:测试函数
1.打开数据库,通过 SQLiteObjectC 类的单例来创建数据库连接:
void openDB(){
NSString *pathStr =[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingString:@"/School.db"];
if (![[SQLITEObjectC share] openWithFilePath:pathStr]) {
NSLog(@"数据库打开失败");
}
}
#pragma mark - 2.关闭数据库:
void closeDB(){
if (![[SQLITEObjectC share] close]) {
NSLog(@"数据库关闭失败");
}
}
3.创建表,通过 SQLiteLanguage 来构建 SQL 语句,然后通过 SQLiteObjectC 类的单例的 -(BOOL)execSQL:(SQLiteLanguage *)sqll 方法执行 SQL 语句:
void createTable(){
SHARESQLITEObjectC.SQLL.CREATE.TABEL(@"Sutdent").COLUMNS(
SQLlang.columnName(@"age").INTEGER,//列名叫age,INTEGER类型的数据,不许为空
SQLlang.columnName(@"name").TEXT,
SQLlang.columnName(@"ID").TEXT.NOT(@"NULL").PRIMARY.KEY(nil),//列名叫ID,TEXT类型的数据同时设置为主键,不许为空
nil
);
if (![[SQLITEObjectC share] execSQLL]) {
NSLog(@"创建表失败");
}
}
4.删除表:
void dropTable(){
SHARESQLITEObjectC.SQLL.DROP.TABEL(@"Sutdent");
if (![[SQLITEObjectC share] execSQLL]) {
NSLog(@"删除表失败");
}
}
5.向表插入数据:
void insert(){
SHARESQLITEObjectC.SQLL.INSERT.INTO(@"Sutdent").COLUMNS(@"age",@"name",@"ID",nil).VALUES(@"24",@"'马悦'",@"120702010013",nil);
if (![[SQLITEObjectC share] execSQLL]) {
NSLog(@"数据插入失败");
}
}
6.数据查询,查询到的结果通过 SQLiteObjectC 类的单例 execSQLResultArray 获取:
void SELECT(){
SHARESQLITEObjectC.SQLL.SELECT(SQL_DISTINCT,@"*",nil).FROM(@"Sutdent").WHERE(@"name='马悦'");
if (![[SQLITEObjectC share] execSQLL]) {
NSLog(@"数据查询失败");
}else{
NSLog(@"%@",[SQLITEObjectC share].execSQLResultArray);
}
}
7.修改表数据:
void UPDATE(){
SHARESQLITEObjectC.SQLL.UPDATE(@"Sutdent").SET(@"name='小明'",@"age=90",nil).WHERE(@"ID='120702010019'");
if (![[SQLITEObjectC share] execSQLL]) {
NSLog(@"数据更新失败");
}
}
8.删除表数据:
void DELETE(){
SHARESQLITEObjectC.SQLL.DELETE.FROM(@"Sutdent").WHERE(@"ID='120702010019'");
if (![[SQLITEObjectC share] execSQLL]) {
NSLog(@"数据删除失败");
}
}
9.排序:
void ORDERBY(){
SHARESQLITEObjectC.SQLL.SELECT(SQL_DISTINCT,@"*",nil).FROM(@"Sutdent").ORDER.BY(@"ID").DESC;
if (![[SQLITEObjectC share] execSQLL]) {
NSLog(@"排序失败");
}else{
NSLog(@"%@",[SQLITEObjectC share].execSQLResultArray);
}
}
10.事务:
void Transaction(){
NSLog(@"start:%@",[NSDate date]);
SHARESQLITEObjectC.SQLL.BEGIN.TRANSACTION.SEMICOLON;
for (NSInteger i=0; i<100000; i++) {
SHARESQLITEObjectC.SQLL.INSERT.INTO(@"Goods").COLUMNS(@"ID",@"name",@"price",@"imageUrl",nil).VALUES(@"'120702010011'",@"'这是啥东西'",@"9999999999999",@"'https://120702010011/yangyue.com'",nil).SEMICOLON;
}
SHARESQLITEObjectC.SQLL.COMMIT.SEMICOLON;
NSLog(@"start:%@",[NSDate date]);
if (!SHARESQLITEObjectC.execSQLL) {
NSLog(@"事物执行失败");
}
NSLog(@"end:%@",[NSDate date]);
}