【发布时间】:2010-11-17 17:41:09
【问题描述】:
在我的 Mac 和 iPhone 上,使用 Objective-c,我可以将 EURO 字符保存到 sqlite 数据库中。
在我存储之前,NSString 的长度是 1(或者应该是 2?)
在我从数据库中取回它后,NSString 的长度现在是 2(或者应该是 1?)
如何比较这两个 NSString? isEqualToString 不起作用。
(只要我坚持使用字符 0-127,读取/写入/比较就可以正常工作。)
这是一个大幅缩减的 sqlite READ 代码示例:
NSMutableString *s = [[[NSMutableString alloc] init] autorelease];
sqlite3_stmt *statement;
int i, numberOfColumns=0, columnType, numberOfRecords=0;
int anyInt;
double anyDouble;
char *anyText;
int prepareErrorNumber = sqlite3_prepare_v2(g_Db, [sqlCmd UTF8String], -1, &statement, nil);
if(prepareErrorNumber == SQLITE_OK)
{
while(sqlite3_step(statement) == SQLITE_ROW)
{
numberOfRecords++;
numberOfColumns = sqlite3_column_count(statement);
columnType = sqlite3_column_type(statement, i);
if(columnType == SQLITE_INTEGER) { anyInt = sqlite3_column_int(statement, i); [s appendFormat:@"%d", anyInt ]; }
if(columnType == SQLITE_TEXT ) { anyText = (char *)sqlite3_column_text(statement, i); [s appendFormat:@"%s", anyText ]; }
if(columnType == SQLITE_FLOAT ) { anyDouble = sqlite3_column_double(statement, i); [s appendFormat:@"%f", anyDouble]; }
}
... etc...
【问题讨论】:
-
示例代码展示了您存储和加载字符串的具体操作。
-
您的代码处理编码不正确。发布相关位,我们可以提供帮助。 :) 特别是,我们对如何将字符串放入 sqlite 以及如何将其取出感兴趣。
-
我会挖掘实际代码。 (它在我的工作计算机上。)所以你说我应该 NEVER 取回 2 个字节......如果我存储 1? (我认为如果字符在 0-127 范围之外,sqlite DID 会这样做。不是吗?) [dbResults length] 为 2 的事实绝对意味着我的 sqlite 读/写代码是错误的?) 我正在使用一些非常标准的 sqlite 代码,这些代码出现在整个网络上......它总是适用于除了 >127 个字符之外的所有内容。
-
所以通常我应该能够在我从数据库保存/加载之前(和之后)看到 1 个字符(欧元)的长度?并且 isEqualToString 应该比较它们就好了?
-
请记住,NSString 的长度不是字节数,而是字符数。如果在 NSString *mystring 中传递一个 EURO 字符需要两个字节,则 [mystring length] 将为 1。另一方面, strlen([mystring UTF8String]) 将是两个。
标签: iphone objective-c sqlite sdk nsstring