cocos2dx 에서 sqlite 를 어떻게 사용 하여 데 이 터 를 기록 합 니까?
11700 단어 cocos2dx
sqlite 가 cocos2dx 에서 의 통합 을 조사 하 는 데 시간 이 걸 렸 는데 이 과정 에서 문제 가 생 겨 서 특별히 기록 했다.
1) sqlite 소스 코드 를 다운로드 하고 프로젝트 에 압축 을 풀 었 습 니 다. [이 단 계 는 필요 없습니다. cocos2dx 에 sqlite 가 추가 되 었 습 니 다. 헤더 파일 sqlite 3. h 만 참조 하면 됩 니 다]:
소스 코드 위치: http://www.sqlite.org/download.html
프로젝트 에 압력 을 줄 입 니 다 (셸. 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
xcode를 통해cocos2dx 응용 프로그램 가져오기version Xcode cocos2dx osx xcode와cocos2dx 설치 완료를 전제로 코코스 명령으로 응용 프로그램의 모형을 만들다. 나는 Jet이라는 이름의 앱을 사용했다. 동작을 확인하다. 만들어서 He...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.