sqlite 如何向表中添加列?

0yg35tkg  于 2022-11-14  发布在  SQLite
关注(0)|答案(2)|浏览(251)

这个应用程序已经在Google Play上运行了,使用的是“REACT-Native-SQLite-STORAGE”。我想将两列添加到现有的数据库表中,这样应用程序就不会对现有用户崩溃。

w41d8nur

w41d8nur1#

当您将列添加到现有表中时,您将看到如下错误

error: {"message":"no such column: todoStar","code":5} // todoStar is column name

在Error块中,您可以更改表格并添加您的列。确保在错误块中编写代码

if (error.message.indexOf('no such column: todoStar') > -1) {
          dbConnection.transaction(function (tx2) {
            let query = 'ALTER TABLE todos ADD todoStar Int(32);'; // todos is tableName
            tx2.executeSql(
              query,
              '',
              async (tx3) => {
                console.log('new column added');
              },
              (error) => {
                console.error(
                  'error: while adding column' + JSON.stringify(error),
                );
              },
            );
          });
        }
blpfk2vs

blpfk2vs2#

像往常一样,官方文件只包含基本信息,没有太多关于迁移或数据库升级的信息。
经过长时间的研究,我发现SQLite有user_version,可以用来知道用户当前使用的是哪个版本,在此基础上我们可以执行升级查询。
我使用的是expo-sqlite,但下面的解决方案应该也适用于react-native-sqlite-storage
示例:

/** database.tsx **/

export function getUserDBVersion() {
  return new Promise<SQLite.SQLResultSet>((resolve, reject) => {
    database.transaction((tx) => {
      tx.executeSql(
        `PRAGMA user_version`,
        [],
        (_, res) => {
          resolve(res);
        },
        (_, error) => {
          reject(error);
          return true;
        }
      );
    });
  });
}

export function updateUserDBVersion(version: number) {
  return new Promise<SQLite.SQLResultSet>((resolve, reject) => {
    database.transaction((tx) => {
      tx.executeSql(
        `PRAGMA user_version = ?`,
        [version],
        (_, res) => {
          resolve(res);
        },
        (_, error) => {
          reject(error);
          return true;
        }
      );
    });
  });
}
/** App.tsx **/

useEffect(() => {
  getUserDBVersion().then((res) => {
    const user_version = res.rows._array[0].user_version;
    if (user_version < 1) {
      //User has old version
      //(1) Run function to upgrade your database tables
      alterTables().then(() => {
        //(2) Update user_version so that next time you can check if < 2 for new updates
        updateUserVersion(1);
      });
    }
  });
}, []);

我认为这是一种优雅的方式,有两个原因
1.您可以在一个位置更新所有数据库和表
1.在所有迁移完成之前,您可以显示闪屏

*为了可读性,我没有在上面添加错误处理部分
如果不相应更新您的代码,react-native-sqlite-storage的大部分代码将是相同的
上面的代码是类型脚本,如果您使用JSX
,只需删除类型

相关问题