簡體   English   中英

在C應用程序中使用sqlite3顯示數據

[英]Display data using sqlite3 in C application

我正在開發C程序,它將幫助我顯示瀏覽器的歷史記錄。 每當我在sqlite中運行任何sql命令時,它都會在文件中顯示所有歷史記錄。 這就是Sql命令(包含chrome歷史記錄的歷史文件)!

sqlite3歷史記錄“選擇datetime(last_visit_time / 1000000-11644473600,'unixepoch'),URL按last_visit_time desc的url順序排列”> history_export.txt

例如,它給我一個很好的結果

2017-06-28 10:20:20 | stackoverflow.com
2017-06-28 8:20:20 google.com 2017-06-28 07.10:20 | facebook.com

等等

然后我希望使用C Application獲得相同的結果。 這是我的代碼:

int main()
{
    sqlite3 *db;
    char *err_msg = 0;
    int rc = sqlite3_open("c:/Users/XXXXXX/AppData/Local/Google/Chrome/User Data/Default/History", &db);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Cannot open database: %s\n",
        sqlite3_errmsg(db));
        sqlite3_close(db);

        return 1;
    }
   //the same command works fine in sqlite3
    char *sql = "select datetime(last_visit_time/1000000-11644473600,'unixepoch'),url from  urls order by last_visit_time desc";

    rc = sqlite3_exec(db, sql, callback, 0, &err_msg);

    if (rc != SQLITE_OK ) {

        fprintf(stderr, "Failed to select data\n");
        fprintf(stderr, "SQL error: %s\n", err_msg);

        sqlite3_free(err_msg);
        sqlite3_close(db);

        return 1;
    }

    sqlite3_close(db);
system ("pause");
    return 0;
}
//declaration of callback function i think that the problem is here
int callback(void *NotUsed, int argc, char **argv,
                    char **azColName) {

    NotUsed = 0;
    FILE *fp ;
    fp=fopen("C:/sqlite/historyc.txt","w");

    for (int i = 0; i < argc; i++) {

        fprintf(fp,"%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");

    }

    printf("\n");

    return 0;
}

它顯示了2到3行的舊訪問(20/03/2017 ..),但是我希望得到與sql命令相同的結果。 問題可能出在回調函數上。

fopen(...,"w")更改為fopen(...,"a+")解決我的問題。 這是因為您的代碼當前每次打開文件時都會擦除文件,該文件是每一行(覆蓋上一行)。 a+將附加到現有文件上而不是擦除它,因此您將獲得文件中打印的所有行。 但是,每次運行該程序時,您都需要手動刪除historyc.txt,否則它將不斷增長。

當然,在這種情況下, "a+"只是一個骯臟的技巧,而不是非常有效的技巧。 另一個略微更有效的手段是使*fp全球,然后打開你的文件之前exec語句(並刪除*fpopen的回調函數)。 仍然很臟,但是至少這意味着該文件僅被打開了一次。

碼...

#include <stdio.h>
#include <sqlite3.h>

int callback(void*, int, char**, char**);

int main(int argc, char** argv) {
    sqlite3 *db;
    char *err_msg = 0;
    int rc = sqlite3_open("your_db_file", &db);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Cannot open database: %s\n",
        sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }
    char *sql = "select datetime(last_visit_time/1000000-11644473600,"
                "'unixepoch') as visit_time,url from  urls order by "
                "last_visit_time desc";
    rc = sqlite3_exec(db, sql, callback, 0, &err_msg);
    if (rc != SQLITE_OK ) {
        fprintf(stderr, "Failed to select data\n");
        fprintf(stderr, "SQL error: %s\n", err_msg);
        sqlite3_free(err_msg);
        sqlite3_close(db);
        return 0;
    }
    sqlite3_close(db);
    return 0; 
}

int callback(void *NotUsed, int argc, char **argv,
                    char **azColName) {
    NotUsed = 0;
    FILE *fp ;
    // Very dirty but it works for me
    fp=fopen("/tmp/historyc.txt","a+");
    for (int i = 0; i < argc; i++) {
        fprintf(fp,"%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM