在SQlite中遍历一张表的同时更新这个表的内容碰到的一些问题

在一个连接中遍历一个表的时候同时使用sql语句更新这个表的值,碰到错误”database table locked”
首先尝试在遍历前使用 PRAGMA read_uncommitted = True;
在遍历完成后在执行PRAGMA read_uncommitted = False;
这么处理后在遍历过程中可以对表做更新操作,不过引起另外一个问题,只能遍历一半的表记录,且当为记录行数为基数时会出现“not an error”错误,经测试估计是在遍历过程中使用执行更新sql语句时,同时向后移动了遍历的位置。
再次尝试使用两个链接来做遍历更新处理,其中一个链接做遍历,另外一个链接做更新。 在记录数少时一切正常,但是当记录数很多时候,在后面记录的更新时会出现“SQL logic error or missing database” 的错误。
最终对要遍历的表采用limit关键字分片读取出需要的数据,然后对这些数据做更新,完成后再读入下一组数据继续处理。

   load a block data
   while has block data
      foreach record in block
       do update
      load next block data

Popularity: 27% [?]

Related

在Android NDK 中使用STLport(译)

Android NDK是Native C/C++开发,不过下载来看了一下缺少常见的STL库,使用起来诸多不便,于是网上google了一把,发现有人做了这样的事情,特别转过来
——————————–
原文: Android NDK - getting STLPort up and running
作者: Pete Cole
——————————-
如果你想在Android NDK使用STLPort, 你必须要做点处理,即便你是在windows上使用cygwin.

首先, 从http://umbel.mooo.com/ 获取一份修改版的 STLPort(by John Ripley (great job, John!)). 如果你是一个 cygwin 用户, 你首先要安装一个git包(译注:可以直接下载snapshot,这样就不要安装git了).

然后将文件拷贝到你的工作目录下. 在我的机器上, 我将文件拷贝到了c:\android-ndk-1.5_r1 目录下, 并将 两个hello-stl 文件夹移动到其他和NDK有关的目录下:

C:\android-ndk-1.5_r1\apps\hello-stl
C:\android-ndk-1.5_r1\sources\samples\hello-stl

然后在Build STLPort前必须修改一些文件…

setup.sh
将最前面的一些行修改正如下样子:

  1. #!/bin/bash
  2. if uname | grep -qi linux; then
  3. export NDK_HOST=linux-x86
  4. elif uname | grep -qi CYGWIN; then
  5. export NDK_HOST=windows
  6. else
  7. export NDK_HOST=darwin-x86
  8. fi

将倒数第三行修改成如下样子:

  1. ln -sf "$NDK_DIR/build/prebuilt/${NDK_HOST}/arm-eabi-4.2.1/bin/arm-eabi-$tool" arm-linux-$tool

stlport/build/lib/android.mak

将TOOLCHAIN_PREFIX这一行修改成

  1. TOOLCHAIN_PREFIX := $(NDK_DIR)/build/prebuilt/$(NDK_HOST)/arm-eabi-4.2.1/bin/arm-eabi-

译注: 我下载来的Wrapper包已经是这个样子了,不用修改

sources/samples/hello-stl/Android.mk
将STLPORT_BASE这一行修改成如下样子:

  1. STLPORT_BASE := /cygdrive/c/android-ndk-1.5_r1/stlport

译注:我没有修改这边,执行了一个export NDK_WRAPPERS_BASE=basepath的操作

将:

  1. LOCAL_LDLIBS += -L$(STLPORT_BASE)/build/lib/obj/gcc/so \
  2. -lstlport

修改成

  1. LOCAL_STATIC_LIBRARIES := libstlport.5.1

Building STLPort
现在文件已经被合并了,你可以立即build STLPort了!

执行如下cygwin shell脚本… 它将build STLPort的静态链接库! 对此你只需要做一次.

  1. export NDK_DIR=/cygdrive/c/android-ndk-1.5-r1
  2. cd $NDK_DIR
  3. ./env.sh
  4. ./setup.sh

现在,像下面这样讲文件拷贝到你的工程中:

  1. cp -p \
  2. /cygdrive/c/android-ndk-1.5_r1\stlport\build\lib\obj\gcc\ar\libstlport.5.1.a \
  3. /cygdrive/c/android-ndk-1.5_r1\out\apps\hello-stl\android-1.5-arm

Building your project’s shared library.
现在你可以返回cygwin的shell窗口,然后执行如下命令:

  1. cd /cygdrive/c/android-ndk-1.5_r1
  2. make APP=hello-stl

将编译你的共享库文件:
C:\android-ndk-1.5_r1\apps\hello-stl\project\libs\armeabi\libhello-stl.so

注: 这会将STLPort静态链接到你的库中.

Building the hello-stl project

