对应源码位置:cocos2d-x-3.3\cocos\storage\local-storage\localStorage
localStorage 的接口
cocos2d-x提供了简单的本地数据存储的功能,其主要是由对sqlite的封装来实现。
void CC_DLL
localStorageInit( const std
::string
& fullpath
= "");
void CC_DLL
localStorageFree();
void CC_DLL
localStorageSetItem( const std
::string
& key
, const std
::string
& value
);
std
::string CC_DLL
localStorageGetItem( const std
::string
& key
);
void CC_DLL
localStorageRemoveItem( const std
::string
& key
);
localStorage 的接口的实现
static int _initialized
= 0;
static sqlite3
*_db
;
static sqlite3_stmt
*_stmt_select
;
static sqlite3_stmt
*_stmt_remove
;
static sqlite3_stmt
*_stmt_update
;
static void localStorageCreateTable()
{
const char *sql_createtable
= "CREATE TABLE IF NOT EXISTS data(key TEXT PRIMARY KEY,value TEXT);";
sqlite3_stmt
*stmt
;
int ok
=sqlite3_prepare_v2(_db
, sql_createtable
, -1, &stmt
, nullptr);
ok
|= sqlite3_step(stmt
);
ok
|= sqlite3_finalize(stmt
);
if( ok
!= SQLITE_OK
&& ok
!= SQLITE_DONE
)
printf("Error in CREATE TABLE\n");
}
void localStorageInit( const std
::string
& fullpath
)
{
if( ! _initialized
) {
int ret
= 0;
if (fullpath
.empty())
ret
= sqlite3_open(":memory:",&_db
);
else
ret
= sqlite3_open(fullpath
.c_str(), &_db
);
localStorageCreateTable();
const char *sql_select
= "SELECT value FROM data WHERE key=?;";
ret
|= sqlite3_prepare_v2(_db
, sql_select
, -1, &_stmt_select
, nullptr);
const char *sql_update
= "REPLACE INTO data (key, value) VALUES (?,?);";
ret
|= sqlite3_prepare_v2(_db
, sql_update
, -1, &_stmt_update
, nullptr);
const char *sql_remove
= "DELETE FROM data WHERE key=?;";
ret
|= sqlite3_prepare_v2(_db
, sql_remove
, -1, &_stmt_remove
, nullptr);
if( ret
!= SQLITE_OK
) {
printf("Error initializing DB\n");
}
_initialized
= 1;
}
}
void localStorageFree()
{
if( _initialized
) {
sqlite3_finalize(_stmt_select
);
sqlite3_finalize(_stmt_remove
);
sqlite3_finalize(_stmt_update
);
sqlite3_close(_db
);
_initialized
= 0;
}
}
void localStorageSetItem( const std
::string
& key
, const std
::string
& value
)
{
assert( _initialized
);
int ok
= sqlite3_bind_text(_stmt_update
, 1, key
.c_str(), -1, SQLITE_TRANSIENT
);
ok
|= sqlite3_bind_text(_stmt_update
, 2, value
.c_str(), -1, SQLITE_TRANSIENT
);
ok
|= sqlite3_step(_stmt_update
);
ok
|= sqlite3_reset(_stmt_update
);
if( ok
!= SQLITE_OK
&& ok
!= SQLITE_DONE
)
printf("Error in localStorage.setItem()\n");
}
std
::string
localStorageGetItem( const std
::string
& key
)
{
assert( _initialized
);
std
::string ret
;
int ok
= sqlite3_reset(_stmt_select
);
ok
|= sqlite3_bind_text(_stmt_select
, 1, key
.c_str(), -1, SQLITE_TRANSIENT
);
ok
|= sqlite3_step(_stmt_select
);
const unsigned char *text
= sqlite3_column_text(_stmt_select
, 0);
if (text
)
ret
= (const char*)text
;
if( ok
!= SQLITE_OK
&& ok
!= SQLITE_DONE
&& ok
!= SQLITE_ROW
)
printf("Error in localStorage.getItem()\n");
return ret
;
}
void localStorageRemoveItem( const std
::string
& key
)
{
assert( _initialized
);
int ok
= sqlite3_bind_text(_stmt_remove
, 1, key
.c_str(), -1, SQLITE_TRANSIENT
);
ok
|= sqlite3_step(_stmt_remove
);
ok
|= sqlite3_reset(_stmt_remove
);
if( ok
!= SQLITE_OK
&& ok
!= SQLITE_DONE
)
printf("Error in localStorage.removeItem()\n");
}
最后
下一篇分析 HttpClient 的实现。
转载请注明原文地址: https://yun.8miu.com/read-58388.html