ReactNative 对接SQLite3的通用增删改查工具类以及使用方法

import SQLite from "react-native-sqlite-storage";
import md5 from "../Utils/md5.js";

let db;

// 初始化数据库连接
export function initializeDatabase() {
  db = SQLite.openDatabase({ name: "sbcoin.db", location: "default" }, () => {
    console.log("Database initialized successfully");
  });
}

// 关闭数据库连接
export function closeDatabase() {
  if (db) {
    db.close(() => {
      console.log("Database connection closed");
    });
  }
}

// 根据表名和条件构建 SQL 查询语句
function buildQueryWithParams(tableName, conditions) {
  let query = `SELECT * FROM ${tableName}`;
  const params = [];

  if (conditions && Object.keys(conditions).length > 0) {
    const conditionKeys = Object.keys(conditions);
    const conditionClauses = conditionKeys.map((key) => {
      params.push(conditions[key]); // 将条件值添加到参数数组
      return `${key} = ?`;
    });
    query += " WHERE " + conditionClauses.join(" AND ");
  }

  return { query, params };
}
// 通用的插入或更新数据方法
export function insertOrUpdateData(tableName, data, condition, primaryKey) {
  return new Promise((resolve, reject) => {
    db.transaction((tx) => {
      if (!condition) {
        // 如果没有传入 condition,即新增
        const insertQuery = `INSERT INTO ${tableName} (${Object.keys(data).join(
          ", "
        )}) VALUES (${Object.keys(data).fill("?").join(", ")})`;
        const insertParams = Object.values(data);
        // 执行插入
        tx.executeSql(
          insertQuery,
          insertParams,
          (tx, insertResult) => {
            // 获取插入的行的主键 ID
            const insertedId = insertResult.insertId;
            // 返回插入的行的主键 ID
            resolve(insertedId);
          },
          (error) => {
            reject(error);
          }
        );
      } else {
        // 如果传入了 condition,即更新或插入
        // 构建查询的 SQL 语句
        const selectIdQuery = `SELECT ${primaryKey} FROM ${tableName} WHERE ${condition}`;
        // 查询数据
        tx.executeSql(
          selectIdQuery,
          [],
          (tx, selectIdResult) => {
            const rows = selectIdResult.rows;
            if (rows.length > 0) {
              // 如果查询到数据,执行更新
              const updateQuery = `UPDATE ${tableName} SET ${Object.keys(data)
                .map((key) => `${key} = ?`)
                .join(", ")} WHERE ${condition}`;
              const updateParams = Object.values(data);
              tx.executeSql(
                updateQuery,
                updateParams,
                (tx, updateResult) => {
                  // 如果更新的行数为1,返回更新的行的主键 ID
                  if (updateResult.rowsAffected === 1) {
                    const updatedId = rows.item(0)[primaryKey];
                    resolve(updatedId);
                  } else {
                    // 如果更新的行数不为1,返回更新的行的主键 ID 数组
                    const updatedIds = [];
                    for (let i = 0; i < rows.length; i++) {
                      updatedIds.push(rows.item(i)[primaryKey]);
                    }
                    resolve(updatedIds);
                  }
                },
                (error) => {
                  reject(error);
                }
              );
            } else {
              // 如果没有查询到数据,执行插入
              const insertQuery = `INSERT INTO ${tableName} (${Object.keys(
                data
              ).join(", ")}) VALUES (${Object.keys(data)
                .fill("?")
                .join(", ")})`;
              const insertParams = Object.values(data);
              tx.executeSql(
                insertQuery,
                insertParams,
                (tx, insertResult) => {
                  // 获取插入的行的主键 ID
                  const insertedId = insertResult.insertId;
                  // 返回插入的行的主键 ID
                  resolve(insertedId);
                },
                (error) => {
                  reject(error);
                }
              );
            }
          },
          (error) => {
            reject(error);
          }
        );
      }
    });
  });
}