在Eclipse中,使用New Project Wizard为每一个例子创建一新的Android project, 使用”Import from Existing Source” 选项从c:\android-ndk-1.5_r1\apps\hello-stl\project 导入源文件

现在你可以编译和运行你的项目了. 将显示从共享库中返回来的std::string字符串 …!

Popularity: 24% [?]

Related

SQLite出现database disk image is malformed(11)的处理

SQLite有一个很严重的缺点就是不提供Repair命令。
导致死亡提示database disk image is malformed
它的产生有很多种可能,比如,磁盘空间不足,还有就是写入数据过程中突然掉电等。
官方对产生原因的一些说明: http://www.sqlite.org/lockingv3.html#how_to_corrupt

sqlite  my.sqlite3
sqlite>PRAGMA integrity_check;

获得提示

*** in database main ***
Page 1518: btreeInitPage() returns error code 11
On tree page 1566 cell 2: Child page depth differs
On tree page 1566 cell 3: Child page depth differs
SQL error: database disk image is malformed

可以尝试通过简单的导出导入方式对损坏的库文件作回复。
首先导出数据

sqlite3 my.sqlite3
sqlite>.output tmp.sql
sqlite>.dump
sqlite>.quit

再倒入到一个新库中

sqlite3 mynew.sqlite3
sqlite>.read tmp.sql
sqlite>.quit

这时新建的mynew.sqlite3一般可用。

Popularity: 25% [?]

Related

symbian手机平台上的putty

发现一个 Symbian 平台上的一个 ssh 客户端 putty for symbian。
在PC上用习惯了小巧的 putty, 在 sourceforge.net 上闲逛,发现也有一个 putty for symbian OS ,这样以后在Nokia 智能手机上也能用 putty 来远程连接服务器做管理了。
下载服务器上同时公布有源码下载,有兴趣的话可以下载研究一下。

Popularity: 28% [?]

Related

给Symbian添加子菜单方法

测试用Symbian程序的菜单越来越多,想通过子菜单方式将菜单的功能分组。
研究了一下,发现在资源文件中可以做到,要使用MENU_ITEM的cascade属性。

Popularity: 30% [?]

Related

WINCE不支持time函数?

WinCE上不支持time.h中的常用的time函数,网上找了一小段代码为其补上。

  1. time_t time( time_t *inTT ) {
  2.  SYSTEMTIME sysTimeStruct;
  3.  FILETIME fTime;
  4.  ULARGE_INTEGER int64time;
  5.  time_t locTT = 0;
  6.  
  7.  if ( inTT == NULL ) {
  8.    inTT = &locTT;
  9.  }
  10.  
  11.  GetSystemTime( &sysTimeStruct );
  12.  if ( SystemTimeToFileTime( &sysTimeStruct, &fTime ) ) {
  13.    memcpy( &int64time, &fTime, sizeof( FILETIME ) );
  14.    /* Subtract the value for 1970-01-01 00:00 (UTC) */
  15.    int64time.QuadPart -= 0×19db1ded53e8000;
  16.    /* Convert to seconds. */
  17.    int64time.QuadPart /= 10000000;
  18.    *inTT = int64time.QuadPart;
  19.  }
  20.  
  21.  return *inTT;
  22. }

更好的解决方案可以使用LuaCe中的实现(在luace.c文件中,和时间有关的几个函数实现都有)
—–
不过想不明白,这么基础的函数M$为什么不提供在SDK中。开发人员就一定是要用Systemtime函数?

Popularity: 37% [?]

Random Posts

如何在VC调试器中显示Symbian字符串(译)

在VC中编写Symbian程序,在调试状态下很不方便看Symbian的字符串内容,网络上搜到这么一篇,感觉不错,译载一下。
原文标题: How to display Symbian strings and descriptors in Visual C++ debugger
原文地址:http://www.newlc.com/How-to-display-Symbian-strings-and.html
译文地址: http://www.sunnyu.com/?p=135
本文由 sunny译于 2008.11.08 由于英文水平有限,译文难免有很多不足之处,欢迎指正。
————–译文开始—————-

目前,在使用Visual Studio调试Symbian程序时,Symbian的字符串显示方式有点不好,不能直接显示他们的内容(你只能使用Memory窗口查看)。在这儿,我们介绍一个小的技巧,使你在调试时能够方便的显示Symbian中字符串的内容。

我们是得益于Microsoft Visual Studio的”Auto Expand”特性做到这点的。这个特性允许我们指定调试器显示用户数据的方式。可以通过手工编辑AutoExp.dat文件来实现(文件默认在 C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin 目录下 )。

使用你惯用的编辑器打开这个文件,然后 拷贝/粘贴 下面的内容到文件尾部。

