大約是一年多前開始接觸OBJECT-C並進行IOS開發,一上來就被OBJECT裡那種近似於“丑陋”的方法命名及其[]調用方式給“強暴”了一把,所以在後來的開發過程中,開始思考如何能使用C++方式來混編開發。經過了近半年多的代碼積累和開發調試,開始有了這個系列的內容。本系列BLOG的主要方向是引導IOS開發者特別是之前用C#和C++的朋友,可以一步步搭建屬於擁有.net風格的基本類庫,並快速進行IOS應用的開發。不過前提是讀者和開發者有一定的C++開發經驗,以免遇到一些詭異問題時,能夠快速找出解決方案。
好了,開始今天的內容吧!
在XCODE開發時,可以很方便的引入SQLITE庫來開發基於支持本地數據庫的應用。但網上查到的大部分內容都只是介紹一個簡單的示例而已。眾所周知,微軟的ADO.NET很好很強大,且已發展多年,其使用方式也很靈活多樣。如果將其哪怕部分實現方式“移植”到IOS上,那即使是.NET新手也可以很快適應。在網上基於C++實現連接SQLITE的示例代碼多如牛毛,但封裝的卻不甚理想。最後筆者在CODEPROJECT上終於挖出一個老項目,裡面基本上定義了一些實現方式和框架且實現得短小精悍,且利於擴充,所以我就在其基礎上,逐步加入了一些新的功能。所以就有了今天的內容。
在ADO.NET中定義了一些基本的數據庫訪問組件,比如DataSet, DataTable,DataRow,以及事務等。下面就來看一下用C++實現這些對象的方式。
首先是DataSet:
- typedef class CppSQLite3DB
- {
- public:
-
- CppSQLite3DB();
-
- CppSQLite3DB(const char* szFile);
-
- virtual ~CppSQLite3DB();
-
- void open(const char* szFile);
-
- void close();
-
- bool tableExists(const char* szTable);
-
- int execDML(const char* szSQL);
-
- //該方法為execNoQuery的封裝
- int execNoQuery(const char* szSQL);
-
- CppSQLite3Query execQuery(const char* szSQL);
-
- int execScalar(const char* szSQL);
-
- CppSQLite3Table getTable(const char* szSQL);
-
- CppSQLite3Statement compileStatement(const char* szSQL);
-
- sqlite_int64 lastRowId();
-
- void interrupt() { sqlite3_interrupt(mpDB); }
-
- void setBusyTimeout(int nMillisecs);
-
- static const char* Version() { return SQLITE_VERSION; }
-
- public:
-
- CppSQLite3DB(const CppSQLite3DB& db);
- CppSQLite3DB& operator=(const CppSQLite3DB& db);
-
- sqlite3_stmt* compile(const char* szSQL);
-
- void checkDB();
-
- sqlite3* mpDB;
- int mnBusyTimeoutMs;
- } DB;