当前位置: 首页 > 知识库问答 >
问题:

javascript - 纯前端如何实现一个本地数据库来存取数据?

郭鸿信
2023-10-07
自己想做一个纯前端的项目(不会后端开发),有数据的录入和展示分析的功能。用vue开发页面的功能,表单录入数据之后存下来(每天都要去录入),在分析页面显示出来。最后build打包之后将前端代码放到服务器上。一开始想用localStorage存取,但是他是存到浏览器上,换个电脑之前数据就没有了。然后想着js写入txt和读取txt文件的方式来实现一个类似数据库的东西,但好像有兼容性的问题。纯前端有什么更好的方式去实现吗?

共有5个答案

濮阳唯
2023-10-07

使用本地 txt 文件,除了兼容性问题之外,还面临着换电脑的时候需要用户手动迁移文件来迁移其中的数据的问题。
归根结底,只要解决迁移数据的问题,问题就迎刃而解了。
比起迁移文件,用户可能更容易接受另一种方案——让用户复制文本内容,发送给目标电脑,粘贴到指定位置即可:

<template>  <textarea :value="info" ref="textwrap"></textarea>  <button @click="copy">复制文本</button></template><script>  // ...  data: () => ({    info: "这里是需要迁移的数据"  }),  methods: {    copy(){      if(navigator.clipboard){        navigator.clipboard.writeText(this.info);      } else {        const { textwrap } = this.$refs;        textwrap.focus();        document.execCommand("copy");      }    }  }</script>

剪切板在用户友好程度上是远远优于使用文件迁移的,这里甚至帮用户把复制的快捷键都省了,只需要用户自行粘贴就行了。
当然更人性化的设计还是走后端,哪怕用 OSS 。

公西光华
2023-10-07

要实现换电脑还有数据那只可能是服务端进行数据存储,纯前端不可能实现

另外写 txt 的方式也不可能,因为纯前端是没有本地文件读写权限的,而且写 txt 也解决不了换电脑数据还在的问题

也就是说如果需要换电脑后数据依然可用,在没有服务端的情况下是不可能的

如果不拘泥换电脑可用这个需求,只要实现把数据存储在本地(避免清空浏览器缓存导致数据丢失)有两个个变通的方法倒是可以试试:
1、数据还存储在 IndexedDB 中,页面增加一个数据导出功能,每次更新后将数据导出并下载到本地,下次使用前先把本地数据导入到 IndexedDB再进行操作。
2、使用 electron之类的框架将部署到服务器的网页打包成一个本地应用,然后使用 sqlite 数据库将数据存储在本地。

贺懿轩
2023-10-07

既然是本地存储那就意味着存储的内容不能共享,换台电脑就没了那是必然的,要共享只能存在服务器上

法烨华
2023-10-07

没有。

纯前端的方式都是存到浏览器上(localStorage、sessionStorage、indexedDB),换个电脑,换个浏览器,轻混存都会导致数据丢失。

你说的写入txt,它可能是用js代码去写的(node),但他不属于前端

陆飞龙
2023-10-07

纯前端实现一个本地数据库可以使用IndexedDB,这是一个轻量级的数据库,浏览器提供,无需服务器。

以下是如何使用IndexedDB的一个简单例子:

首先,你需要检查浏览器是否支持IndexedDB。如果支持,创建一个新的数据库,并创建一个对象存储空间:

if (window.indexedDB) {    // 创建数据库    let db = new indexedDB.open("myDatabase", 1);    db.onupgradeneeded = function(e) {        let db = e.target.result;        if (!db.objectStoreNames.contains('myStore')) {            db.createObjectStore('myStore');        }    };    db.onsuccess = function(e) {        let db = e.target.result;        let tx = db.transaction('myStore', 'readwrite');        let store = tx.objectStore('myStore');    };}

然后,你可以使用事务(transaction)来对数据进行增删改查。以下是一个增加数据的例子:

let db = null;let tx = null;let store = null;function addData(name, address) {    db = indexedDB.open("myDatabase", 1);    tx = db.transaction('myStore', 'readwrite');    store = tx.objectStore('myStore');    let request = store.put({name: name, address: address});    request.onsuccess = function(e) {       console.log("Data saved");     }; }

删除数据和查询数据也是类似的方法,只需要将put方法替换为delete或者get即可。例如,以下是删除数据的例子:

function deleteData(name) {    db = indexedDB.open("myDatabase", 1);    tx = db.transaction('myStore', 'readwrite');    store = tx.objectStore('myStore');    let request = store['delete'](name);    request.onsuccess = function(e) {       console.log("Data deleted");     }; }

查询数据:

function fetchData() {    db = indexedDB.open("myDatabase", 1);    tx = db.transaction('myStore', 'readonly');    store = tx.objectStore('myStore');    let getRequest = store.get('name');     getRequest.onsuccess = function(e) {       console.log("DataRetrieved:" + e.target.result);     }; }

以上就是使用IndexedDB实现本地数据库的基本操作,当然实际的操作可能会更复杂,你可能需要对错误进行处理,可能需要处理并发问题等等。但基本的思路都是类似的。希望这个答案对你有所帮助。

 类似资料:
  • 本文向大家介绍如何获取当前数据库版本?相关面试题,主要包含被问及如何获取当前数据库版本?时的应答技巧和注意事项,需要的朋友参考一下 使用 select version() 获取当前 MySQL 数据库版本。

  • 问题内容: 我有GAE应用程序,它可以在Google Cloud Datastore中创建一些数据并将一些二进制文件存储到Google Cloud Storage中- 我们将其称为 WebApp 应用 程序 。现在,我在Google计算引擎上运行了另一个应用程序。我们将其称为应用程序 ComputeApp 。 所述 ComputeApp 是后端过程,其处理由创建的数据 Web应用程序 。我之前在此

  • //MySQL,,mysql -v select version(); //Oracle select * from v$version;

  • 我想创建一个食谱网站,在那里你可以添加/修改/删除食谱,每个模型都应该有一个配料的列表,与所需的量的那个配料。 我试图使用这样的dict:,但结果是EF Core并不真正喜欢dicts的思想,所以我试图创建一个“映射器”模型,如下所示: 问题是,它仍然没有真正起作用。我不能添加菜谱,也不能删除,因为它进入了一个永远循环。 你将如何实施它? 谢谢

  • 我正在一个聊天应用程序,其中消息存储在firebase实时数据库。现在,如果我创建一个如下所示的节点(Chats-Better-A-ID和-B-ID是自动生成的聊天室密钥),那么我想知道当用户S在聊天应用程序中打开与用户T聊天时,so数据库将只读取存储在Chats-Better-S-T-ID中的消息,而不会读取其他聊天室消息!?我说的对吗?如果是,那么它会降低定价吗? 或 如果我存储如下所示的数据

  • 因为我对JPA没有太多的经验,所以我想编写一个自动化测试,以确保我的JPA实体正在检索我期望它们检索的记录。我的计划是为我的测试创建一个内存中的H2数据库,并对其进行几个简单的CRUD操作,以确保数据按照我的预期返回。 我不知道如何让Spring Boot创建内存数据库。这是我目前所掌握的,它不起作用。 这是创建JPA存储库的配置。这是正确的应用程序代码,目前正在使用我的实际Oracle数据库。