cocos2dx 에서 sqlite 를 어떻게 사용 하여 데 이 터 를 기록 합 니까?

11700 단어 cocos2dx
전송, 주소 유지: http://blog.csdn.net/stalendp/article/details/8862737
sqlite 가 cocos2dx 에서 의 통합 을 조사 하 는 데 시간 이 걸 렸 는데 이 과정 에서 문제 가 생 겨 서 특별히 기록 했다.
1) sqlite 소스 코드 를 다운로드 하고 프로젝트 에 압축 을 풀 었 습 니 다. [이 단 계 는 필요 없습니다. cocos2dx 에 sqlite 가 추가 되 었 습 니 다. 헤더 파일 sqlite 3. h 만 참조 하면 됩 니 다]:
소스 코드 위치: http://www.sqlite.org/download.html
在cocos2dx中怎么使用sqlite来纪录数据
프로젝트 에 압력 을 줄 입 니 다 (셸. c 필요 없 음). xcode 에 서 는 다음 과 같 습 니 다.

2) 데이터베이스 열기:
먼저 sqlite 도구 로 데이터 베 이 스 를 만 듭 니 다. test. db 라 고 합 니 다.(도 구 는 sqlite 가 제공 하 는 명령 행 도 구 를 사용 할 수 있 습 니 다. sqlite 다운로드 페이지 의 Precopiled Binaries);
test. db 를 리 소스 폴 더 에 복사 하고 프로젝트 에 추가 합 니 다. 다음 그림:

그리고 다음 코드 를 호출 하여 데이터 베 이 스 를 엽 니 다.
        std::string filename = CCFileUtils::sharedFileUtils()->fullPathForFilename("test.db");
        result = sqlite3_open(filename.c_str(), &pDB);
        CCLog(filename.c_str());
        if( result != SQLITE_OK )
            CCLog( "       ,   :%d ,    :%s
" , result, errMsg ); else CCLog(" ");

3) 테이블 생 성과 데이터 삽입:
        //   ,  ID   ,     
        result=sqlite3_exec( pDB, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) ) " , NULL, NULL, &errMsg );
        if( result != SQLITE_OK )
            CCLog( "     ,   :%d ,    :%s
" , result, errMsg ); // sqlstr=" insert into MyTable_1( name ) values ( ' ' ) "; result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) CCLog( " , :%d , :%s
" , result, errMsg ); // sqlstr=" insert into MyTable_1( name ) values ( ' ' ) "; result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) CCLog( " , :%d , :%s
" , result, errMsg ); // sqlstr=" insert into MyTable_1( name ) values ( ' ' ) "; result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) CCLog( " , :%d , :%s
" , result, errMsg );

4) 조회
데이터 베 이 스 를 조회 하 는 방법 은 두 가지 가 있 습 니 다. 1) sqlite 3prepare_v2 + sqlite3_step + sqlite3_column_text + sqlite3_finalize; 2) sqlite3_exec;
첫 번 째 방식, 참고 하 세 요 ​http://www.raywenderlich.com/913/sqlite-101-for-iphone-developers-making-our-app
- (NSArray *)failedBankInfos {
 
    NSMutableArray *retval = [[[NSMutableArray alloc] init] autorelease];
    NSString *query = @"SELECT id, name, city, state FROM failed_banks 
        ORDER BY close_date DESC";
    sqlite3_stmt *statement;
    if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) 
        == SQLITE_OK) {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            int uniqueId = sqlite3_column_int(statement, 0);
            char *nameChars = (char *) sqlite3_column_text(statement, 1);
            char *cityChars = (char *) sqlite3_column_text(statement, 2);
            char *stateChars = (char *) sqlite3_column_text(statement, 3);
            NSString *name = [[NSString alloc] initWithUTF8String:nameChars];
            NSString *city = [[NSString alloc] initWithUTF8String:cityChars];
            NSString *state = [[NSString alloc] initWithUTF8String:stateChars];
            FailedBankInfo *info = [[FailedBankInfo alloc] 
                initWithUniqueId:uniqueId name:name city:city state:state];                        
            [retval addObject:info];
            [name release];
            [city release];
            [state release];
            [info release];
        }
        sqlite3_finalize(statement);
    }
    return retval;
 
}
@end

