Giter VIP home page Giter VIP logo

gydatacenter's People

Contributors

zepo 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gydatacenter's Issues

[obj save];报错

for (int i = 0; i < 100; i++) {
User *u = [[User alloc] init];
u.name = [NSString stringWithFormat:@"name%d",i];
u.uid = [NSString stringWithFormat:@"%d",i+10000];
[u save];
}

*** Assertion failure in +[User persistentProperties], /Users/imc/Desktop/1Card1/Pods/GYDataCenter/GYDataCenter/GYModelObject.m:75
2016-07-15 11:05:22.117 1Card1[1318:45981] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Should use method of a subclass.'
*** First throw call stack:
(
0 CoreFoundation 0x0000000106962d85 exceptionPreprocess + 165
1 libobjc.A.dylib 0x00000001063d6deb objc_exception_throw + 48
2 CoreFoundation 0x0000000106962bea +[NSException raise:format:arguments:] + 106
3 Foundation 0x0000000106020d5a -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198
4 GYDataCenter 0x0000000105f3e6aa +[GYModelObject persistentProperties] + 234
5 GYDataCenter 0x0000000105f3d5a4 +[GYDCUtilities persistentPropertiesForClass:] + 36
6 GYDataCenter 0x0000000105f3e754 +[GYModelObject propertyTypes] + 116
7 GYDataCenter 0x0000000105f3f9a5 +[GYModelObject relationshipGetterNames] + 165
8 GYDataCenter 0x0000000105f3f22b +[GYModelObject resolveInstanceMethod:] + 59
9 libobjc.A.dylib 0x00000001063d5a95 _ZL28_class_resolveInstanceMethodP10objc_classP13objc_selectorP11objc_object + 80
10 libobjc.A.dylib 0x00000001063ddd7e lookUpImpOrForward + 361
11 libobjc.A.dylib 0x00000001063ddb8f class_getInstanceMethod + 52
12 Foundation 0x0000000105f86fd6 NSKeyValueMethodForPattern + 139
13 Foundation 0x0000000105f86de1 +[NSObject(NSKeyValueCodingPrivate) _createValueSetterWithContainerClassID:key:] + 211
14 Foundation 0x0000000105fa115f -[NSObject(NSKeyValueCoding) setValue:forKey:] + 228
15 GYDataCenter 0x0000000105f2adff __28-[GYDataContext saveObject:]_block_invoke + 159
16 libdispatch.dylib 0x00000001095a43eb _dispatch_client_callout + 8
17 libdispatch.dylib 0x0000000109588ef5 _dispatch_barrier_sync_f_invoke + 393
18 GYDataCenter 0x0000000105f278d7 -[GYDataContextQueue dispatchSync:] + 119
19 GYDataCenter 0x0000000105f2acd6 -[GYDataContext saveObject:] + 662
20 GYDataCenter 0x0000000105f404b3 -[GYModelObject save] + 99
21 1Card1 0x0000000105dd5a22 -[ViewController viewDidLoad] + 258
22 UIKit 0x0000000106eb3984 -[UIViewController loadViewIfRequired] + 1198
23 UIKit 0x0000000106ef7fae -[UINavigationController _layoutViewController:] + 54
24 UIKit 0x0000000106ef8882 -[UINavigationController _updateScrollViewFromViewController:toViewController:] + 462
25 UIKit 0x0000000106ef89f4 -[UINavigationController _startTransition:fromViewController:toViewController:] + 126
26 UIKit 0x0000000106ef9c4d -[UINavigationController _startDeferredTransitionIfNeeded:] + 890
27 UIKit 0x0000000106efad0b -[UINavigationController __viewWillLayoutSubviews] + 57
28 UIKit 0x00000001070a9503 -[UILayoutContainerView layoutSubviews] + 248
29 UIKit 0x0000000106dd3980 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703
30 QuartzCore 0x000000010bb42c00 -[CALayer layoutSublayers] + 146
31 QuartzCore 0x000000010bb3708e _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366
32 QuartzCore 0x000000010bb36f0c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24
33 QuartzCore 0x000000010bb2b3c9 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
34 QuartzCore 0x000000010bb59086 _ZN2CA11Transaction6commitEv + 486
35 QuartzCore 0x000000010bb597f8 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
36 CoreFoundation 0x0000000106887c37 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION
+ 23
37 CoreFoundation 0x0000000106887ba7 __CFRunLoopDoObservers + 391
38 CoreFoundation 0x000000010687d11c CFRunLoopRunSpecific + 524
39 UIKit 0x0000000106d13f21 -[UIApplication _run] + 402
40 UIKit 0x0000000106d18f09 UIApplicationMain + 171
41 1Card1 0x0000000105dd82cf main + 111
42 libdyld.dylib 0x00000001095d892d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

抱歉有点强迫症,有救么?

ld: warning: instance method 'database' in category from /Library/Developer/Xcode/DerivedData/icontact-aaqiyiofyjjlraexfloadxrbitdf/Build/Products/Debug-iphoneos/libGYDataCenter.a(FMDatabaseQueue+Async.o) overrides method from class in /Library/Developer/Xcode/DerivedData/icontact-aaqiyiofyjjlraexfloadxrbitdf/Build/Products/Debug-iphoneos/libFMDB.a(FMDatabaseQueue.o)

objectsWhere 崩溃了,求看!

NSArray *objects = [KSDownloadAblumModel objectsWhere:@"WHERE userId = ? AND ablumid = ? ORDER BY ablumid ASC" arguments:@[ [self currentLoginUserId], albumid]];

根据bugly的日志,使用查询语句的时候崩溃了,并且已经对arguments做了判空处理。希望大佬在百忙之中帮我看看。

default

不兼容新版FMDB

最新的FMDB 2.7.2 已经把FMDBQueue的_queue_db等变量变成私有变量了,FMDatabaseQueue+Async的编译会报错。

Can not find pod

vedon$ pod search GYDataCenter
[!] Unable to find a pod with name, author, summary, or descriptionmatching GYDataCenter

在使用关系型 property时发现了一个bug

2018-01-10 3 21 05

对于关系型 property,需要在实现里定义为 dynamic. 这样的话编译器就不会自动生成实例变量以及存取方法了.我看源码里面是在运行期做的相关处理.

如图中红色圈圈处所示, 假如当我的关系型property命名为 "lastName" 时, "lastName" 直接调用 capitalizedString 方法后变为 "Lastname", 完成set拼接之后, 最后拿到的是 "setLastname:", 而其实我们需要拼接出来的应该是 "setLastName:". 所以当关系型property名不止为一个词时, 就会crash. 当然如果关系型property不用驼峰命名法的话, 不会.....

修改方案啦~
2018-01-10 6 10 42

发现严重bug

发现严重bug:
比如我存一个对象person, 主键是Id ,

第1次save:
Person *p = [Person new];
p.Id = 1;
[p save];

Person *ppp = (Person *)[Person objectForId:@1];
NSLog(@"%@", ppp);

第2次save:
Person *p = [Person new];
p.Id = 2;
[p save];

Person *ppp = (Person *)[Person objectForId:@2];
NSLog(@"%@", ppp);

第3次save:
Person *p = [Person new];
p.Id = 3;
[p save];

Person *ppp = (Person *)[Person objectForId:@3];
NSLog(@"%@", ppp);

最后:
Person *ppp = (Person *)[Person objectForId:@1];
NSLog(@"%@", ppp);

Person *ppp = (Person *)[Person objectForId:@2];
NSLog(@"%@", ppp);

发现取出的ppp == nil, 不是必现的bug

两个Queue的区别?

有个问题咨询一下,FMDB针对每个DB已经有一个queue了,代码中也针对每个DB新建了GYDataContextQueue,这两个queue的区别是什么?

关于 Data Protection 开启时候读取 db 的问题

我们的 App 中开启了 Data Protection,在机器有设置密码,并且锁屏状态下点击消息推送唤醒 App 时会出现读取 db 为空的问题,原因是 Data Protection 模式下唤醒读取 db 会出现访问被拒绝,参考链接,我们暂时的临时方案是在初始化时设置 flag

databaseInfo.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:[self pathForDbName:dbName] flags:SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_FILEPROTECTION_NONE];

