- 内容简介
- 译者序
- 前言
- 第 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
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论