두 번 째 방식, 참고 ​http://forum.pellesc.de/index.php?topic=3669.0
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
	NotUsed = 0;
	int i;
	for (i = 0; i < argc; i++)
	{
		printf("%s = %s
", azColName[i], argv[i] ? argv[i] : "NULL"); } printf("
"); return 0; } int main(int argc, char **argv) { sqlite3 *db; char *zErrMsg = 0; int rc; rc = sqlite3_open("test.db3", &db); if (rc == SQLITE_OK) { rc = sqlite3_exec(db, "CREATE TABLE test (id INTEGER NOT NULL, text VARCHAR(100))" , callback, 0, &zErrMsg); if (rc != SQLITE_OK) fprintf(stderr, "SQL error: %s
", zErrMsg); rc = sqlite3_exec(db, "INSERT INTO test VALUES (1, 'text1')" , callback, 0, &zErrMsg); if (rc != SQLITE_OK) fprintf(stderr, "SQL error: %s
", zErrMsg); rc = sqlite3_exec(db, "SELECT * FROM test" , callback, 0, &zErrMsg); if (rc != SQLITE_OK) fprintf(stderr, "SQL error: %s
", zErrMsg); sqlite3_close(db); } else { fprintf(stderr, "Can't open database: %s
", sqlite3_errmsg(db)); sqlite3_close(db); return 1; } return 0; }

공식 문서 ​http://sqlite.org/cintro.html
1.1 Typical Usage Of Core Routines And Objects
An application that wants to use SQLite will typically use sqlite3_open() to create a single database connection during initialization. Note that sqlite3_open() can be used to either open existing database files or to create and open new database files. While many applications use only a single database connection, there is no reason why an application cannot call sqlite3_open() multiple times in order to open multiple database connections - either to the same database or to different databases. Sometimes a multi-threaded application will create separate database connections for each threads. Note too that is not necessary to open separate database connections in order to access two or more databases. A single database connection can be made to access two or more databases at one time using the ATTACH SQL command.
Many applications destroy their database connections using calls to sqlite3_close() at shutdown. Or, for example, an application might open database connections in response to a File->Open menu action and then destroy the corresponding database connection in response to the File->Close menu.
To run an SQL statement, the application follows these steps:
Create a prepared statement using sqlite3_prepare(). Evaluate the prepared statement by calling sqlite3_step() one or more times. For queries, extract results by calling sqlite3_column() in between two calls to sqlite3_step(). Destroy the prepared statement using sqlite3_finalize(). The foregoing is all one really needs to know in order to use SQLite effectively. All the rest is just ornamentation and detail.
2.0 Convenience Wrappers Around Core Routines
The sqlite3_exec() interface is a convenience wrapper that carries out all four of the above steps with a single function call. A callback function passed into sqlite3_exec() is used to process each row of the result set. The sqlite3_get_table() is another convenience wrapper that does all four of the above steps. The sqlite3_get_table() interface differs from sqlite3_exec() in that it stores the results of queries in heap memory rather than invoking a callback.
It is important to realize that neither sqlite3_exec() nor sqlite3_get_table() do anything that cannot be accomplished using the core routines. In fact, these wrappers are implemented purely in terms of the core routines.
또한 ios 에는 sqlite 를 위 한 패키지 가 있 습 니 다. coreData (android 에 도 자바 버 전의 패키지 가 있 습 니 다. sqliteHelper 라 고 합 니 다).나중에 시간 나 면 좀 더 연구 해 보 자.
오픈 소스 의 sqlite 도 구 를 추가 합 니 다: SQLite Database Browser
참고 글:
참고 하 세 요: ​http://4137613.blog.51cto.com/4127613/772518
하나의 해결 방안: ​http://stackoverflow.com/questions/10438089/using-sqlite-with-ios-very-beginner-program
두 편의 질 이 비교적 높 은 입문 강좌:
​http://www.raywenderlich.com/902/sqlite-101-for-iphone-developers-creating-and-scripting
​http://www.raywenderlich.com/913/sqlite-101-for-iphone-developers-making-our-app

좋은 웹페이지 즐겨찾기