// 通用的删除数据方法
export function deleteData(tableName, conditions) {
  return new Promise((resolve, reject) => {
    db.transaction((tx) => {
      const conditionKeys = Object.keys(conditions);
      const conditionString = conditionKeys
        .map((key) => `${key} = ?`)
        .join(" AND ");
      const conditionValues = conditionKeys.map((key) => conditions[key]);

      const query = `DELETE FROM ${tableName} WHERE ${conditionString}`;
      debugger;
      tx.executeSql(
        query,
        conditionValues,
        (tx, result) => {
          // 获取受影响的行数
          const rowsAffected = result.rowsAffected || 0;
          resolve(rowsAffected);
        },
        (error) => {
          console.log(`Error deleting data from ${tableName}:`, error);
          reject(error);
        }
      );
    });
  });
}

// 根据表名和条件查询信息
export function getByConditions(tableName, conditions) {
  return new Promise((resolve, reject) => {
    // 构建 SQL 查询语句和参数
    const { query, params } = buildQueryWithParams(tableName, conditions);
    db.transaction((tx) => {
      tx.executeSql(
        query,
        params,
        (tx, result) => {
          const data = [];
          for (let i = 0; i < result.rows.length; i++) {
            data.push(result.rows.item(i));
          }
          resolve(data);
        },
        (error) => {
          reject(error);
        }
      );
    });
  });
}

将这个配置好后,查询的代码如下:

 getByConditions(MatcheckrecordTable, {
//这里是查询的条件,用对象形式
      Inspectbillmain_id: inspectBillMainId,
    })
      .then((mainTableData) => {
        // 遍历主表数据
        // 检查是否有主表数据
        if (mainTableData.length === 0) {
          // 主表没有数据,可以根据需求处理
          console.log("主表没有数据");
          return;
        }
        const promises = mainTableData.map((mainRecord) => {
          // 根据主表记录的matcheckrecord_id去查询子表数据
          return getByConditions(MatcheckrecorditemTable, {
            matcheckrecord_id: mainRecord.matcheckrecord_id,
          })
            .then((itemTableData) => {
              // 将子表数据封装到主表记录中
              mainRecord.components = itemTableData;
              return mainRecord;
            })
            .catch((error) => {
              console.error("Error fetching itemTableData:", error);
              return mainRecord; // 返回主表记录,但没有子表数据
            });
        });

        // 所有的子表查询都完成后更新state
        Promise.all(promises)
          .then((dataList) => {
            this.setState({ dataList });
          })
          .catch((error) => {
            console.error("Error fetching data:", error);
          });
      })
      .catch((error) => {
        console.error("Error fetching data:", error);
      });

