Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/li6185377/LKDBHelper-SQLite-ORM

全自动的插入,查询,更新,删除, an automatic database operation thread-safe and not afraid of recursive deadlock
https://github.com/li6185377/LKDBHelper-SQLite-ORM

Last synced: 3 months ago
JSON representation

全自动的插入,查询,更新,删除, an automatic database operation thread-safe and not afraid of recursive deadlock

Awesome Lists containing this project

README

        

LKDBHelper
====================================
this is sqlite ORM (an automatic database operation)

thread-safe and not afraid of recursive deadlock

简书:不定时更新 [http://www.jianshu.com/users/376b950a20ec](http://www.jianshu.com/users/376b950a20ec/latest_articles)

# Big Upgrade 2.0

Supported __NSArray__,__NSDictionary__, __ModelClass__, __NSNumber__, __NSString__, __NSDate__, __NSData__, __UIColor__, __UIImage__, __CGRect__, __CGPoint__, __CGSize__, __NSRange__, __int__,__char__,__float__, __double__, __long__.. attribute to insert and select automation.

全面支持 __NSArray__,__NSDictionary__, __ModelClass__, __NSNumber__, __NSString__, __NSDate__, __NSData__, __UIColor__, __UIImage__, __CGRect__, __CGPoint__, __CGSize__, __NSRange__, __int__,__char__,__float__, __double__, __long__.. 等属性的自动化操作(插入和查询)

------------------------------------

Requirements
====================================

* iOS 4.3+
* ARC only
* FMDB(https://github.com/ccgus/fmdb)

## Adding to your project

If you are using CocoaPods, then, just add this line to your Podfile

```objective-c
pod 'LKDBHelper'
```

If you are using encryption, Order can not be wrong

```objective-c
pod 'FMDB/SQLCipher'
pod 'LKDBHelper'
```

@property(strong,nonatomic)NSString* encryptionKey;

## Basic usage

1. Create a new Objective-C class for your data model

```objective-c
@interface LKTest : NSObject
@property (nonatomic, copy) NSURL *url;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, assign) BOOL isGirl;

@property (nonatomic, strong) LKTestForeign *address;
@property (nonatomic, strong) NSArray *blah;
@property (nonatomic, strong) NSDictionary *hoho;

@property (nonatomic, assign) char like;
...
```
2. in the *.m file, overwirte getTableName function (option)

```objective-c
+ (NSString *)getTableName {
return @"LKTestTable";
}
```
3. in the *.m file, overwirte callback function (option)

```objective-c
@interface NSObject (LKDBHelper_Delegate)

+ (void)dbDidCreateTable:(LKDBHelper *)helper tableName:(NSString *)tableName;
+ (void)dbDidAlterTable:(LKDBHelper *)helper tableName:(NSString *)tableName addColumns:(NSArray *)columns;

+ (BOOL)dbWillInsert:(NSObject *)entity;
+ (void)dbDidInserted:(NSObject *)entity result:(BOOL)result;

+ (BOOL)dbWillUpdate:(NSObject *)entity;
+ (void)dbDidUpdated:(NSObject *)entity result:(BOOL)result;

+ (BOOL)dbWillDelete:(NSObject *)entity;
+ (void)dbDidDeleted:(NSObject *)entity result:(BOOL)result;

///data read finish
+ (void)dbDidSeleted:(NSObject *)entity;

@end

```
4. Initialize your model with data and insert to database

```objective-c
LKTestForeign *foreign = [[LKTestForeign alloc] init];
foreign.address = @":asdasdasdsadasdsdas";
foreign.postcode = 123341;
foreign.addid = 213214;

//插入数据 insert table row
LKTest *test = [[LKTest alloc] init];
test.name = @"zhan san";
test.age = 16;

//外键 foreign key
test.address = foreign;
test.blah = @[@"1", @"2", @"3"];
test.blah = @[@"0", @[@1] ,@{ @"2" : @2 }, foreign];
test.hoho = @{@"array" : test.blah, @"foreign" : foreign, @"normal" : @123456, @"date" : [NSDate date]};

//同步 插入第一条 数据 Insert the first
[test saveToDB];
//or
//[globalHelper insertToDB:test];

```
5. select 、 delete 、 update 、 isExists 、 rowCount ...

```objective-c
select:

NSMutableArray *array = [LKTest searchWithWhere:nil orderBy:nil offset:0 count:100];
for (id obj in array) {
addText(@"%@",[obj printAllPropertys]);
}

delete:

[LKTest deleteToDB:test];

update:

test.name = "rename";
[LKTest updateToDB:test where:nil];

isExists:

[LKTest isExistsWithModel:test];

rowCount:

[LKTest rowCountWithWhere:nil];


```
6. Description of parameters "where"

```objective-c
For example:
single: @"rowid = 1" or @{ @"rowid" : @1 }

more: @"rowid = 1 and sex = 0" or @{ @"rowid" : @1, @"sex" : @0 }

when where is "or" type , such as @"rowid = 1 or sex = 0"
you only use NSString

array: @"rowid in (1,2,3)" or @{ @"rowid" : @[@1, @2, @3] }

composite: @"rowid in (1,2,3) and sex=0 " or @{ @"rowid" : @[@1, @2, @3], @"sex" : @0}

If you want to be judged , only use NSString
For example: @"date >= '2013-04-01 00:00:00'"
```

## table mapping

overwirte getTableMapping Function (option)

```objective-c
//手动or自动 绑定sql列
+ (NSDictionary *)getTableMapping {
return @{ @"name" : LKSQL_Mapping_Inherit,
@"MyAge" : @"age",
@"img" : LKSQL_Mapping_Inherit,
@"MyDate" : @"date",

// version 2 after add
@"color" : LKSQL_Mapping_Inherit,

//version 3 after add
@"address" : LKSQL_Mapping_UserCalculate,
@"error" : LKSQL_Mapping_Inherit
};
}
```

## table update (option)

```objective-c
// 表结构更新回调
+ (void)dbDidAlterTable:(LKDBHelper *)helper tableName:(NSString *)tableName addColumns:(NSArray *)columns {
for (int i = 0; i < columns.count; i++) {
LKDBProperty *p = [columns objectAtIndex:i];
if ([p.propertyName isEqualToString:@"error"]) {
[helper executeDB:^(FMDatabase *db) {
NSString *sql = [NSString stringWithFormat:@"update %@ set error = name", tableName];
[db executeUpdate:sql];
}];
}
}
LKErrorLog(@"your know %@", columns);
}
```
## set column attribute (option)

```objective-c
// 定制化列属性
+ (void)columnAttributeWithProperty:(LKDBProperty *)property {
if ([property.sqlColumnName isEqualToString:@"MyAge"]) {
property.defaultValue = @"15";
} else if ([property.propertyName isEqualToString:@"date"]) {
// if you use unique,this property will also become the primary key
// property.isUnique = YES;
property.checkValue = @"MyDate > '2000-01-01 00:00:00'";
property.length = 30;
}
}
```

## demo screenshot
![demo screenshot](https://github.com/li6185377/LKDBHelper-SQLite-ORM/raw/master/screenshot/Snip20130620_8.png)

table test data

![](https://github.com/li6185377/LKDBHelper-SQLite-ORM/raw/master/screenshot/Snip20130620_6.png)

foreign key data

![](https://github.com/li6185377/LKDBHelper-SQLite-ORM/raw/master/screenshot/Snip20130620_7.png)

----------
# Use in swift

Remember to override the class function `getTableName` for model.

Change-log
==========

**Version 1.1** @ 2012-6-20

- automatic table mapping
- support optional columns
- support column attribute settings
- you can return column content

**Version 1.0** @ 2013-5-19

- overwrite and rename LKDBHelper
- property type support: UIColor,NSDate,UIImage,NSData,CGRect,CGSize,CGPoint,int,float,double,NSString,short,char,bool,NSInterger..
- fix a recursive deadlock.
- rewrite the asynchronous operation -
- thread-safe
- various bug modified optimize cache to improve performance
- test and demos
- bug fixes, speed improvements

**Version 0.0.1** @ 2012-10-1

- Initial release with LKDAOBase

-------

License
=======

This code is distributed under the terms and conditions of the MIT license.

-------

Contribution guidelines
=======

* if you are fixing a bug you discovered, please add also a unit test so I know how exactly to reproduce the bug before merging

-------

Contributors
=======

Author: Jianghuai Li

Contributors: waiting for you to join