希望能提供控制相关属性设置项或者配置项

谢谢

[cache setValue:value forKey:[propertyClass primaryKey]] value 为nil 崩溃问题

NSDate *date = [NSDate date];
    Employee *employee = [[Employee alloc] initWithId:2
                                                 name:@"New Emp2"
                                          dateOfBirth:date
                                           department:nil];
    [employee save];

像例子那样,存的 department 为 nil,之后取出来会在 300 行处崩溃:

//GYDBRunner.m
if (propertyClass && value) {   //这边加个判断才行
        id cache = [_cacheDelegate objectOfClass:propertyClass id:value];
        if (!cache) {
            cache = [[(Class)propertyClass alloc] init];
            **[cache setValue:value forKey:[propertyClass primaryKey]];**
            [cache setValue:@YES forKey:@"fault"];
            [_cacheDelegate cacheObject:cache];
        }
        value = cache;
    }

按理说肯定会考虑过这个问题,是我的姿势有问题吗?

objectsWhere crash

`

NSArray *draftArray = [AWEVideoDraftModel objectsWhere:@"WHERE backup = 1 AND step > 0 AND step < 30 ORDER BY saveDate DESC" arguments:nil];  

#0Crashed: com.apple.main-threadEXC_BAD_INSTRUCTION 0x0000000000000000 Raw Text

0 | | -[GYDataContext queueForDBName:] + 330
1 | |  +[GYModelObject objectsWhere:arguments:] + 120

`

