2007-02-28

SQLite database中获取tables

SQLite是个不错的文件型数据库,轻量级的。有很多程序中都使用了这个,如:FireFox。
如果只是想在单机上储存一些信息,希望对这些数据能够像操作数据库那样,又不想安装MySQL那些专业的数据库,这个是个很好的选择。 :)

SQLite的API接口中没有提供获取相应database中所有表的接口。
不过SQLite的database中默认有个"sqlite_master"表,储存了该database的相关信息,包括了该database包含的所有表。

// 获取所有表名,并按名称排列
SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name;
// 获取所有索引,并按名称排列
SELECT name FROM sqlite_master WHERE type = 'index' ORDER BY name;


以下是获取某database中的所有表名(当然其中不包括"sqlite_master"本身)
typedef struct _table_names {
    int count;    // table count
    char **text;    // table name
} table_names;

void getTables ()
{
    const char *szSQL = "SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;";
    char **zRet = 0;
    int nrow, ncol;
    int i;
    if (sqlite3_get_table(pDb, szSQL, &zRet, &nrow, &ncol, &zErrMsg)) {
        fprintf (stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free (zErrMsg);
        return;
    }
    printf ("row[%d] column[%d]\n", nrow, ncol);
    tn.text = (char**) malloc (nrow*ncol*sizeof(char*));
    // 注意:这里zRet[0]是该列的表头,数据从zRet[1]开始。
    // (如果结果有3列则zRet[0],zRet[1],zRet[2]是表头)
    for (i=ncol; i<=(nrow*ncol); i++) {
        printf (" %s\t", zRet[i]);
        tn.text[i-ncol] = strdup (zRet[i]);
        tn.count++;
    }
    printf("\n");

    sqlite3_free_table (zRet);
} /* getTables () */

//EOF

0 comments: