2016-04-13 11 views
1

Lütfen beni yanlış anladığım yerde düzeltin.Neden sqlite3_open için çift işaretçiyi kullanıyoruz ** ve sqlite3_prepare için biz pointer kullanıyoruz *

Bu cevabı https://stackoverflow.com/a/833124/5175709 okudum ve anladığım şu ki, nesne uzayabilir ve alan bittiğinden bellek alanı da değişebilirdi. Fakat burada iki sqlite3 sözdizimi nesneye farklı şekilde başvuruyor. NİYE YA?

Elimizdeki sqlite3_open: sqlite3 **ppDb

SQLITE_API int SQLITE_STDCALL sqlite3_open(
    const char *filename, /* Database filename (UTF-8) */ 
    sqlite3 **ppDb   /* OUT: SQLite db handle */ 

Ve sqlite3_prepare için elimizde: nedense sana bir veritabanı bağlantısı nesnesi vermek sqlite3 *db

SQLITE_API int SQLITE_STDCALL sqlite3_prepare_v2(
    sqlite3 *db,   /* Database handle */ 
    const char *zSql,  /* SQL statement, UTF-8 encoded */ 
    int nByte,    /* Maximum length of zSql in bytes. */ 
    sqlite3_stmt **ppStmt, /* OUT: Statement handle */ 
    const char **pzTail  /* OUT: Pointer to unused portion of zSql */ 

cevap

2

sqlite3_open ihtiyaçlarını; yani sqlite3 nesnesi.

İnsanların içeriden erişmesini önlemek için, sqlite3.h, sqlite3, opak bir yapı olarak bildirir. Bu, ne tuttuğunu bilmediğiniz için sqlite3 için alan ayıramayacağınız anlamına gelir; SQLite kütüphanesi sizin için ayırmalı ve size bir işaretçi vermelidir (sqlite3*).

Şimdi, bir DB'yi açan ve bağlantı nesnesine bir işaretçi döndüren bir sqlite3* sqlite3_open(...); hipotetik işlevimiz var. Ama bekle; bir hata olursa ne olur? NULL'u döndürebiliriz, ancak geliştiricinin "veritabanı salt okunur", "veritabanı bozuk" veya diğer hatalardan "veritabanı mevcut değil" hatasını ayırt etmesi gerekiyor?

Bunun yerine, sqlite3_open tamsayı dönüş kodunu döndürür ve bağlantı tanıtıcısını, açılmayı başarırsa ppDB parametresinin işaret ettiği belleğe yazar.

sqlite3_open

genellikle böyle kullanılır:

sqlite3* myDB; 
int status = sqlite3_open("/path/to/db", &myDB); 
if(status != SQLITE_OK) { 
    // error occured 
    return; 
} 
// sqlite3_open wrote a database pointer to myDB, use it here 
status = sqlite3_prepare_v2(myDB, "SELECT * FROM whatever", -1, NULL, NULL); 
// ... 
+0

Mükemmel cevap C32 sayesinde. Yani bunu yaptığımızın tek sebebi koruma amaçlı mı? Yani bir hata varsa, sqlite3 * 'nil' i işaret ederdi? Hafızanın genişlemesi ne olacak? Hala bunun üzerinde kafam karıştı. Bu konuda da ayrıntılı bilgi verir misiniz? – Honey

+0

@ asma22 Bir hatanın meydana gelip gelmediğini tespit etmenin tek yolu, dönüş değerine bakmaktır; [SQLite hala açılmasa bile bir veritabanı işaretçisi yazacaktır] (http://sqlite.org/c3ref/open.html) (büyük olasılıkla bundan bir hata mesajı alabilirsiniz). SQLite kullanarak 'sqlite3' yapısının tam yapısı programdan gizlendiğinden, SQLite, API veya ABI'yi kesmeden, alandan alan ekleme veya çıkarma (kullandığı bellek miktarını değiştirebilir) için ücretsizdir. –

İlgili konular