求大佬解答

提几个建议和问题

建议:

  1. GYDataCenter如果要使用就必须继承自GYModelObjcet,如果我这个类也需要继承自其他类怎么办呢?
    建议改成Category非侵入式的设计。

  2. GYDataCenter中的类方法和对象方法名称建议添加前缀,比如 gy_。

  3. FMDatabaseQueue+Async.m 分类Category中出现了和FMDatabaseQueue中同名的database方法,建议通过添加前缀的方式修改。

问题:

  1. 在 GYModelObject.m 文件中的 #pragma mark - Dynamic Accessers 部分是做什么的,还用到了动态增加方法,麻烦解释一下

relationshipSetterNames中capitalizedString的使用问题

+ (NSDictionary *)relationshipSetterNames {
...
            if (type == GYPropertyTypeRelationship) {
                [(NSMutableDictionary *)result setObject:property forKey:[NSString stringWithFormat:@"set%@:", [property capitalizedString]]];
            }
...
}

[property capitalizedString]这句有问题,会把第一个字母转为大写其余字母转为小写,比如‘originalData’这样的属性转成了‘Originaldata’,导致[[self relationshipSetterNames] objectForKey:NSStringFromSelector(aSEL)]时找不到,aSEL是setOriginalData:

大量数据插入的时候, 查询会被阻塞

我看了一下源码, 在 - (void)asyncInDatabase:(void (^)(FMDatabase *db))block 这个方法中, 也是使用 FMDatabaseQueue , 但 FMDatabaseQueue 是一个串行的队列, 而且 GYDataContextQueue 中的队列也是一个串行的队列, 如果在同时有很多插入的时候, 查询就要等待插入完成来执行, 我想问一下,在使用查询的时候每次都开个异步线程来保证主线程不被阻塞吗?还是使用其他方法?

GYDataCenterTest.zip

属性可以支持数组吗?

比如有一个Person类,一个Person可以有多条Dog:

@interface Person : GYModelObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSArray<Dog*> *dogs;

