设为首页 加入收藏

TOP

当C++遇到IOS应用开发(一)
2013-01-01 14:51:34 来源: 作者: 【 】 浏览:774
Tags:遇到 IOS 应用开发

  大约是一年多前开始接触OBJECT-C并进行IOS开发,一上来就被OBJECT里那种近似于"丑陋"的方法命名及其[]调用方式给"强暴"了一把,所以在后来的开发过程中,开始思考如何能使用C++(www.cppentry.com)方式来混编开发。经过了近半年多的代码积累和开发调试,开始有了这个系列的内容。本系列BLOG的主要方向是引导IOS开发者特别是之前用C#C++(www.cppentry.com)的朋友,可以一步步搭建属于拥有。net风格的基本类库,并快速进行IOS应用的开发。不过前提是读者和开发者有一定的C++(www.cppentry.com)开发经验,以免遇到一些诡异问题时,能够快速找出解决方案。

  好了,开始今天的内容吧!

  在XCODE开发时,可以很方便的引入SQLITE库来开发基于支持本地数据库的应用。但网上查到的大部分内容都只是介绍一个简单的示例而已。众所周知,微软的ADO.NET很好很强大,且已发展多年,其使用方式也很灵活多样。如果将其哪怕部分实现方式"移植"到IOS上,那即使是。NET新手也可以很快适应。在网上基于C++(www.cppentry.com)实现连接SQLITE的示例代码多如牛毛,但封装的却不甚理想。最后笔者在CODEPROJECT上终于挖出一个老项目,里面基本上定义了一些实现方式和框架且实现得短小精悍,且利于扩充,所以我就在其基础上,逐步加入了一些新的功能。所以就有了今天的内容。

  在ADO.NET中定义了一些基本的数据库访问组件,比如DataSet, DataTable,DataRow,以及事务等。下面就来看一下用C++(www.cppentry.com)实现这些对象的方式。

  首先是DataSet:

  [cpp]

  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;

  需要注意的是这里使用的某些方法名称是基于笔者以前开发DISCUT!NT时使用的DBHelper.cs类时使用的名称,这也是让团队里的老成员能很快适应这个框架的一个原因。

  上面基本上就是对数据库及数据表(DataTable)进行基本操作的封装。而数据表及数据行的定义如下:

  [cpp]

  typedef class CppSQLite3Table

  {

  public:

  CppSQLite3Table();

  CppSQLite3Table(const CppSQLite3Table& rTable);

  CppSQLite3Table(char** paszResults, int nRows, int nCols);

  virtual ~CppSQLite3Table();

  CppSQLite3Table& operator=(const CppSQLite3Table& rTable);

  int fieldsCount();

  int rowsCount();

  const char* fieldName(int nCol);

  const char* fieldValue(int nField);

  const char* operator[](int nField);

  const char* fieldValue(const char* szField);

  const char* operator[](const char* szField);

  int getIntField(int nField, int nNullValue=0);

  int getIntField(const char* szField, int nNullValue=0);

  double getFloatField(int nField, double fNullValue=0.0);

  double getFloatField(const char* szField, double fNullValue=0.0);

  const char* getStringField(int nField, const char* szNullValue="");

  const char* getStringField(const char* szField, const char* szNullValue="");

  bool fieldIsNull(int nField);

  bool fieldIsNull(const char* szField);

  void setRow(int nRow);

  const CppSQLite3TableRow getRow(int nRow);

  void finalize();

  private:

  void checkResults();

  int mnCols;

  int mnRows;

  int mnCurrentRow;

  char** mpaszResults;

  } Table;

  typedef class CppSQLite3TableRow

  {

  private:

  Table& inTable;

  public:

  const char* operator[](int nField);

  const char* operator[](const char* szField);

  CppSQLite3TableRow( Table& table):inTable(table){}

  virtual ~CppSQLite3TableRow(void)

  {};

  } Row;

  注意:关于Row的实现是老代码中所没有的,因为要考虑到尽量逼成ADO.NET的对象结构,所以这里加入了进来;

     

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于大数据批量更新的问题 下一篇The Hamming Distance&..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: