Coder Social home page Coder Social logo

jqfmdb's People

Contributors

gaojunquan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

jqfmdb's Issues

dbQueue 如果是自定义路径和文件名的时候这个queue跟设置自定义不一致

  • (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;
    }

连续操作两个不同的表

有一个需求,先更新或删除一个表中的内容,再更新或删除另一个表中的内容,要在异步中处理,我连续调用了两个jq_inDatabase 无法实现, 嵌套的话就崩溃,请问这种情况怎么处理

关于数据迁移

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该加在哪里啊 大神

最好把属性db暴露到头文件当中

我希望可以在项目中继承该类做一些扩展(现有的功能太少了),但又不想修改你的源码,如果把属性db暴露出来后,会比较方便扩展。

能否支持Mac平台

我使用中发现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]

创建新的表

我重新创建不同的表的时候数据无法存储 假设原先有个表叫user 我在创建 table这个表的时候table这个表存不进去数据

model属性中含有数组

我使用了jsonModel,一个model中含有一个数组,数组对象是另外一个model,请问这种情况怎么办

能否让表不能插入同样的数据?

能否设置表的主键?如果主键的值一样的话就插入失败,这样保证唯一性,对吗?不然其中操作失误,就出现查出来多条数据是一样的……

Syntax Error

您好,打扰了!

不知道为什么, 添加数据的时候总是会出现
DB Error: 1 "near ")": syntax error"

以下是我写的code:
[_db jq_createTable:@"predictedValue" dicOrModel:[NSDictionary class]];
[_db jq_insertTable:@"predictedValue" dicOrModel:currentArray];

这是debug的时候显示的currentArray里的东西
image

谢谢帮忙!

新增字段

��想给已存在的表新增字段怎么处理

查询结果为字典时只有一个值

列如
[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];
}
}

添加表失败

我用您的类添加表总是失败DB Query: INSERT INTO yxtable ) values ()

缺少模型属性是NSArry 和 NSDictionary数据类型的情况

源码:
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转化为相应的类型输出

更新数据库无效

我用update方法更新了数据库的一条数据,返回接口是成功了,但是取到的缓存并没有变化

属性错误

在 JQFMDB.m中字符串 属性 dbPath ,应该使用copy吧?你那里写的strong
@Property (nonatomic, strong)NSString *dbPath;

在swift中调用 为什么没有查找的方法

用cocoapods 在swift 项目中导入 JQFMDB , swift 创建的文件

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)!)

}

其中 删除 , 更改,查找 三个方法被swift 遗弃,

请问是否支持 swift?

附上自己的代码!!!

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?

}

楼主发现一个隐藏的bug

NSString *where = format?[[NSString alloc] initWithFormat:format locale:[NSLocale currentLocale] arguments:args]:format;
这句格式化sql语句的时候,会自动加千分位符号
where __NSCFString * @"where userId = '6,613' and dateId = 'a64464a473f1' " 0x00006080002c1810

模型嵌套

大神您好,我看了下您的源码,现在好像不支持模型嵌套对不???

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.