English 中文(简体)
将节省费用之前(及之后)的安保数据与qlite数据库相比较
原标题:Comparing NSStrings before (and after) saving to sqlite database

关于我的Mac和Pi,利用客观-c,我可以把欧盟驻军的特点留给一个qlite数据库。

在我存放之前,国家空间局的长度是1(应该是2)

在我从数据库中检索后,国家抽样调查的长度现在为2(顺序为1)。

我如何比较这2个安保标准? 平均工作。

(只要我坚持0-127的特性,就可处以重整/改写/补工。)

这是三重三重的三重三重三重三重的重新计算法:

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...
问题回答

它希望你再次尝试加入为国家安全局,并读为UTF8String。

Use the instance method UTF8String when writing and the class method stringFromUTF8String: when reading.

很可能,你利用从错误方式收集的信息,创建<代码>NSString。 这里完全是向数据库书写欧元标志,然后读回:

//clang -g so_sqlite3_nsstring.m -framework Foundation -lsqlite3 
//    -o so_sqlite3_nsstring
#import <Foundation/Foundation.h>
#import <sqlite3.h>

#define DB_PATH "so_enc.db"

enum {
  ALL_OK,
  CANT_OPEN,
  CANT_CREATE,
  CANT_INSERT,
  CANT_FIND,
};

struct ExecCBCtx {
  NSString **out_string;
};
int ExecCB(void *ctx, int col_count, char *col_text[], char *col_name[]);

sqlite3 *DBCreate(void);
void DBWrite(sqlite3 *db, NSString *text);
NSString *DBRead(sqlite3 *db);

int
main(void) {
  id pool = [[NSAutoreleasePool alloc] init];
  sqlite3 *db = DBCreate();

  // Use universal character name for U+20AC "EURO SIGN".
  NSString *text = @"u20AC";
  DBWrite(db, text);

  NSString *text2 = DBRead(db);
  (void)sqlite3_close(db);

  BOOL eq = [text isEqualToString:text2];
  NSLog(@"%@ = %@? %s", text, text2, eq? "YES" : "NO");
  [pool drain];
  return ALL_OK;
}

void
DBOpen(sqlite3 **out_db)
{
  sqlite3 *db = NULL;
  int rc = sqlite3_open(DB_PATH, out_db);
  if (rc) {
    fprintf(stderr, "sqlite3_open: %s
", sqlite3_errmsg(*out_db));
    (void)sqlite3_close(*out_db);
    exit(CANT_OPEN);
  }
}

sqlite3 *
DBCreate(void)
{
  sqlite3 *db = NULL;
  DBOpen(&db);

  static const char CREATE_TABLE[] =
      "CREATE TABLE IF NOT EXISTS "TEST" ("STRING" char(9))";
  char *errmsg = NULL;
  int rc = sqlite3_exec(db, CREATE_TABLE, ExecCB, NULL, &errmsg);
  if (rc) {
    fprintf(stderr, "%s: %s
", __func__, errmsg);
    sqlite3_free(errmsg);
    (void)sqlite3_close(db);
    exit(CANT_CREATE);
  }
  return db;
}

void
DBWrite(sqlite3 *db, NSString *text)
{
  static NSString *const WRITE_TABLE_FMT =
      @"INSERT INTO "TEST" VALUES ("%@")";
  NSString *writeText = [NSString stringWithFormat:WRITE_TABLE_FMT, text];
  const char *cmd = [writeText UTF8String];

  char *errmsg = NULL;
  int rc = sqlite3_exec(db, cmd, ExecCB, NULL, &errmsg);
  if (rc) {
    fprintf(stderr, "%s: %s
", __func__, errmsg);
    sqlite3_free(errmsg);
    (void)sqlite3_close(db);
    exit(CANT_INSERT);
  }
}

NSString *
DBRead(sqlite3 *db)
{
  static const char READ_TABLE[] =
      "SELECT * FROM "TEST"";

  NSString *text = nil;
  struct ExecCBCtx ctx = {&text};

  char *errmsg = NULL;
  int rc = sqlite3_exec(db, READ_TABLE, ExecCB, &ctx, &errmsg);
  if (rc && rc != SQLITE_ABORT) {
    fprintf(stderr, "%s: %s
", __func__, errmsg);
    sqlite3_free(errmsg);
    (void)sqlite3_close(db);
    exit(CANT_FIND);
  }
  sqlite3_free(errmsg);
  return text;
}

int
ExecCB(void *ctx, int col_count, char *col_text[], char *col_name[])
{
  //fprintf(stderr, "%s: %p - %d cols - %s - %s
",
  //        __func__, ctx, col_count, col_text[0], col_name[0]);
  if (!ctx) return 0;

  struct ExecCBCtx *out = ctx;
  NSString **text = out->out_string;
  if (*text) return 1;

  *text = [NSString stringWithUTF8String:col_text[0]];
  return 0;
}

这里是抽样操作的产出:

2010-11-17 14:34:05.436 so_sqlite3_nsstring[23536:903] € = €? YES

=> 在撰写本报告时使用UTF8

Done. (I didn t show that code, but it was already being done.)

=>以及等级方法:阅读时。

I assume this is the line that I need to fix.
But what would it look like?
I can t get stringFromUTF8String to work, no matter how I re-write it.

if(columnType == SQLITE_TEXT   ) 
{ 
    anyText = (char *)sqlite3_column_text(statement, i); 
   [s appendFormat:@"%s", anyText]; 
}




相关问题
sqlite3 is chopping/cutting/truncating my text columns

I have values being cut off and would like to display the full values. Sqlite3 -column -header locations.dbs " select n.namelist, f.state, t.state from names n left join locations l on l.id = n.id ...

Entity Framework with File-Based Database

I am in the process of developing a desktop application that needs a database. The application is currently targeted to SQL Express 2005 and works wonderfully. However, I m not crazy about having ...

Improve INSERT-per-second performance of SQLite

Optimizing SQLite is tricky. Bulk-insert performance of a C application can vary from 85 inserts per second to over 96,000 inserts per second! Background: We are using SQLite as part of a desktop ...

Metadata for columns in SQLite v2.8 (PHP5)

How can I get metadata / constraints (primary key and "null allowed" in particular) for each column in a SQLite v2.8 table using PHP5 (like mysql_fetch_field for MySql)? sqlite_fetch_column_types (OO:...

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签