gaojunquan / jqfmdb Goto Github PK
View Code? Open in Web Editor NEWFMDB的封装,操作简单,线程安全,扩展性强,直接操作model或dictionary
License: MIT License
FMDB的封装,操作简单,线程安全,扩展性强,直接操作model或dictionary
License: MIT License
具体代码:
NSMutableString *fieldStr = [[NSMutableString alloc] initWithFormat:@"CREATE TABLE IF NOT EXISTS %@ (pkid INTEGER PRIMARY KEY,", tableName];
源码中缺少“ IF NOT EXISTS ”
测试包存储一点问题没有,正式包就没有数据存储
可以用swift也写一套
真是扯淡
在 JQFMDB.m中字符串 属性 dbPath ,应该使用copy吧?你那里写的strong
@Property (nonatomic, strong)NSString *dbPath;
(FMDatabaseQueue *)dbQueue
{
if (!_dbQueue) {
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:_dbName];
FMDatabaseQueue *fmdb = [FMDatabaseQueue databaseQueueWithPath:path];
self.dbQueue = fmdb;
[_db close];
self.db = [fmdb valueForKey:@"_db"];
}
return _dbQueue;
}
(instancetype)initWithDBName:(NSString *)dbName path:(NSString *)dbPath
{
if (!dbName) {
dbName = @"JQFMDB.sqlite";
}
NSString *path;
if (!dbPath) {
path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:dbName];
} else {
path = dbPath;
}
FMDatabase *fmdb = [FMDatabase databaseWithPath:path];
if ([fmdb open]) {
self = [self init];
if (self) {
self.db = fmdb;
self.dbName = dbName;
return self;
}
}
return nil;
}
请问如何在查询数据时根据字段,比如model中有个testID属性,根据testID排倒序取前10条数据,类似这样子的可以实现吗?
模糊查询应该如何写,一直查询不到·····thanks
列如
[db jq_lookupTable:@"User" dicOrModel:@{@"name":@"TEXT",@"otherName":@"TEXT"} whereFormat:
那么结果字典只会有name而没有otherName
我查看代码,发现是这里的问题
for (NSString *key in dic) {
resultDic = nil;
if ([dic[key] isEqualToString:SQL_TEXT]) {
id value = [set stringForColumn:key];
if (value)
//这里每次都会将resultDic替换掉而不是新增
resultDic = [NSDictionary dictionaryWithObject:value forKey:key];
} else if ([dic[key] isEqualToString:SQL_INTEGER]) {
resultDic = [NSDictionary dictionaryWithObject:@([set longLongIntForColumn:key]) forKey:key];
} else if ([dic[key] isEqualToString:SQL_REAL]) {
resultDic = [NSDictionary dictionaryWithObject:[NSNumber numberWithDouble:[set doubleForColumn:key]] forKey:key];
} else if ([dic[key] isEqualToString:SQL_BLOB]) {
id value = [set dataForColumn:key];
if (value)
resultDic = [NSDictionary dictionaryWithObject:value forKey:key];
}
}
如题,因为很多模型都有共同的属性就定义在父类的
一般的APP数据都要做上下拉分页刷新的功能,现框架明显不支持。
能否设置表的主键?如果主键的值一样的话就插入失败,这样保证唯一性,对吗?不然其中操作失误,就出现查出来多条数据是一样的……
这个可以联表查询吗?项目中需要两个表一起查
我用您的类添加表总是失败DB Query: INSERT INTO yxtable ) values ()
我用update方法更新了数据库的一条数据,返回接口是成功了,但是取到的缓存并没有变化
大神您好,我看了下您的源码,现在好像不支持模型嵌套对不???
有一个需求,先更新或删除一个表中的内容,再更新或删除另一个表中的内容,要在异步中处理,我连续调用了两个jq_inDatabase 无法实现, 嵌套的话就崩溃,请问这种情况怎么处理
��想给已存在的表新增字段怎么处理
我使用了jsonModel,一个model中含有一个数组,数组对象是另外一个model,请问这种情况怎么办
源码:
NSString *resultStr = nil;
if ([typeStr hasPrefix:@"T@"NSString""]) {
resultStr = SQL_TEXT;
} else if ([typeStr hasPrefix:@"T@"NSData""]) {
resultStr = SQL_BLOB;
} else if ([typeStr hasPrefix:@"Ti"]||[typeStr hasPrefix:@"TI"]||[typeStr hasPrefix:@"Ts"]||[typeStr hasPrefix:@"TS"]||[typeStr hasPrefix:@"T@"NSNumber""]||[typeStr hasPrefix:@"TB"]||[typeStr hasPrefix:@"Tq"]||[typeStr hasPrefix:@"TQ"]) {
resultStr = SQL_INTEGER;
} else if ([typeStr hasPrefix:@"Tf"] || [typeStr hasPrefix:@"Td"]){
resultStr= SQL_REAL;
}
这事明显可以将字典和数组当作text格式存储起来,然后查询的时候将text转化为相应的类型输出
往表中插入model时一直失败 ,字段名属性类型都无误 ...
大神是怎么做的数据库迁移
import UIKit
//
// JQFMDB.h
//
// Created by Joker on 17/3/7.
// GitHub: https://github.com/gaojunquan/JQFMDB
//
open class JQFMDB : NSObject {
/**
(主键id,自动创建) 返回最后插入的primary key id
@param tableName 表的名称
*/
open func lastInsertPrimaryKeyId(_ tableName: String!) -> Int
/**
单例方法创建数据库, 如果使用shareDatabase创建,则默认在NSDocumentDirectory下创建JQFMDB.sqlite, 但只要使用这三个方法任意一个创建成功, 之后即可使用三个中任意一个方法获得同一个实例,参数可随意或nil
dbName 数据库的名称 如: @"Users.sqlite", 如果dbName = nil,则默认dbName=@"JQFMDB.sqlite"
dbPath 数据库的路径, 如果dbPath = nil, 则路径默认为NSDocumentDirectory
*/
open class func shareDatabase() -> Self!
open class func shareDatabase(_ dbName: String!) -> Self!
open class func shareDatabase(_ dbName: String!, path dbPath: String!) -> Self!
/**
非单例方法创建数据库
@param dbName 数据库的名称 如: @"Users.sqlite"
dbPath 数据库的路径, 如果dbPath = nil, 则路径默认为NSDocumentDirectory
*/
public init!(dbName: String!)
public init!(dbName: String!, path dbPath: String!)
/**
创建表 通过传入的model或dictionary(如果是字典注意类型要写对),虽然都可以不过还是推荐以下都用model
@param tableName 表的名称
@param parameters 设置表的字段,可以传model(runtime自动生成字段)或字典(格式:@{@"name":@"TEXT"})
@return 是否创建成功
*/
open func jq_createTable(_ tableName: String!, dicOrModel parameters: Any!) -> Bool
/**
同上,
@param nameArr 不允许model或dic里的属性/key生成表的字段,如:nameArr = @[@"name"],则不允许名为name的属性/key 生成表的字段
*/
open func jq_createTable(_ tableName: String!, dicOrModel parameters: Any!, excludeName nameArr: [Any]!) -> Bool
/**
增加: 向表中插入数据
@param tableName 表的名称
@param parameters 要插入的数据,可以是model或dictionary(格式:@{@"name":@"小李"})
@return 是否插入成功
*/
open func jq_insertTable(_ tableName: String!, dicOrModel parameters: Any!) -> Bool
/**
删除: 根据条件删除表中数据
@param tableName 表的名称
@param format 条件语句, 如:@"where name = '小李'"
@return 是否删除成功
*/
/**
更改: 根据条件更改表中数据
@param tableName 表的名称
@param parameters 要更改的数据,可以是model或dictionary(格式:@{@"name":@"张三"})
@param format 条件语句, 如:@"where name = '小李'"
@return 是否更改成功
*/
/**
查找: 根据条件查找表中数据
@param tableName 表的名称
@param parameters 每条查找结果放入model(可以是[Person class] or @"Person" or Person实例)或dictionary中
@param format 条件语句, 如:@"where name = '小李'",
@return 将结果存入array,数组中的元素的类型为parameters的类型
*/
/**
批量插入或更改
@param dicOrModelArray 要insert/update数据的数组,也可以将model和dictionary混合装入array
@return 返回的数组存储未插入成功的下标,数组中元素类型为NSNumber
*/
open func jq_insertTable(_ tableName: String!, dicOrModelArray: [Any]!) -> [Any]!
// `删除表
open func jq_deleteTable(_ tableName: String!) -> Bool
// `清空表
open func jq_deleteAllData(fromTable tableName: String!) -> Bool
// `是否存在表
open func jq_isExistTable(_ tableName: String!) -> Bool
// `表**有多少条数据
open func jq_tableItemCount(_ tableName: String!) -> Int32
// `返回表中的字段名
open func jq_columnNameArray(_ tableName: String!) -> [Any]!
// `关闭数据库
open func close()
// `打开数据库 (每次shareDatabase系列操作时已经open,当调用close后若进行db操作需重新open或调用shareDatabase)
open func open()
/**
增加新字段, 在建表后还想新增字段,可以在原建表model或新model中新增对应属性,然后传入即可新增该字段,该操作已在事务中执行
@param tableName 表的名称
@param parameters 如果传Model:数据库新增字段为建表时model所没有的属性,如果传dictionary格式为@{@"newname":@"TEXT"}
@param nameArr 不允许生成字段的属性名的数组
@return 是否成功
*/
open func jq_alterTable(_ tableName: String!, dicOrModel parameters: Any!, excludeName nameArr: [Any]!) -> Bool
open func jq_alterTable(_ tableName: String!, dicOrModel parameters: Any!) -> Bool
// ============================= 线程安全操作 ===============================
/**
将操作语句放入block中即可保证线程安全, 如:
Person *p = [[Person alloc] init];
p.name = @"小李";
[jqdb jq_inDatabase:^{
[jqdb jq_insertTable:@"users" dicOrModel:p];
}];
*/
open func jq_(inDatabase block: (() -> Swift.Void)!)
/**
事务: 将操作语句放入block中可执行回滚操作(*rollback = YES;)
Person *p = [[Person alloc] init];
p.name = @"小李";
for (int i=0,i < 1000,i++) {
[jq jq_inTransaction:^(BOOL *rollback) {
BOOL flag = [jq jq_insertTable:@"users" dicOrModel:p];
if (!flag) {
*rollback = YES; //只要有一次不成功,则进行回滚操作
return;
}
}];
}
*/
open func jq_(inTransaction block: ((UnsafeMutablePointer<ObjCBool>?) -> Swift.Void)!)
}
import UIKit
import JQFMDB
class ViewController: UIViewController {
var db = JQFMDB()
var arr : [Person] = [Person]()
override func viewDidLoad() {
super.viewDidLoad()
let p = Person()
p.name = "123"
p.sex = "nan"
// 创建数据库
db = JQFMDB.shareDatabase("person.sqlite")
// 用模型创建表
db.jq_createTable("user", dicOrModel: Person())
//
// // 查找模型 没有look 方法
// db.js_look
//
}
}
import UIKit
class Person: NSObject {
var name: String?
var sex: String?
}
请问支持UIimage类型吗?
rowid >= 15 and rowid <200 order by rowid DESC
我希望可以在项目中继承该类做一些扩展(现有的功能太少了),但又不想修改你的源码,如果把属性db暴露出来后,会比较方便扩展。
我使用中发现BOOL类型的属性创建表的时候会失败,我不太明白这些下面这段代码:
([typeStr hasPrefix:@"Ti"]||[typeStr hasPrefix:@"TI"]||[typeStr hasPrefix:@"Ts"]||[typeStr hasPrefix:@"TS"]||[typeStr hasPrefix:@"T@\"NSNumber\""]||[typeStr hasPrefix:@"TB"]||[typeStr hasPrefix:@"Tq"]||[typeStr hasPrefix:@"TQ"]) {
调试发现IOS下面的BOOL类型对应的前缀是TB,而Mac下面是Tc.导致这个判断失败。因为这个问题比较紧急,如果您看见了,能够邮件大概解释下含义,非常感谢![email protected]
如何做分页查询?用limit
JQFMDB *db = [JQFMDB shareDatabase:Downloaded_DB path:DB_Path];
[db jq_inDatabase:^{
if (![db jq_isExistTable:tablename]) {
[db jq_createTable:tablename dicOrModel:model];
}
else
{
[db jq_alterTable:tablename dicOrModel:model];
}
这样写会报错 alert该加在哪里啊 大神
Unable to find a pod with name, author, summary, or description matching `JQFMDB
我重新创建不同的表的时候数据无法存储 假设原先有个表叫user 我在创建 table这个表的时候table这个表存不进去数据
NSString *where = format?[[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:args]:format;
这句格式化sql语句的时候,会自动加千分位符号
where __NSCFString * @"where userId = '6,613' and dateId = 'a64464a473f1' " 0x00006080002c1810
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.