private
SqliteConnection conn;
//
SQLite连接
private
SqliteDataReader reader;
private
SqliteCommand command;
//
SQLite命令
private
float
timespeed =
0.001f
;
///
<summary>
///
执行SQL语句 公共方法
///
</summary>
///
<param name="sqlQuery"></param>
///
<returns></returns>
public
SqliteDataReader ExecuteQuery(
string
sqlQuery)
command
=
conn.CreateCommand();
command.CommandText
=
sqlQuery;
reader
=
command.ExecuteReader();
return
reader;
#region
打开/关闭数据库
///
<summary>
///
打开数据库
///
</summary>
///
<param name="connectionString">
@"Data Source = " + path
</param>
public
SQLiteDataBase(
string
connectionString)
//
构造数据库连接
conn =
new
SqliteConnection(connectionString);
//
打开数据库
conn.Open();
Debug.Log(
"
打开数据库
"
);
catch
(Exception e)
Debug.Log(e.Message);
///
<summary>
///
关闭数据库连接
///
</summary>
public
void
CloseSqlConnection()
if
(command !=
null
) { command.Dispose(); command =
null
; }
if
(reader !=
null
) { reader.Dispose(); reader =
null
; }
if
(conn !=
null
) { conn.Close(); conn =
null
; }
Debug.Log(
"
关闭数据库!
"
);
#endregion
;
#region
创建表单
///
<summary>
///
创建表单 第一种
///
</summary>
///
<param name="name">
表单名
</param>
///
<param name="col">
字段
</param>
///
<param name="colType">
类型
</param>
public
void
CreationMenu(
string
name,
string
[] col,
string
[] colType)
string
query =
"
create table
"
+ name +
"
(
"
+ col[
0
] +
"
"
+ colType[
0
];
for
(
int
i =
1
; i < col.Length; ++
i)
query
+=
"
,
"
+ col[i] +
"
"
+
colType[i];
query
+=
"
)
"
;
command
=
new
SqliteCommand(query, conn);
command.ExecuteNonQuery();
///
<summary>
第二种 区别第一种用了公共方法 原理应该是一样的 经测试都可以使用
///
创建表 param name=表名 col=字段名 colType=字段类型
///
</summary>
public
SqliteDataReader CreateTable(
string
name,
string
[] col,
string
[] colType)
if
(col.Length !=
colType.Length)
throw
new
SqliteException(
"
columns.Length != colType.Length
"
);
string
query =
"
CREATE TABLE
"
+ name +
"
(
"
+ col[
0
] +
"
"
+ colType[
0
];
for
(
int
i =
1
; i < col.Length; ++
i)
query
+=
"
,
"
+ col[i] +
"
"
+
colType[i];
query
+=
"
)
"
;
return
ExecuteQuery(query);
#endregion
;
#region
查询数据
///
<summary>
///
查询表中全部数据 param tableName=表名
///
</summary>
public
SqliteDataReader ReadFullTable(
string
tableName)
string
query =
"
SELECT * FROM
"
+
tableName;
return
ExecuteQuery(query);
///
<summary>
///
按条件查询数据 param tableName=表名 items=查询字段 col=查找字段 operation=运算符 values=内容
///
</summary>
public
SqliteDataReader SelectWhere(
string
tableName,
string
[] items,
string
[] col,
string
[] operation,
string
[] values)
if
(col.Length != operation.Length || operation.Length !=
values.Length)
throw
new
SqliteException(
"
col.Length != operation.Length != values.Length
"
);
string
query =
"
SELECT
"
+ items[
0
];
for
(
int
i =
1
; i < items.Length; ++
i)
query
+=
"
,
"
+
items[i];
query
+=
"
FROM
"
+ tableName +
"
WHERE
"
+ col[
0
] + operation[
0
] +
"
'
"
+ values[
0
] +
"
'
"
;
for
(
int
i =
1
; i < col.Length; ++
i)
query
+=
"
AND
"
+ col[i] + operation[i] +
"
'
"
+ values[i] +
"
'
"
;
return
ExecuteQuery(query);
///
<summary>
///
查询表
///
</summary>
public
SqliteDataReader Select(
string
tableName,
string
col,
string
values)
string
query =
"
SELECT * FROM
"
+ tableName +
"
WHERE
"
+ col +
"
=
"
+
values;
return
ExecuteQuery(query);
public
SqliteDataReader Select(
string
tableName,
string
col,
string
operation,
string
values)
string
query =
"
SELECT * FROM
"
+ tableName +
"
WHERE
"
+ col + operation +
values;
return
ExecuteQuery(query);
///
<summary>
///
升序查询
///
</summary>
public
SqliteDataReader SelectOrderASC(
string
tableName,
string
col)
string
query =
"
SELECT * FROM
"
+ tableName +
"
ORDER BY
"
+ col +
"
ASC
"
;
return
ExecuteQuery(query);
///
<summary>
///
降序查询
///
</summary>
public
SqliteDataReader SelectOrderDESC(
string
tableName,
string
col)
string
query =
"
SELECT * FROM
"
+ tableName +
"
ORDER BY
"
+ col +
"
DESC
"
;
return
ExecuteQuery(query);
///
<summary>
///
查询表行数
///
</summary>
public
SqliteDataReader SelectCount(
string
tableName)
string
query =
"
SELECT COUNT(*) FROM
"
+
tableName;
return
ExecuteQuery(query);
#endregion
#region
插入数据
///
<summary>
///
插入数据 param tableName=表名 values=插入数据内容
///
插入一条数据
///
</summary>
public
SqliteDataReader InsertInto(
string
tableName,
string
[] values)
string
query =
"
INSERT INTO
"
+ tableName +
"
VALUES ('
"
+ values[
0
];
for
(
int
i =
1
; i < values.Length; ++
i)
query
+=
"
', '
"
+
values[i];
query
+=
"
')
"
;
return
ExecuteQuery(query);
///
<summary>
///
插入数据 插入多条数据
///
</summary>
经测试这个方法是可用的
///
因为我的数据有两万条运行卡着不动了,所以用协程时间控制一下 虽然慢但是不卡死,写到数据库中之后用数据库就好了
///
<param name="tableName">
表名字
</param>
///
<param name="values">
字典
</param>
///
<returns></returns>
public
IEnumerator InsertInto(
string
tableName, Dictionary<
string
, List<
string
>>
values)
int
ii =
0
;
foreach
(
var
item
in
values)
string
query =
""
;
string
value =
""
;
foreach
(
var
ite
in
item.Value)
value
+=
"
','
"
+
ite;
query
=
"
INSERT INTO
"
+ tableName +
"
VALUES ('
"
+ item.Key + value +
"
')
"
;
//
Debug.Log(query);
command =
conn.CreateCommand();
command.CommandText
=
query;
command.ExecuteNonQuery();
Debug.Log(
"
写入成功
"
+ ii++
);
yield
return
new
WaitForSeconds(timespeed);
Debug.Log(
"
写入成功
"
);
#region
没测试过的
///
<summary>
///
插入数据 param tableName=表名 cols=插入字段 value=插入内容
///
</summary>
public
SqliteDataReader InsertIntoSpecific(
string
tableName,
string
[] cols,
string
[] values)
if
(cols.Length !=
values.Length)
throw
new
SqliteException(
"
columns.Length != values.Length
"
);
string
query =
"
INSERT INTO
"
+ tableName +
"
('
"
+ cols[
0
];
for
(
int
i =
1
; i < cols.Length; ++
i)
query
+=
"
', '
"
+
cols[i];
query
+=
"
') VALUES ('
"
+ values[
0
];
for
(
int
i =
1
; i < values.Length; ++
i)
query
+=
"
', '
"
+
values[i];
query
+=
"
')
"
;
return
ExecuteQuery(query);
///
<summary>
///
更新数据 param tableName=表名 cols=更新字段 colsvalues=更新内容 selectkey=查找字段(主键) selectvalue=查找内容
///
</summary>
public
SqliteDataReader UpdateInto(
string
tableName,
string
[] cols,
string
[] colsvalues,
string
selectkey,
string
selectvalue)
string
query =
"
UPDATE
"
+ tableName +
"
SET
"
+ cols[
0
] +
"
=
"
+ colsvalues[
0
];
for
(
int
i =
1
; i < colsvalues.Length; ++
i)
query
+=
"
,
"
+ cols[i] +
"
=
"
+
colsvalues[i];
query
+=
"
WHERE
"
+ selectkey +
"
=
"
+ selectvalue +
"
"
;
return
ExecuteQuery(query);
///
删除表 IF EXISTS判断表存不存在防止出错 已测试
///
</summary>
public
SqliteDataReader DeleteContents(
string
tableName)
string
query =
"
DROP TABLE IF EXISTS
"
+
tableName;
Debug.Log(
"
删除表成功
"
);
return
ExecuteQuery(query);
///
<summary>
///
删除数据 param tableName=表名 cols=字段 colsvalues=内容
///
</summary>
public
SqliteDataReader Delete(
string
tableName,
string
[] cols,
string
[] colsvalues)
string
query =
"
DELETE FROM
"
+ tableName +
"
WHERE
"
+ cols[
0
] +
"
=
"
+ colsvalues[
0
];
for
(
int
i =
1
; i < colsvalues.Length; ++
i)
query
+=
"
or
"
+ cols[i] +
"
=
"
+
colsvalues[i];
return
ExecuteQuery(query);
#endregion
public
class
SQLiteDataBaseTion : MonoBehaviour
[Header(
"
Excel表数据长度
"
)]
//
表格一共有多少列数 最长的一个
public
int
tableint;
public
string
[] fields, type;
//
字段\类型
[Header(
"
数据库名字
"
)]
public
string
dbname;
private
SQLiteDataBase _SQLiteData;
private
SqliteDataReader reader;
private
string
path;
private
string
connectionString;
public
static
Dictionary<
string
, List<
string
>> JDDateDic =
new
Dictionary<
string
, List<
string
>>();
//
机电数据
public
static
Dictionary<
string
, List<
string
>> OneCDateDic =
new
Dictionary<
string
, List<
string
>>();
//
一层数据
private
void
Awake()
fields
=
new
string
[tableint];
type
=
new
string
[tableint];
for
(
int
i =
0
; i < tableint; i++
)
fields[i]
=
"
sql
"
+
i.ToString();
type[i]
=
"
varchar
"
;
//
Start is called before the first frame update
void
Start()
//
读取excel表格数据
ReadExcelClick(
"
jiegou.xlsx
"
,
0
, OneCDateDic);
path
= Application.streamingAssetsPath +
"
/
"
+ dbname +
"
.db
"
;
connectionString
=
@"
Data Source =
"
+
path;
//
创建数据库文件 存在就打开
CreateSQL(dbname);
//
创建表
//
_SQLiteData.CreationMenu("jiegou", fields, type);
//
将数据插入数据库
//
StartCoroutine(_SQLiteData.InsertInto("jiegou", OneCDateDic));
//
删除表
//
_SQLiteData.DeleteContents("jiegou");
///
<summary>
///
创建数据库文件
///
</summary>
///
<param name="sqlname">
文件名字
</param>
public
void
CreateSQL(
string
sqlname)
if
(!File.Exists(Application.streamingAssetsPath +
"
/
"
+ sqlname +
"
.db
"
))
//
不存在就创建
File.Create(Application.streamingAssetsPath +
"
/
"
+ sqlname +
"
.db
"
);
//
创建之后再打开
_SQLiteData =
new
SQLiteDataBase(connectionString);
Debug.Log(
"
已存在
"
);
//
打开数据库
_SQLiteData =
new
SQLiteDataBase(connectionString);
///
读取数据库某一行数据 "646c173c-7d14-47b0-80fe-53c1c8ce2b0e-0037044a"
public
List<
string
> SomeLine(
string
idname,
out
List <
string
>
listidnames)
reader
= _SQLiteData.ReadFullTable(
"
jidian
"
);
List
<
string
> idname_ =
new
List<
string
>
();
while
(reader.Read())
//
Debug.Log(reader.GetString(reader.GetOrdinal("idname")));
//
reader.ToString();
if
(reader.GetString(
0
).ToString() ==
idname)
for
(
int
i =
0
; i < reader.FieldCount; i++
)
if
(reader.GetString(i) !=
null
)
Debug.Log(reader.GetString(i));
idname_.Add(reader.GetString(i));
catch
(Exception e)
Debug.Log(e.Message);
break
;
listidnames
=
idname_;
return
listidnames;
listidnames
=
idname_;
return
listidnames;
//
读取 Excel表格
void
ReadExcelClick(
string
_name,
int
_num, Dictionary<
string
, List<
string
>>
_Dic)
//
1.打开文件,创建一个文件流操作对象
//
FileStream fileStream = new FileStream(Application.streamingAssetsPath + "/" + "机电.xlsx", FileMode.Open, FileAccess.Read);
FileStream fileStream =
new
FileStream(Application.streamingAssetsPath +
"
/
"
+
_name, FileMode.Open, FileAccess.Read);
//
2.创建一个excel读取类
IExcelDataReader reader =
ExcelReaderFactory.CreateOpenXmlReader(fileStream);
//
方法1:读取
//
while (reader.Read())
//
string name = reader.GetString(0);
//
string birth = reader.GetString(1);
//
string brief = reader.GetString(2);
//
Debug.Log("姓名:" + name + " --- " + "生卒:" + birth + " --- " + "简介:" + brief);
//
方法2:读取
DataSet result =
reader.AsDataSet();
//
获取行数
int
rows =
result.Tables[_num].Rows.Count;
Debug.Log(rows);
//
获取列数
int
column =
result.Tables[_num].Columns.Count;
for
(
int
i =
0
; i < rows; i++
)
//
获取i行的第一列数据
string
name = result.Tables[_num].Rows[i][
0
].ToString();
List
<
string
> _S =
new
List<
string
>
();
for
(
int
j =
1
; j < column; j++
)
string
birth =
result.Tables[_num].Rows[i][j].ToString();
_S.Add(birth);
if
(_Dic.ContainsKey(name))
continue
;
_Dic.Add(name, _S);
Debug.Log(_Dic.Count);
private
void
OnDisable()
_SQLiteData.CloseSqlConnection();
//
Update is called once per frame
void
Update()
c#脚本亲测可用