gpt4 book ai didi

javascript - react native : best approach to share a sqlite-instance across all components and actions

转载 作者:IT王子 更新时间:2023-10-29 06:21:37 24 4
gpt4 key购买 nike

故事:

在一个 react-native 应用程序中,我们使用 react-native-sqlite-storage用于在 iOS 和 Android 上处理 sqlite3。

这个插件使我们能够以这种方式处理原生 sqlite 实现:

var db = SQLite.openDatabase("test.db".....);

跨多个组件共享数据库实例的最佳方法是什么?为了提供更多细节,但这不是这个问题的一部分,我们使用 redux 并且有很多 Action 文件。其中一些也需要访问数据库。

为了处理跨所有组件和操作的单个打开的 sqlite 实例,并且为了与 native 组件更松散地耦合,我构建了一个封装存储插件的 DataStorage 类。此类包含 sqlite 数据库的一个实例(使用 react-native-sqlite-storage)并为应用程序提供方便的方法,如“getUserByName()”、“getAllItems”等。

为了避免这个 DataStorage 类及其内部 sqlite-db-instance 的多个实例,我做了以下操作:

  1. 构建数据存储类
  2. 创建一个仅驻留在 DataStorage.js 中的全局变量
  3. 导出函数 sharedDataStorage() 给所有调用者需要数据库访问权限

DataStorage.js代码

const SQLite = require('react-native-sqlite-storage');

const _dataStorage = null;

export class DataStorage {

constructor(autoCheckMigration = true, lang = 'en') {
console.log("DataStorage CTOR called");

if(_dataStorage !== null) {
throw 'There is already an instance of DataStorage alive';
}

// store this instance in a global variable
_dataStorage = this;

this.db = SQLite.openDatabase('myapp.db', '1.0', 'Myapps Database', 5 * 1024 * 1024, this.openCB, this.errorCB);

if (autoCheckMigration) {
this.checkDatabaseMigration(lang);
}
}

many_other_convenience_methods_here(...) {}
}

export function sharedDataStorage() {
return _dataStorage;
}

应用根组件:

在应用程序根组件中,我创建了调用其构造函数的数据库实例。

export default class Application extends React.Component {

constructor(props) {
super(props);

this.setupDatabase();
}

render() {
return (
<Provider store={store}>
<ApplicationContainer />
</Provider>
);
}

setupDatabase() {
this.setState( {dataStorage: new DataStorage()} );
}
}

一些 Action _...js:

所有其他组件和操作文件现在必须以这种方式获得对此 DataStorage-Class 的访问权限:

import { sharedDataStorage } from '../data/dataStorage';

...

async function persistContacts(contacts) {
const dataStorage = sharedDataStorage();

contacts.forEach( (contact) => {
dataStorage.persistContact(contact);
});
}

这种方式工作得很好,虽然我不确定是否有更好的方法在 react-native 中共享数据库连接。

还有哪些其他的可能性?

最佳答案

我是这样解决的:

database.js

'use strict';
import React from 'react';
import SQLite from 'react-native-sqlite-storage';


var database_name = "dbname.db";
var database_version = "1.0";
var database_displayname = "db";
var database_size = 200000;

let conn = SQLite.openDatabase(database_name, database_version, database_displayname, database_size, openDBHandler, errorDBHandler);

class Database {
getConnection() {
return conn;
}
}

module.exports = new Database();

接下来在您的组件中,您可以通过以下方式获取数据库连接:

var connection = Database.getConnection();

关于javascript - react native : best approach to share a sqlite-instance across all components and actions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37342528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com