@end

@interface Dog : GYModelObject

@property (nonatomic, strong) NSString *name;

@end

支持像上面这种情况吗? 如果支持的话,我们代码需要怎么写?

Swift,每次都会 create table,但是压根就没有成功。没有出 error

2018-09-28 11:23:18.983708+0800 Dictation[9933:2411022] DB Log: Create table 'Tag' for database Dictation.

`class Tag: GYModelObject {
@objc dynamic var name: String = ""

override class func dbName() -> String {
	return "Dictation"
}

override class func tableName() -> String {
	return "Tag"
}

override class func primaryKey() -> String {
	return "name"
}

override class func indices() -> [Any]! {
	return [["name"]]
}

override class func persistentProperties() -> [Any] {
	return ["name"]
}

public required convenience init(name: String) {
	self.init()
	self.name = name
}

class func getAllDTags() -> [Dictation] {
	return Tag.objectsWhere("ORDER BY name", arguments: nil) as! [Dictation]
}

}`

[obj save]

由于有每秒自动提交事务的存在,如果save完立即去取,取到的数据不是最新的,因为上次的save还没有被commit,这个问题怎么解决。

感觉 sqlite 改为 SQLITE_CONFIG_SINGLETHREAD 模式也不会有问题,还可以提高性能

我看了下 GYDataContext 是单例,然后每个 db 只会有一个对应的 GYDatabaseInfo 实例,这样其实也只会有一个 FMDatabaseQueue 实例。
所以对于一个 db 只会有一个句柄在一段时间内只有一个线程来执行 sql,既然做了这个防护,sqlite 改成 SQLITE_CONFIG_SINGLETHREAD 应该不会有任何问题,还能提高性能。
不知道理解是否有问题

[cache setValue:value forKey:[propertyClass primaryKey]] value 为 nil 崩溃问题

NSDate *date = [NSDate date];
    Employee *employee = [[Employee alloc] initWithId:2
                                                 name:@"New Emp2"
                                          dateOfBirth:date
                                           department:nil];
    [employee save];

像例子那样,存的 department 为 nil,之后取出来会在 300 行处崩溃:

//GYDBRunner.m
if (propertyClass && value) {   //这边加个判断才行
        id cache = [_cacheDelegate objectOfClass:propertyClass id:value];
        if (!cache) {
            cache = [[(Class)propertyClass alloc] init];
            **[cache setValue:value forKey:[propertyClass primaryKey]];**
            [cache setValue:@YES forKey:@"fault"];
            [_cacheDelegate cacheObject:cache];
        }
        value = cache;
    }

按理说肯定会考虑过这个问题,是我的姿势有问题吗?

数据库中的表是什么时候建立的?

作者你好,我现在有个问题:
我在APP打开时会判断有没有网,如果没网就会去数据库读取缓存。现在的问题是,当我APP第一打开时,此时恰好没网,然后app会去数据库读某个表的值,这个表是不是还没建立。
我现在按照上面的逻辑走会出现crash,我不知道怎么解决,猜测是不是向一个没建立的表里面读取了值。
因为没有抛出错误信息,错误堆栈的最上层为GYReflection这个类中
+ (NSString *)propertyTypeOfClass:(Class)classType propertyName:(NSString *)propertyName {
里面的
NSString *attributes = [NSString stringWithCString:property_getAttributes(property) encoding:NSUTF8StringEncoding];这句代码。
希望得到解答。谢谢了!

数据库文件偶现自动被删除

作者,你好:

我在项目中使用GYDataCenter有很长一段时间,但偶尔会出现,已经存在的数据库文件会被自动删除。想请教一下,如果字段不符合预设的类型会不会导致文件损坏进而自动删除,或者是否有其他可能的时机导致数据库文件被删除呢?

谢谢

应用被挂掉及时保存数据

如果 autotransaction 打开,那么就不能及时保存数据。所以可以添加一些新的可以及时保存数据的 api

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.