zepo / gydatacenter Goto Github PK
View Code? Open in Web Editor NEWAn alternative to Core Data for people who like using SQLite directly.
License: MIT License
An alternative to Core Data for people who like using SQLite directly.
License: MIT License
比如我的数据库文件放在Document目录下,我是不是应该制定数据库的具体路径。
请问可以加唯一索引吗?如果可以,怎么加?谢谢
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)
@Zepo
我有一个全国省市地区的数据库,我希望用GYDataCenter来读取里面的数据,应该怎么做呀?
重复save表中会有重复数据,这是为什么
最新的FMDB 2.7.2 已经把FMDBQueue的_queue
和_db
等变量变成私有变量了,FMDatabaseQueue+Async
的编译会报错。
vedon$ pod search GYDataCenter
[!] Unable to find a pod with name, author, summary, or descriptionmatching GYDataCenter
如图中红色圈圈处所示, 假如当我的关系型property命名为 "lastName" 时, "lastName" 直接调用 capitalizedString 方法后变为 "Lastname", 完成set拼接之后, 最后拿到的是 "setLastname:", 而其实我们需要拼接出来的应该是 "setLastName:". 所以当关系型property名不止为一个词时, 就会crash. 当然如果关系型property不用驼峰命名法的话, 不会.....
发现严重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
有个问题咨询一下,FMDB针对每个DB已经有一个queue了,代码中也针对每个DB新建了GYDataContextQueue,这两个queue的区别是什么?
我们的 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];
希望能提供控制相关属性设置项或者配置项
谢谢
请问有什么好的方法吗.
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;
}
按理说肯定会考虑过这个问题,是我的姿势有问题吗?
将现有的core data 迁移到GYDataCenter有没有什么好的建议
`
NSArray *draftArray = [AWEVideoDraftModel objectsWhere:@"WHERE backup = 1 AND step > 0 AND step < 30 ORDER BY saveDate DESC" arguments:nil];
0 | | -[GYDataContext queueForDBName:] + 330
1 | | +[GYModelObject objectsWhere:arguments:] + 120
`
求大佬解答
建议:
GYDataCenter如果要使用就必须继承自GYModelObjcet,如果我这个类也需要继承自其他类怎么办呢?
建议改成Category非侵入式的设计。
GYDataCenter中的类方法和对象方法名称建议添加前缀,比如 gy_。
FMDatabaseQueue+Async.m 分类Category中出现了和FMDatabaseQueue中同名的database方法,建议通过添加前缀的方式修改。
问题:
+ (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:
如果我批量save数据,没有返回值,我怎么知道我最后是成功还是失败。
轻量不入侵工程,支持Migration,支持自增索引,没有所谓的context,直接 save 不需要担心多线程问题
我看了一下源码, 在 - (void)asyncInDatabase:(void (^)(FMDatabase *db))block
这个方法中, 也是使用 FMDatabaseQueue , 但 FMDatabaseQueue 是一个串行的队列, 而且 GYDataContextQueue 中的队列也是一个串行的队列, 如果在同时有很多插入的时候, 查询就要等待插入完成来执行, 我想问一下,在使用查询的时候每次都开个异步线程来保证主线程不被阻塞吗?还是使用其他方法?
比如有一个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
支持像上面这种情况吗? 如果支持的话,我们代码需要怎么写?
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]
}
}`
由于有每秒自动提交事务的存在,如果save完立即去取,取到的数据不是最新的,因为上次的save还没有被commit,这个问题怎么解决。
我看了下 GYDataContext 是单例,然后每个 db 只会有一个对应的 GYDatabaseInfo 实例,这样其实也只会有一个 FMDatabaseQueue 实例。
所以对于一个 db 只会有一个句柄在一段时间内只有一个线程来执行 sql,既然做了这个防护,sqlite 改成 SQLITE_CONFIG_SINGLETHREAD 应该不会有任何问题,还能提高性能。
不知道理解是否有问题
Podfile里最低版本是8.0,能支持7.0吗?
pod ‘GYDataCenter’ 运行报错
FMDatabaseQueue+Async.h分类中 提示 Use of undeclared identifier '_db'和Use of undeclared identifier '_queue'
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有很长一段时间,但偶尔会出现,已经存在的数据库文件会被自动删除。想请教一下,如果字段不符合预设的类型会不会导致文件损坏进而自动删除,或者是否有其他可能的时机导致数据库文件被删除呢?
谢谢
FMDatabaseQueue+Async中的用到 _db 与 _queue 都报Use of undeclared identifier 'xx' 错误
新创建项目导入也是这些错误
你好,我想使用多个字段作为主键,可以吗?
如果 autotransaction 打开,那么就不能及时保存数据。所以可以添加一些新的可以及时保存数据的 api
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.