如何在unity3D的C#中调用libsqlite3(完整代码)

41 篇文章 0 订阅
13 篇文章 0 订阅

在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);
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值