- 内容简介
- 译者序
- 前言
- 第 1 章 安装配置新项目
- 第 2 章 Flexbox 布局介绍
- 第 3 章 用 React Native 开发一个应用
- 第 4 章 在 React Native 中使用导航
- 第 5 章 动画和滑动菜单
- 第 6 章 用 React Native 绘制 Canvas
- 第 7 章 使用 React Native 播放音频
- 第 8 章 你的第一个自定义视图
- 第 9 章 Flux 介绍
- 第 10 章 处理复杂的应用程序状态
- 第 11 章 使用 Node 来实现服务端 API
- 第 12 章 在 React Native 中使用文件上传
- 第 13 章 理解 JavaScript Promise
- 第 14 章 fetch 简介
- 第 15 章 在 iOS 中使用 SQLite
- 第 16 章 集成 Google Admob
- 第 17 章 React Native 组件国际化
- 附录 A React.js 快速介绍
- 附录 B Objective-C Primer
- 附录 C webpack 入门
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
开发 SQLite 模块
通过前面对 SQLite 知识的学习,现在我们可以来实现 React Native iOS 模块了。一个原生模块就是一个实现了 RCTBridgeModule 协议的 Objective-C 类。
// SQLiteManager.h #import "RCTBridgeModule.h" @interface SQLiteManager : NSObject <RCTBridgeModule> @end
除了要实现 RCTBridgeModule 协议外,你的类中还应该包含 RCT_EXPORT_MODULE() 方法。这个方法还有一个可选的参数,通过这个参数可以设置一个模块名称,这样让模块可以在 JavaScript 代码中直接访问。如果你没有设定名称,模块名称会默认使用 Objective-C 的类名称。
// CalendarManager.m @implementation CalendarManager RCT_EXPORT_MODULE(); @end
我们需要在模块中定义三个方法:
- 初始化模块
- 获取数据
- 过滤数据
// SQliteManager.h #import ''RCTBridgeModule.h'' #import <sqlite3.h> @interface SQLiteManager : NSObject<RCTBridgeModule> { sqlite3 *database; } -(NSString *)dataFilePath; @end // SQLiteManager.m #import <sqlite3.h> #import "SQLiteManager.h" @implementation SQLiteManager RCT_EXPORT_MODULE(); -(NSString *)dataFilePath { NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:@"ety .db"]; }
第一部分
RCT_EXPORT_METHOD(fetchDefinition:(NSNumber *)id callback:( RCTResponseSenderBlock)callback){
NSLog(@"%@", @"fetch definition"); if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK){ sqlite3_close(database); NSAssert(0, @"Failed to open database"); } NSString *query = [NSString stringWithFormat:@"SELECT definition FROM ety where Id=%@; ", id]; sqlite3_stmt *statement; if (sqlite3_prepare_v2(database, [query UTF8String], -1, & statement, nil) == SQLITE_OK){ //sqlite3_bind_int(statement, 1, [id intValue]); NSMutableArray *arr = [NSMutableArray array]; while(sqlite3_step(statement) == SQLITE_ROW){ char *definition = (char *)sqlite3_column_text( statement, 0); NSLog(@"%@", [NSString stringWithUTF8String:definition ]); NSString *definitionValue = [[NSString alloc] initWithUTF8String:definition]; [arr addObject:definitionValue]; } callback(@[arr]); sqlite3_finalize(statement); } sqlite3_close(database); }
第二部分
RCT_EXPORT_METHOD(filter:(NSString *)text callback:( RCTResponseSenderBlock)callback){ NSLog(@"%@", @"fetch definition"); if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK){ sqlite3_close(database);
NSAssert(0, @"Failed to open database"); } NSString *query = [NSString stringWithFormat:@"SELECT Id, origin FROM ety where origin like '%%%@%%' LIMIT 30; ", text ]; sqlite3_stmt *statement; if (sqlite3_prepare_v2(database, [query UTF8String], -1, & statement, nil) == SQLITE_OK){ NSMutableArray *arr = [NSMutableArray array]; while(sqlite3_step(statement) == SQLITE_ROW){ int row = sqlite3_column_int(statement, 0); char *rowData = (char *)sqlite3_column_text(statement, 1); NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData]; NSDictionary *dic = @{ @"key": [NSNumber numberWithInt:row ] , @"value" : fieldValue }; [arr addObject:dic]; } callback(@[arr]); sqlite3_finalize(statement); } sqlite3_close(database); }
第三部分
RCT_EXPORT_METHOD(initDatabase:(RCTResponseSenderBlock)callback){ NSString *dbPath = [self dataFilePath]; if (! [[NSFileManager defaultManager] fileExistsAtPath:dbPath])
{ NSString *sourcePath = [[[NSBundle mainBundle] resourcePath ] stringByAppendingPathComponent:@"ety.db"]; NSError *error; if ([[NSFileManager defaultManager] fileExistsAtPath: sourcePath]){ [[NSFileManager defaultManager] copyItemAtPath: sourcePath toPath:dbPath error:&error]; if (error ! = nil){ callback(@[[error localizedDescription], [NSNull null]]); } } } if (sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK){ sqlite3_close(database); NSAssert(0, @"Failed to open database"); } NSString *query = @"SELECT id, origin FROM ety ORDER BY Id LIMIT 30; "; sqlite3_stmt *statement; if (sqlite3_prepare_v2(database, [query UTF8String], -1, & statement, nil) == SQLITE_OK){ NSMutableArray *arr = [NSMutableArray array]; while(sqlite3_step(statement) == SQLITE_ROW){ int row = sqlite3_column_int(statement, 0); char *rowData = (char *)sqlite3_column_text(statement, 1); NSString *fieldValue = [[NSString alloc] initWithUTF8String:rowData]; NSDictionary *dic = @{ @"key": [NSNumber numberWithInt:row ] , @"value" : fieldValue }; [arr addObject:dic]; } callback(@[arr]); sqlite3_finalize(statement); } sqlite3_close(database); } @end
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论