以及新增、修改、查询的代码使用案例。

  handleSave = () => {
    const matcheckrecordData = {
      Inspectbillmain_id: receivedData.Inspectbillmain_id,
      sampledate: new Date().toISOString().split("T")[0], // 当前日期
      batchno: this.state.batchNumber,
      status: "已检",
      // 其他默认为空的字段
    };
    // 插入或更新 td_qc_matcheckrecord 表
    insertOrUpdateData(
      MatcheckrecordTable,
      matcheckrecordData,
      `batchno = ${matcheckrecordData.batchno}`,
      "matcheckrecord_id"
    )
      .then((matcheckrecordId) => {
        // 获取返回的 matcheckrecordId
        // 构建要插入到 td_qc_matcheckrecorditem 表的数据
        const matcheckrecorditemData = this.state.components.map(
          (component) => ({
            matcheckrecord_id: matcheckrecordId,
            itemid: component.itemid, // 从数据库中获取的 itemid
            itemname: component.itemname,
            itemvalue: component.value,
            Extend1: component.itemtype, // type 对应的是 Extend1
            // 其他字段根据 component 对象中的值设置
            // 比如其他字段名字和值
          })
        );
        debugger;
        // 删除 td_qc_matcheckrecorditem 表中的数据
        deleteData(MatcheckrecorditemTable, {
          matcheckrecord_id: matcheckrecordId,
        })
          .then(() => {
            // 插入 td_qc_matcheckrecorditem 表
            Promise.all(
              matcheckrecorditemData.map((itemData) =>
                insertOrUpdateData(MatcheckrecorditemTable, itemData)
              )
            )
              .then(() => {
                // 所有插入操作成功后,可以执行一些操作或者导航到其他页面
                console.log("保存成功");
                navigation.goBack();
              })
              .catch((error) => {
                console.error("Error inserting matcheckrecorditem:", error);
              });
          })
          .catch((error) => {
            console.error("Error deleting matcheckrecorditem:", error);
          });
      })
      .catch((error) => {
        console.error("Error inserting or updating matcheckrecord:", error);
      });
  };

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLite3虚表是一种特殊类型的表,它不包含任何实际数据,而是由用户定义的模块或程序生成数据。SQLite3虚表可以用于生成临时数据、复杂查询和数据转换等场景。下面介绍如何使用SQLite3虚表实现自定义增删改查方法。 1. 创建虚表 使用CREATE VIRTUAL TABLE语句创建虚表。例如,创建一个简单的虚表,名为test: ``` CREATE VIRTUAL TABLE test USING whatever_module; ``` 2. 实现虚表模块 虚表需要一个模块或程序来生成数据。模块可以使用C或其他编程语言实现。模块必须实现一些特定的接口函数,例如xCreate、xConnect、xBestIndex、xFilter和xNext等。这些函数的具体实现方式取决于虚表的需求。 下面是一个简单的虚表模块示例,名为example_module。它生成一个包含两列的虚表,第一列包含整数值,第二列包含字符串值。 ```c #include <sqlite3ext.h> SQLITE_EXTENSION_INIT1 static int example_create(sqlite3 *db, void *pAux, int argc, const char *const*argv, sqlite3_vtab **ppVtab, char **pzErr){ // 创建虚表 ... } static int example_connect(sqlite3 *db, void *pAux, int argc, const char *const*argv, sqlite3_vtab **ppVtab, char **pzErr){ // 连接虚表 ... } static int example_best_index(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ // 最佳索引 ... } static int example_filter(sqlite3_vtab_cursor *pVtabCursor, int idxNum, const char *idxStr, int argc, sqlite3_value **argv){ // 过滤器 ... } static int example_next(sqlite3_vtab_cursor *pVtabCursor){ // 下一个结果 ... } static int example_eof(sqlite3_vtab_cursor *pVtabCursor){ // 是否到达结果集末尾 ... } static int example_close(sqlite3_vtab_cursor *pVtabCursor){ // 关闭虚表游标 ... } static int example_open(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ // 打开虚表游标 ... } static sqlite3_module example_module = { // 虚表模块接口函数 ... }; int sqlite3_example_module_init(sqlite3 *db, char **pzErrMsg, const sqlite3_api_routines *pApi){ SQLITE_EXTENSION_INIT2(pApi) return sqlite3_create_module(db, "example_module", &example_module, NULL); } ``` 3. 注册虚表模块 在使用虚表之前,需要先将虚表模块注册到SQLite3中。可以使用sqlite3_create_module函数来注册虚表模块。例如,将上面的example_module模块注册为example_module虚表: ```c sqlite3_example_module_init(db, &zErrMsg, &sqlite3_api); ``` 4. 使用虚表 虚表注册之后,就可以使用它了。例如,使用SELECT语句查询虚表: ```sql SELECT * FROM example_module; ``` 5. 实现自定义增删改查方法 虚表模块可以实现自定义的增删改查方法。例如,实现INSERT方法: ```c static int example_insert(sqlite3_vtab *p, int argc, const char *const*argv, sqlite_int64 *pRowid){ // INSERT方法 ... } static sqlite3_module example_module = { // 虚表模块接口函数,包含example_insert方法 ... }; ``` 这样,就可以使用INSERT语句向虚表中插入数据了: ```sql INSERT INTO example_module (column1, column2) VALUES (1, 'value1'); ``` 类似地,可以实现其他自定义方法,例如UPDATE和DELETE等。 以上就是使用SQLite3虚表实现自定义增删改查方法方法。需要注意的是,虚表模块需要按照SQLite3的要求实现特定的接口函数,并且需要将虚表模块注册到SQLite3中才能使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值