在unity中尝试使用sqlite,本打算用Mono.Data.Sqlite,但发现Mono.Data.Sqlite有bug,把unity 项目导出成iOS项目,编译后,运行程序就挂了,只好自己在C#直接调用底层的libsqlite3库。
using UnityEngine;
using System.Runtime.InteropServices;
using System;
public class AESqlite {
public enum SqliteState{
OK = 0, /* Successful result */
ERROR = 1, /* SQL error or missing database */
INTERNAL = 2, /* Internal logic error in SQLite */
PERM = 3, /* Access permission denied */
ABORT = 4, /* Callback routine requested an abort */
BUSY = 5, /* The database file is locked */
LOCKED = 6, /* A table in the database is locked */
NOMEM = 7 , /* A malloc() failed */
READONLY = 8, /* Attempt to write a readonly database */
INTERRUPT = 9, /* Operation terminated by sqlite3_interrupt()*/
IOERR = 10, /* Some kind of disk I/O error occurred */
CORRUPT = 11, /* The database disk image is malformed */
NOTFOUND = 12, /* Unknown opcode in sqlite3_file_control() */
FULL = 13, /* Insertion failed because database is full */
CANTOPEN = 14, /* Unable to open the database file */
PROTOCOL = 15, /* Database lock protocol error */
EMPTY = 16, /* Database is empty */
SCHEMA = 17, /* The database schema changed */
TOOBIG = 18, /* String or BLOB exceeds size limit */
CONSTRAINT = 19, /* Abort due to constraint violation */
MISMATCH = 20, /* Data type mismatch */
MISUSE = 21, /* Library used incorrectly */
NOLFS = 22, /* Uses OS features not supported on host */
AUTH = 23, /* Authorization denied */
FORMAT = 24, /* Auxiliary database format error */
RANGE = 25, /* 2nd parameter to sqlite3_bind out of range */
NOTADB = 26, /* File opened that is not a database file */
ROW = 100, /* sqlite3_step() has another row ready */
DONE = 101, /* sqlite3_step() has finished executing */
}
/*
[DllImport("__Internal")]
private static extern int aear_genTracker(string detectorFile, string trackerFile);
*/
/// <summary>
/// 打开数据库连接,此方法与sqlite3_open()对应
/// </summary>
/// <param name='dbFile'>
/// 数据库文件的路径
/// </param>
/// <returns>打开数据连接成功时,返回数据库连接对象;否则返回IntPtr.Zero。</returns>
/// <remarks>
/// 当返回的Intptr为IntPtr.Zero时,表明打开数据库连接失败。
/// 当使用完此方法返回的数据库连接对象时,需要调用AESqlite.Close方法关闭数据库连接。
/// </remarks>
public static IntPtr Open(string dbFile){
IntPtr pDb= IntPtr.Zero;
sqlite3_open(dbFile, ref pDb);
return pDb;
}
/// <summary>
/// Compiling An SQL command. 与sqlite3_prepare_v2()对应
/// </summary>
/// <param name='sqlStatement'>
/// Sql Statement
/// </param>
/// <param name='pDb'>
/// 数据库连接对象
/// </param>
/// <returns>
/// 编译sql statment成功时,返回statment对象;否则返回IntPtr.Zero。
/// </returns>
/// <remarks>
/// 当返回IntPtr.Zero时,表明编译sql statement失败;
///当使用完此方法返回sql statement对象时,需要调用AESqlite.FinalizeStmt()释放sql statement对象
/// </remarks>
public static IntPtr Prepare(string sqlStatement, IntPtr pDb){
IntPtr pStmt= IntPtr.Zero;
IntPtr pzTail = IntPtr.Zero;
sqlite3_prepare_v2(pDb, sqlStatement, -1, ref pStmt, ref pzTail);
return pStmt;
}
/// <summary>
/// Step the specified pStmt.
/// </summary>
/// <param name='pStmt'>
/// P statement.
/// </param>
public static SqliteState Step(IntPtr pStmt){
return (SqliteState)sqlite3_step(pStmt);
}
/// <summary>
/// 释放sql statement对象占用的资源
/// </summary>
/// <returns>
///
/// </returns>
/// <param name='pStmt'>
/// 由AESqlite.Prepare()所创建的sql statement对象
/// </param>
public static bool FinalizeStmt(IntPtr pStmt){
sqlite3_finalize(pStmt);
return true;
}
/// <summary>
/// 关闭数据库连接
/// </summary>
/// <param name='pDb'>
/// 由AESqlite.Open()所创建的数据库连接对象
/// </param>
public static bool Close(IntPtr pDb){
sqlite3_close(pDb);
return true;
}
/// <summary>
/// 返回最近操作sqlite3数据库时,所产生的错误
/// </summary>
/// <param name='pDb'>
/// 数据库连接对象
/// </param>
/// <remarks>返回的字符串为UNICODE编码格式</remarks>
public static string Errmsg(IntPtr pDb){
IntPtr strPtr = sqlite3_errmsg16(pDb);
return Marshal.PtrToStringUni(strPtr);
}
public static int ColumnInt(IntPtr pStmt, int iCol){
return sqlite3_column_int(pStmt, iCol);
}
public static double ColumnDouble(IntPtr pStmt, int iCol){
return sqlite3_column_double(pStmt, iCol);
}
/// <remarks>返回的字符串为UNICODE编码格式</remarks>
public static string ColumnText(IntPtr pStmt, int iCol){
IntPtr strPtr = sqlite3_column_text16(pStmt, iCol);
return Marshal.PtrToStringUni(strPtr);
}
public static long LastInsertRowId(IntPtr pDb){
return sqlite3_last_insert_rowid(pDb);
}
[DllImport("sqlite3.dll")]
private static extern int sqlite3_open(string filename, ref IntPtr ppDb);
[DllImport("sqlite3.dll")]
private static extern int sqlite3_prepare_v2(IntPtr pDb, string sqlText, int nByte, ref IntPtr ppStmt, ref IntPtr pzTail);
[DllImport("sqlite3.dll")]
private static extern int sqlite3_step(IntPtr pStmt);
[DllImport("sqlite3.dll")]
private extern static int sqlite3_finalize(IntPtr pStmt);
[DllImport("sqlite3.dll")]
private extern static int sqlite3_close(IntPtr pDb);
[DllImport("sqlite3.dll")]
private extern static int sqlite3_column_int(IntPtr pStmt, int iCol);
[DllImport("sqlite3.dll")]
private extern static double sqlite3_column_double(IntPtr pStmt, int iCol);
[DllImport("sqlite3.dll")]
private extern static IntPtr sqlite3_column_text16(IntPtr pStmt, int iCol); //返回的字符串为UTF-16编码格式
[DllImport("sqlite3.dll")]
private extern static IntPtr sqlite3_errmsg16(IntPtr pDb); //返回的字符串为UTF-16编码格式
[DllImport("sqlite3.dll")]
private extern static long sqlite3_last_insert_rowid(IntPtr pDb);
}