;=======================================================
;
; Symbian Strings & Descriptors
;
;=======================================================
TDes16=<,t> length=<iLength> max=<iMaxLength>
TDesC16=<,t> length=<iLength>
TPtr=length=<iLength> max=<iMaxLength> ptr=<iPtr+2,su>
TPtr16=length=<iLength> max=<iMaxLength> ptr=<iPtr+2,su>
TPtrC=length=<iLength> ptr=<iPtr,su>
TPtrC16=length=<iLength> ptr=<iPtr,su>
TBuf<*>=length=<iLength> max=<iMaxLength> buf=<iBuf,su>
TBufC<*>=length=<iLength> buffer=<iBuf,su>
HBufC16=length=<iLength> buffer=<iBuf,su>
TLitC<*>=length=<iTypeLength> buf=<iBuf,su>

TDes8=<,t> length=<iLength> max=<iMaxLength>
TDesC8=<,t> length=<iLength>
TPtr8=length=<iLength> max=<iMaxLength> ptr=<iPtr,s>
TPtrC8=length=<iLength> ptr=<iPtr,s>
TBuf8<*>=length=<iLength> max=<iMaxLength> buffer=<iBuf,s>
TBufC8<*>=length=<iLength> buffer=<iBuf,s>
HBufC8=length=<iLength> buffer=<iBuf,su>
TLitC8<*>=length=<iTypeLength> buffer=<iBuf,s>

TFileName= <iBuf,su>
TFullName= <iBuf,su>

重新运行IDE环境, 设置一两个断点, 开始调试方式运行程序, 你在断点可以看到….

desc-display.png

怎么样 ?

——

以前都不知道M$的VS有这个特性,又学了一招。vs2005对应的文件在 C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger 目录下

Popularity: 34% [?]

Related

Symbian 的 sprintf 函数对 “%f” 浮点数格式化不正常?

在测试工程使用了 sprintf 函数,结果发现 %f 行为不正常。
多数时候输出的时候,字符串里面都有不止一个小数点(或者是逗号,我视力不好看不清 :-s)。和想要的只有一个小数点的期望相差太远。
Nokia的论坛上找了一下,好像没有这个问题。有人通过 LC_ALL 来设置,不过我试了没有效果。
只好自己做了一下包装,将浮点数分为整数和小数两个部分处理,然后再拼接起来。

  1. std::string floattostr( double d )
  2. {
  3.  char buf[30];
  4. #ifdef OS_SYMBIAN
  5.  // 整数部分
  6.  int i = d;
  7.  sprintf (buf, "%d",i);
  8.  // 小数部分
  9.  double f = d - i;
  10.  char buf1[30];
  11.  sprintf(buf1, "%.6f",f);
  12.  // 做拼接
  13.  strcat(buf, &(buf1[1]));
  14. #else
  15.  sprintf(buf, "%f", d);
  16. #endif
  17.  return buf;
  18. }

Popularity: 36% [?]

Related

OfferKeyEventL不能响应按键操作?

写了测试代码测试按键控制。
重载了OfferKeyEventL函数

  1. TKeyResponse CMyTest_S60AppView::OfferKeyEventL(const TKeyEvent &aKeyEvent, TEventCode aType){
  2. // We only want the key press, not the key up/down event
  3.  if ( aType == EEventKey )
  4.  {
  5.    // Check if the 2 key was pressed
  6.    if ( aKeyEvent.iCode == '1' )
  7.    {    
  8.     iKeyPressCount ++;
  9.     return EKeyWasConsumed;
  10.    }
  11.    return EKeyWasNotConsumed;
  12. }

编译运行,可是怎么按都没有响应,在Debug 中下断点,也不停下来。

后来到Nokia论坛看了一下,发现使用 AddToStackL(iAppView); 添加到列表中才能处理按键响应。

  1. void CMyTest_S60AppUi::ConstructL()
  2.  {
  3.  // Initialise app UI with standard value.
  4.  BaseConstructL();
  5.  
  6.  // Create view object
  7.  iAppView = CMyTest_S60AppView::NewL( ClientRect() );
  8.  
  9.  AddToStackL(iAppView);
  10.  
  11.  PrivacyStatementL();
  12.  iAppView->BeginSession();
  13. }

Popularity: 38% [?]

Related

使用Bitmap Collection tool未能生成mbg文件?

在vs.net中使用carbide.vs的Bitmap Collection tool为测试程序添加了一个小图片,结果在输入日志中提示有mbm文件生成,可是在源码目录下找不到对应的 mbg 文件。是Bitmap Collection tool没有生成mbg文件吗?
看到输出日志中提示mbm文件是生成到sdk目录下的,想mbg是不是也会在sdk目录下呢?于是在sdk目录下搜索.mbg文件,发现在epoc32\include目录下还真的有。打开查看,发现其中定义了枚举量,和自己的文件名有对应关系。
因为epoc32\include已经在工程中包含,所以按照命名的规则放心大胆的在工程中 #include 进来。然后代码中使用图片资源定义常量。

Popularity: 27% [?]

Related

Next Page →