Unity与JS交互,对IndexedDB数据库进行操作

//新版本的unity提倡使用jslib。下面是旧版本使用记录

//涉及到使用数据库的增删改查:已下是打包完成后放到index.html下的scripts 块当中的

let dbName= '_IndexDB', version = 1
let db
//打开indexDB
function openDB(newStorName,indexOne,indexTwo,newVersion){
    let indexedDB = window.indexedDB

    const request = indexedDB.open(dbName, newVersion)
    db=null;
    request.onsuccess = function(event) {
    db = event.target.result // 数据库对象
    console.log('数据库打开成功')
    SendResultBoolToUnity('true')
    }

    request.onerror = function(event) {
      console.log('数据库打开报错')
      SendResultBoolToUnity('false')
    }

    request.onupgradeneeded = function(event) {
      // 数据库创建或升级的时候会触发
      console.log('onupgradeneeded')
      version = newVersion
      db = event.target.result // 数据库对象
      let objectStore
      if (!db.objectStoreNames.contains(newStorName)) {
      objectStore = db.createObjectStore(newStorName, { keyPath: 'id' }) // 创建表
      objectStore.createIndex(indexOne, indexOne, { unique: false }) // 创建索引 可以让你搜索任意字段
      objectStore.createIndex(indexTwo, indexTwo, { unique: false }) // 创建索引 可以让你搜索任意字段
    }
  }
}

function GetVersion()
{
  try{
    SendResultToUnity(db.version);
  }
  catch(err)
  {
    console.log('获取数据库版本信息错误:'+err)
    SendResultToUnity("1");
  }
}

// 添加数据
function adddata(nowStoreName, data) {
  console.log(data);
  var str= eval("("+data+ ")");          //传入的data是json字符串  需要转换为json对象
  let request = db.transaction([nowStoreName], 'readwrite') // 事务对象 指定表格名称和操作模式("只读"或"读写")
        .objectStore(nowStoreName) // 仓库对象
        .add(str)
  request.onsuccess = function(event) {
  console.log('数据写入成功')
  SendResultBoolToUnity('true')
  }
  request.onerror = function(event) {
    console.log('数据写入失败')
    SendResultBoolToUnity('false')
    throw new Error(event.target.error)
  }
}

//更新数据 json数据
function updateDB( nowStoreName, data) {
    let request = db.transaction([nowStoreName], 'readwrite') // 事务对象
          .objectStore(nowStoreName) // 仓库对象
          .put(data)

    return new Promise((resolve, reject) => {
      request.onsuccess = function(ev) {
        resolve(ev)
        SendResultBoolToUnity('true')
      }

      request.onerror = function(ev) {
         resolve(ev)
        SendResultBoolToUnity('false')
      }
    })
  }

//根据id获取表中的数据
function getDataByKey(nowStoreName, key) {
    let transaction = db.transaction([nowStoreName]) // 事务
    let objectStore = transaction.objectStore(nowStoreName) // 仓库对象
    let request = objectStore.get(key)

    request.onerror = function(event) {
      console.log('事务失败')
    }

    request.onsuccess = function(event) {
      console.log('主键查询结果: ', request.result)

      SendResultToUnity(request.result);
    }
}

//查询表中的所有数据
function cursorGetData(nowStoreName) {
    let list = []
    let store = db.transaction(nowStoreName, 'readwrite') // 事务
        .objectStore(nowStoreName) // 仓库对象

    let request = store.openCursor() // 指针对象
    return new Promise((resolve, reject) => {
        request.onsuccess = function(e) {
          let cursor = e.target.result
          if (cursor) {
          // 必须要检查
          list.push(cursor.value)
          cursor.continue() // 遍历了存储对象中的所有内容
          } else {
            resolve(list)
            console.log(list)
           }
          SendResultToUnity(list);
          }
      request.onerror = function(e) {
        reject(e)
        }
      })

}

//查询数据,根据 属性值,属性
function getDataByIndexAndValue( nowStoreName, indexName, indexValue) {
      let list = []
      let store = db.transaction(nowStoreName, 'readwrite').objectStore(nowStoreName)
      let request = store.index(indexName).openCursor(IDBKeyRange.only(indexValue))
      return new Promise((resolve, reject) => {
        request.onerror = function(e) {
        reject(e)
        }
      request.onsuccess = function(e) {
        let cursor = e.target.result
        if (cursor) {
        list.push(cursor.value)
        cursor.continue() // 遍历了存储对象中的所有内容
        //调用unity当中的方法
        console.log(list)
      }
      SendResultToUnity(list);
      }
    })
}

//查询数据,根据 属性值
function getDataByIndex( nowStoreName, indexName) {
    let list = []
    let store = db.transaction(nowStoreName, 'readwrite').objectStore(nowStoreName)
    let request = store.index(indexName).getAll()
    return new Promise((resolve, reject) => {
      request.onerror = function(e) {
        reject(e)
        console.log('失败');
      }
      request.onsuccess = function(e) {
        console.log(e.target.result)
        SendResultToUnity(e.target.result)
      }
    })
}

//删除数据
function deleteDB(nowStoreName, id) {
  let request = db.transaction([nowStoreName], 'readwrite').objectStore(nowStoreName).delete(id)

  request.onsuccess = function() {
  console.log('数据删除成功')
  SendResultBoolToUnity('true')
  }

  request.onerror = function() {
  console.log('数据删除失败')
  SendResultBoolToUnity('false')
  }
}


//关闭数据库
function closeDB(){
  db.close()
  console.log('数据库关闭');
}

 

//js发送到unity 具体的数据 (字符串)
function SendResultToUnity(data){
unityInstance.SendMessage('GameStart','JsToUnityGetBookInfo',data)
}
//js发送到unity的 true false
function SendResultBoolToUnity(isSuccess){
unityInstance.SendMessage('GameStart','JsToUnityIsSuccess',isSuccess)
}

 

 

///////////

欢迎留言讨论

posted @ 2022-06-29 11:07  H❥嘉  阅读(622)  评论(0)    收藏  举报