返回介绍

开发 SQLite 模块

发布于 2025-04-26 18:09:30 字数 5421 浏览 0 评论 0 收藏

通过前面对 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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。