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后,双击左边你想要备份的数据库.点击"计划",再点击"新建批处理作业" ...
随机推荐
- fatal error C1083: 无法打开包括文件:“qedit.h”: No such file or directory
VS2010编译 DirectShow一些项目时遇到 错误:fatal error C1083: 无法打开包括文件:“qedit.h”: No such file or directory 解决方法: ...
- 负载均衡LVS之DR(附:NFS共享存储) 五分钟搭建手册
一:DR-模式 调度器Ip:192.168.1.254 服务器ip:192.168.1.1/192.168.1.2 VIP:192.168.1.10 ——配置负载均衡调度器: 关闭重定向响应配置: V ...
- 【转】VS 安全开发生命周期(SDL)检查
前面在学习使用google的protobuf时在VS2012中一直无法编译编译通过,经过查找一些资料原来发现,并不是protobuf的问题,而是自己在使用VS2012时,没有完全了解VS2012的强大 ...
- 分析比较多表查询中的IN与JOIN
IN 是子查询的关键字,JOIN 是连接的关键字,项目开发中经常会使用到多表查询,而子查询与连接正是实现多表查询的重要途径.那两者是怎么运行的?IN与JOIN哪个更好?下面就来分析与比较. 现在有te ...
- SkyBox
[SkyBox] Skyboxes 本质是一个Material,这个Meterial的shader必须设置为ShaderFX/Skybox. SkyBox可以被绑定到摄像机或设置一个全局的SkyBox ...
- ESP8266-iot-2
1.SDK概述 复制相关的工程文件到HelloWorld里面 要在版本esp8266_nonos_sdk_v2.0.0_16_07_19上面开发,那么就要复制相应文件 然后打开IDE 导入HelloW ...
- POJ3026 Borg Maze(bfs求边+最小生成树)
Description The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of ...
- bufferedReader与StringReader
bufferedReader 这么说吧,这个类就是一个包装类,它可以包装字符流,将字符流放入缓存里,先把字符读到缓存里,到缓存满了或者你flush的时候,再读入内存,就是为了提供读的效率而设计的. S ...
- 关于AJAX与JSON的杂记
一.当网页需要有多个XMLHttpRequest对象时,可以使用Callback 函数,callback 函数是一种以参数形式传递给另一个函数的函数. <html> <head> ...
- CSS3中的新特性
一.CSS3新属性 CSS3还不属于W3C标准,所以不同浏览器的支持程度也不相同,对于不同浏览器,写法也不同,不同内核的浏览器要加不同的前缀,如下: transform:rotate(9deg); - ...