Unity3d 中 将远程 MySQL 数据库转换为本地 Sqlite
1、创建MySQL2Sqlite脚本mysql2sqlite.sh:(代码地址:https://gist.github.com/esperlu/943776)
- #!/bin/sh
- # Converts a mysqldump file into a Sqlite compatible file. It also extracts the MySQL `KEY xxxxx` from the
- # CREATE block and create them in separate commands _after_ all the INSERTs.
- # Awk is choosen because it's fast and portable. You can use gawk, original awk or even the lightning fast mawk.
- # The mysqldump file is traversed only once.
- # Usage: $ ./mysql2sqlite mysqldump-opts db-name | sqlite3 database.sqlite
- # Example: $ ./mysql2sqlite --no-data -u root -pMySecretPassWord myDbase | sqlite3 database.sqlite
- # Thanks to and @artemyk and @gkuenning for their nice tweaks.
- mysqldump --compatible=ansi --skip-extended-insert --compact "$@" | \
- awk '
- BEGIN {
- FS=",$"
- print "PRAGMA synchronous = OFF;"
- print "PRAGMA journal_mode = MEMORY;"
- print "BEGIN TRANSACTION;"
- }
- # CREATE TRIGGER statements have funny commenting. Remember we are in trigger.
- /^\/\*.*CREATE.*TRIGGER/ {
- gsub( /^.*TRIGGER/, "CREATE TRIGGER" )
- inTrigger =
- next
- }
- # The end of CREATE TRIGGER has a stray comment terminator
- /END \*\/;;/ { gsub( /\*\//, "" ); print; inTrigger = 0; next }
- # The rest of triggers just get passed through
- inTrigger != { print; next }
- # Skip other comments
- /^\/\*/ { next }
- # Print all `INSERT` lines. The single quotes are protected by another single quote.
- /INSERT/ {
- gsub( /\\\/, "\047\047" )
- gsub(/\\n/, "\n")
- gsub(/\\r/, "\r")
- gsub(/\\"/, "\"")
- gsub(/\\\\/, "\\")
- gsub(/\\\/, "\032")
- next
- }
- # Print the `CREATE` line as is and capture the table name.
- /^CREATE/ {
- if ( match( $, /\"[^\"]+/ ) ) tableName = substr( $0, RSTART+1, RLENGTH-1 )
- }
- # Replace `FULLTEXT KEY` or any other `XXXXX KEY` except PRIMARY by `KEY`
- /^ [^"]+KEY/ && !/^ PRIMARY KEY/ { gsub( /.+KEY/, " KEY" ) }
- # Get rid of field lengths in KEY lines
- / KEY/ { gsub(/\([-]+\)/, "") }
- # Print all fields definition lines except the `KEY` lines.
- /^ / && !/^( KEY|\);)/ {
- gsub( /AUTO_INCREMENT|auto_increment/, "" )
- gsub( /(CHARACTER SET|character set) [^ ]+ /, "" )
- gsub( /DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP|default current_timestamp on update current_timestamp/, "" )
- gsub( /(COLLATE|collate) [^ ]+ /, "" )
- gsub(/(ENUM|enum)[^)]+\)/, "text ")
- gsub(/(SET|set)\([^)]+\)/, "text ")
- gsub(/UNSIGNED|unsigned/, "")
- if (prev) print prev ","
- prev = $
- }
- # `KEY` lines are extracted from the `CREATE` block and stored in array for later print
- # in a separate `CREATE KEY` command. The index name is prefixed by the table name to
- # avoid a sqlite error for duplicate index name.
- /^( KEY|\);)/ {
- if (prev) print prev
- prev=""
- if ($ == ");"){
- } else {
- if ( match( $, /\"[^"]+/ ) ) indexName = substr( $, RSTART+, RLENGTH- )
- if ( match( $, /\([^()]+/ ) ) indexKey = substr( $, RSTART+, RLENGTH- )
- key[tableName]=key[tableName] "CREATE INDEX \"" tableName "_" indexName "\" ON \"" tableName "\" (" indexKey ");\n"
- }
- }
- # Print all `KEY` creation lines.
- END {
- for (table in key) printf key[table]
- print "END TRANSACTION;"
- }
- '
- exit
2、创建convertDB.sh来调用mysql2sqlite.sh:
- rm -rf sqlite_db_name
- sh mysql2sqlite.sh -umysql_user_name -pmysql_user_pwd -hmysql_host mysql_db_name | sqlite3 sqlite_db_name
- 修改相应的参数:
sqlite_db_name (要转换成的sqlite数据库名称)
- mysql_user_name (mysql用户名称)
- mysql_user_pwd (mysql用户密码)
- mysql_host (mysql服务器ip地址)
- mysql_db_name(要转换的mysql数据库名称)
3、在Unity3d中执行shell脚本(放在Editor文件夹下):
- using UnityEngine;
- using System.Collections;
- using UnityEditor;
- using System.IO;
- using System.Diagnostics;
- public class ChangeDB {
- static string sqliteDBpath = Application.streamingAssetsPath + "/dbFile/";
- static string sqliteDBname = "sqlite_db_name.db";
- [MenuItem("Tools/Mysql to Sqlite")]
- public static void mysqlToSqlite ()
- {
- if(File.Exists(sqliteDBpath)){
- UnityEngine.Debug.Log("delete old sqlite db file...");
- File.Delete(sqliteDBpath+sqliteDBname);
- }
- if(File.Exists(sqliteDBpath+sqliteDBname+".meta")){
- File.Delete(sqliteDBpath+sqliteDBname+".meta");
- }
- //start to convert mysql to sql
- UnityEngine.Debug.Log("start convert...");
- ProcessStartInfo proc = new ProcessStartInfo();
- proc.WorkingDirectory = sqliteDBpath;
- proc.FileName = "sh";
- proc.Arguments = "convertDB.sh";
- proc.UseShellExecute = false;
- proc.Verb = "";
- Process.Start(proc);
- }
- }
4、点击Tools下的 Mysql to Sqlite 就可以转换了
5、注意在iOS下可以将sqlite数据库放在 Application.streamingAssetsPath 目录下直接访问
在Android下访问Application.streamingAssetsPath下的文件必须先调用下面的方法解压一下:
- string sqlitedbPath = Application.streamingAssetsPath + "/dbFile/dbname.db";
- string filepath = Application.persistentDataPath + "/dbname.db";
- IEnumerator LoadSqliteDBForAndroid (string url,string newPath){
- using(WWW www = new WWW(url)){
- yieldreturn www;
- if (www.error != null)
- Debug.LogError("WWW download:" + www.error);
- File.WriteAllBytes(newPath, www.bytes);
- LoadAllResource();
- Debug.Log("android db download finished");
- }
- }
参考资料:
1、https://gist.github.com/esperlu/943776
2、http://docs.unity3d.com/Documentation/ScriptReference/Application-streamingAssetsPath.html
Unity3d 中 将远程 MySQL 数据库转换为本地 Sqlite的更多相关文章
- phpMyAdmin访问远程MySQL数据库的方法
本地phpmyadmin远程连接服务器端MySQL 首先要确定你的mysql远程连接已开启,如果没有开启按照下面的二个方法操作: 方法一:改表法 因为在linux环境下,默认是关闭3306端口远程连接 ...
- Navicat备份远程Oracle数据库到本地
公司的数据库是本地的,我只能在公司连,回家就不能跑项目了,一跑就报SQLException,所以希望可以把数据库复制到我的本地来. 因为一直在用Navicat操作数据库,这里就分享一下用Navicat ...
- MYSQL数据库自动本地/异地双备份/MYSQL增量备份
构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...
- 连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的,
连接远程MySQL数据库项目启动时,不报错但是卡住不继续启动的, 2018-03-12 17:08:52.532DEBUG[localhost-startStop-1]o.s.beans.factor ...
- 【MySql 】is not allowed to connect to this MySql server 无法访问远程MySQL数据库
问题:访问远程MySQL数据库时报错[is not allowed to connect to this MySql server ]不允许访问,因为MySQL默认只有本机localhost能够访问M ...
- centos7--web项目使用远程mysql数据库
07-django项目连接远程mysql数据库 比如电脑a(ip地址为192.168.0.aaa)想要连接访问电脑b(ip地址为192.168.0.bbb)的数据库: 对电脑a(ip地址为192. ...
- 知识点:Navicet Mysql数据库电脑本地备份
Navicet Mysql数据库电脑本地备份 1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击“计划”,再点击“新建批处理作业”. 2.双击上面的可用任务,它就 ...
- nodejs中如何使用mysql数据库[node-mysql翻译]
nodejs中如何使用mysql数据库 db-mysql因为node-waf: not found已经不能使用,可以使用mysql代替. 本文主要是[node-mysql]: https://www. ...
- Navicet Mysql数据库电脑本地备份
Navicet Mysql数据库电脑本地备份 1.打开navicat客户端,连上mysql后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业" ...
随机推荐
- bash shell笔记4 处理用…
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/521448 知 ...
- linux驱动模块编译(初学者)
inux 模块编译步骤(转) 本文将直接了当的带你进入linux的模块编译.当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂.之所以要写这篇文章,主要是因为从书本上学的话,可能要花更 ...
- 解决Maximum execution time of 120 seconds exceeded
在循环开始前加入代码: //设置超时时间 ini_set("max_execution_time",18000); set_time_limit(0); set_time_limi ...
- java基础知识(三)之数组
声明数组: 语法:数据类型[ ] 数组名://例:int[ ] scores; 或者 数据类型 数组名[ ]://例:int scores[ ];分配空间 语法:数组名 = new 数据类型 [ 数 ...
- android 记录所有打开的Activity,退出程序
android 记录所有打开的Activity,退出程序 package com.main.server; import java.util.LinkedList; import java.uti ...
- SpringMVC Controller 介绍(详细深刻)
一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Mo ...
- msql 计算连续签到天数
刚刚写了一个签到计算天数的sql, 记录下来. 思路如下: 获取当前签到的最后时间(今天或昨天), 定义一个变量@i 对签到时间进行天数自减, 然后查询出当前记录签到时间是否与自减后的时间匹配. ...
- ssh时传递环境变量
设置要传递的变量: -o SendEnv=Varname 但是不是每个都能传,受服务器上sshd_config里的下面两个选项的控制: AcceptEnv and PermitUserEnvironm ...
- Vue.js如何搭建本地dev server和json-server 模拟请求服务器
前言:vue-cli(版本更新),由原来的2.8.1升级为2.9.1.主要改变是原来在build文件夹下的dev-server.js删掉了,增加了webpack.dev.conf.js. 所以这次讲的 ...
- 如果你的资源贫乏,那么专注做好一件事将是你的唯一出路(no reading yet)
http://www.jianshu.com/p/8784f0fd7ab8/comments/1161511