如何使用 sqlite3_exec 函数的第 4 个参数?
How to work with the 4th argument of the sqlite3_exec function?
我想将 std::list
传递给我的回调函数。我知道我必须在回调函数中使用 void*
,但是在使用 void*
时如何将对象插入列表?
//function will insert to a list of albums (data) a new album
int callbackAlbums(void* data, int argc, char** argv, char** azColName)
{
Album album;
for(int i = 0; i < argc; i++)
{
if (std::string(azColName[i])) == "NAME")
{
album.setName(std::string(argv[i]));
}
else if (std::string(azColName[i])) == "CREATION_DATE")
{
album.setCreationDate(std::string(argv[i]));
}
else if (std::string(azColName[i])) == "USER_ID")
{
album.setOwner(atoi(argv[i]));
}
}
data.push_back(album);
return 0;
}
//function will return a list of all albums.
const std::list<album> DatabaseAccess::getAlbums()
{
const char* sqlStatement = "SELECT * FROM ALBUMS;";
std::list<Album> albums;
char* errMessage = "";
int res = sqlite3_exec(this->_db, sqlStatement, callbackAlbums, (void*)&albums, &errMessage);
}
我尝试将回调函数中的 void*
更改为 std::list<Album>
并希望 sqlite3_exec()
与该回调函数一起工作。
您已经知道如何将 list*
转换为 void*
(顺便说一句,显式转换是多余的)。只需在回调中做相反的转换,例如:
int callbackAlbums(void* data, int argc, char** argv, char** azColName)
{
Album album;
...
std::list<Album>* albums = (std::list<Album>*)data;
albums->push_back(album);
...
}
并且不要忘记 return
您的 std::list
来自 getAlbums()
:
const std::list<album> DatabaseAccess::getAlbums()
{
std::list<Album> albums;
...
int res = sqlite3_exec(..., callbackAlbums, &albums, ...);
...
return albums;
}
我想将 std::list
传递给我的回调函数。我知道我必须在回调函数中使用 void*
,但是在使用 void*
时如何将对象插入列表?
//function will insert to a list of albums (data) a new album
int callbackAlbums(void* data, int argc, char** argv, char** azColName)
{
Album album;
for(int i = 0; i < argc; i++)
{
if (std::string(azColName[i])) == "NAME")
{
album.setName(std::string(argv[i]));
}
else if (std::string(azColName[i])) == "CREATION_DATE")
{
album.setCreationDate(std::string(argv[i]));
}
else if (std::string(azColName[i])) == "USER_ID")
{
album.setOwner(atoi(argv[i]));
}
}
data.push_back(album);
return 0;
}
//function will return a list of all albums.
const std::list<album> DatabaseAccess::getAlbums()
{
const char* sqlStatement = "SELECT * FROM ALBUMS;";
std::list<Album> albums;
char* errMessage = "";
int res = sqlite3_exec(this->_db, sqlStatement, callbackAlbums, (void*)&albums, &errMessage);
}
我尝试将回调函数中的 void*
更改为 std::list<Album>
并希望 sqlite3_exec()
与该回调函数一起工作。
您已经知道如何将 list*
转换为 void*
(顺便说一句,显式转换是多余的)。只需在回调中做相反的转换,例如:
int callbackAlbums(void* data, int argc, char** argv, char** azColName)
{
Album album;
...
std::list<Album>* albums = (std::list<Album>*)data;
albums->push_back(album);
...
}
并且不要忘记 return
您的 std::list
来自 getAlbums()
:
const std::list<album> DatabaseAccess::getAlbums()
{
std::list<Album> albums;
...
int res = sqlite3_exec(..., callbackAlbums, &albums, ...);
...
return albums;
}