Vue 3 + Capacitor 使用jeep-sqlite,web端使用本地sqlite数据库

1.用途,前端浏览器调用数据库,或者要做安卓打包但是懒得总是真机调试数据库

2.下载包,目前使用的是2.8.0版本

复制代码
npm install jeep-sqlite

3.在node_modules中找到这个包,将其整体复制到public文件夹下的assets中,

4.打开该包的readme有如下解释意思是出现x is not a function报错就找到node_modules中的node_modules/sql.js/dist/sql-wasm.wasm的wasm文件也复制到public文件夹下的assets中,

```

I am getting the following error in console in ionic Application.

Error: Uncaught (in promise): TypeError: x is not a function

TypeError: x is not a function

at x (jeep-sqlite.entry.js:2648:80)

at f.onRuntimeInitialized (jeep-sqlite.entry.js:2555:318)

...

```

means that you have to copy the sql-wasm.wasm from node_modules/sql.js/dist/sql-wasm.wasm to your application assets directory

!!!!!!!!!!!!!!!!!!!!!!!!!!

5.设置index.html中给jeep-sqlite引入的model的结点

复制代码
<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="UTF-8">
    <link rel="icon" href="/favicon.ico">
    <meta
    http-equiv="Content-Security-Policy"
    content="default-src 'self' 'unsafe-inline' 'unsafe-eval' blob: data: file: app:;
             img-src 'self' data: blob: file: app: http: https:;
             style-src 'self' 'unsafe-inline';
             script-src 'self' 'unsafe-eval' 'unsafe-inline' ;
            script-src-elem 'self' 'unsafe-eval' 'unsafe-inline' https://fastly.jsdelivr.net;
             connect-src 'self' ws: wss: http: https:;
             font-src 'self' data:;
             media-src 'self' data: blob:;"
  />
    <title>Vite App</title>
  </head>
  <body>
    <div id="app"></div>
      <!-- 先加载本地 jeep-sqlite,再加载主应用 -->
      <jeep-sqlite autoSave="true" ></jeep-sqlite>
      <!-- <script src='/node_modules/jeep-sqlite/dist/jeep-sqlite/jeep-sqlite.esm.js'></script> -->
      <script type="module" src="/public/assets/jeep-sqlite/dist/jeep-sqlite/jeep-sqlite.esm.js"></script>
    <script type="module" src="/src/main.js"></script>
  </body>
</html>

6.main.js配置

主要为

复制代码
import 'jeep-sqlite';

import './assets/main.css'

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'


import {capacitorAPI} from './server/db/capacitorAPI.js';
import dbManager from './server/db/db.js';
// import '@/assets/styles/main.css';
//引入
import 'jeep-sqlite';

const app = createApp(App)
const pinia = createPinia()
app.use(pinia)
app.use(router)
 
;


(async () => {
    try {
     
      // if(!isElectron()){
    //进入initialize方法该方法使用了jeepsqlite
   await dbManager.initialize();

      window.capacitorAPI = capacitorAPI;
      // }
     
      app.mount('#app');
    //    setRoot()
      console.log("app已经化")
    } catch (error) {
      console.error('应用启动失败:', error);
     
      document.body.innerHTML = `<h1>应用初始化失败</h1>`;
    }
  
  })();

7.使用,配套了Capacitor社区对sqlite的支持

复制代码
import { Capacitor } from '@capacitor/core';
import { CapacitorSQLite, SQLiteConnection } from '@capacitor-community/sqlite';
const DB_NAME = 'clothes.db';
class DatabaseManager {
  constructor() {
    this.sqlite = new SQLiteConnection(CapacitorSQLite);
    this.connection = null;      // 插件连接对象
    this.db = null;              // 实际数据库操作对象
    this.repositories = {};
    this.initialized = false;
  }
  // 异步初始化数据库
  async initialize() {
    if (this.initialized) return;
//获取当前环境是桌面端,安卓端,或是web
const platform = Capacitor.getPlatform();

    try {

         if (platform === 'web') {
          //如果是web那么使用jeepsqlite,如果前面没有复制不会报错,但是一直await会白屏
      await customElements.whenDefined('jeep-sqlite');
  
      let jeepSqliteEl = document.querySelector('jeep-sqlite');
    
      if (!jeepSqliteEl) {
        jeepSqliteEl = document.createElement('jeep-sqlite');
        document.body.appendChild(jeepSqliteEl);

      } else {

      }
      await this.sqlite.initWebStore();
 
    }


//一些数据库操作略


      // 1. 创建数据库连接
      await this.sqlite.createConnection(DB_NAME, false, 'no-encryption', 1);
      this.connection = await this.sqlite.retrieveConnection(DB_NAME);
      this.db = this.connection; // 便于使用


      // 2. 打开数据库
      await this.db.open();

      // 3. 启用外键约束(如果需要)
      await this.db.execute('PRAGMA foreign_keys = ON;');

      // 4. 创建表结构
      await this.createTables();

      // 5. 初始化默认分组
      await this.initDefaultGroups();

      // 6. 初始化 Repositories(此时 db 已就绪)
      this.initRepositories();
  
      this.initialized = true;
 
    } catch (error) {
      console.error('数据库初始化失败:', error);
      throw error;
    }
  }
}
const dbManager = new DatabaseManager();
export default dbManager;
相关推荐
lichenyang4531 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen1 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒1 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端
暴走的小呆2 小时前
Vue 2 中 Object 的变化侦测:从 getter/setter 到 Dep、Watcher、Observer
vue.js
GBASE2 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
奇奇怪怪的2 小时前
Embedding 模型 10+ 横向评测
前端
陈广亮2 小时前
Monorepo 从 0 到 1 实操指南 2026 版:pnpm catalogs + Turborepo 2.x + changesets 全链路
前端
子兮曰2 小时前
OpenMontage 深度解剖:你的 AI 编程助手,其实是个视频工作室
前端·后端·ai编程
敲代码的鱼2 小时前
PDF 预览与签名批注写回 支持安卓 iOS 鸿蒙 UTS插件
android·前端·ios
英勇无比的消炎药2 小时前
TinyVue v-auto-tip: 文本超长自动提示的优雅方案
vue.js