2012-02-14 51 views
4

我想通過壓縮最大限度地減少帶有大量HTML的sqlite3數據庫。我用python來創建sqlite3數據庫,我試圖在Android上正確解壓縮。閱讀sqlite3數據庫中的gzipped字符串(python寫,Java Android閱讀)

我使用gzip來壓縮HTML並將其作爲BLOB存儲在數據庫中。下面是我寫的創建sqlite3的DB(在Python)代碼:

from sys import stdin, argv 
import sqlite3 
import gzip 
import cStringIO 

def compressBuf(buf): 
    zbuf = cStringIO.StringIO() 
    zfile = gzip.GzipFile(mode = 'wb', fileobj = zbuf, compresslevel = 9) 
    zfile.write(buf) 
    zfile.close() 
    return zbuf.getvalue() 

conn = sqlite3.connect(argv[1]) 
conn.text_factory = str 
c = conn.cursor() 

c.execute('''CREATE TABLE articles (
    id INTEGER NOT NULL PRIMARY KEY, 
    name TEXT, category TEXT, html BLOB);''') 

c.execute(' CREATE INDEX name_index on articles (name); ') 

for line in stdin: 
    line = line.strip().split('\t') 
    line[-1] = sqlite3.Binary(compressBuf(line[-1]))  

    c.execute('INSERT INTO articles VALUES (?, ?, ?, ?);', line) 

conn.commit() 
c.close() 
conn.close() 

下面是Android的代碼片段:

Cursor cursor = db.rawQuery("SELECT html FROM articles WHERE id = " + id + " limit 1;", null); 
cursor.moveToFirst(); 
byte[] zhtml = cursor.getBlob(0); 
ByteArrayInputStream is = new ByteArrayInputStream(zhtml); 
GZIPInputStream gis = new GZIPInputStream(is, zhtml.length); 

我得到以下異常抱怨的頭不正確的:

java.io.IOException: unknown format (magic number 213c) 
    at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:84) 
    at tw.cse.o0o.MyApp.WebServer$ArticleHandler$1.writeTo(WebServer.java:196) 
    at org.apache.http.entity.EntityTemplate.writeTo(EntityTemplate.java:76) 
    at org.apache.http.impl.entity.EntitySerializer.serialize(EntitySerializer.java:97) 
    at org.apache.http.impl.AbstractHttpServerConnection.sendResponseEntity(AbstractHttpServerConnection.java:182) 
    at org.apache.http.protocol.HttpService.handleRequest(HttpService.java:209) 
    at tw.cse.o0o.MyApp.WebServer.run(SQLHelper.java:90) 

使用Python解釋器,我可以確認compressBuf用正確的gzip的幻數0x1f8b返回功能:

>>> compressBuf('test') 
'\x1f\x8b\x08\x00 \xba:O\x02\xff+I-.\x01\x00\x0c~\x7f\xd8\x04\x00\x00\x00' 

[編輯]

好吧,這就是我發現:

在Nexus One的,我的getBlob()函數自動解壓縮的二進制數據,無論是如果zlib的或gzip的。錯誤日誌中的213c是原始html的前兩個字符。 但是,三星Galaxy Tab(第一代)並非如此。我仍然試圖找到一種方法來解壓我的Galaxy Tab。

回答

0

'\x21\x3c - >>'!<'或許也許'<!'取決於字節順序。我建議你調查(二進制)壓縮數據在傳輸過程中被加速的可能性。

+0

謝謝!看起來BLOB是通過getBlob(0)自動解壓縮的。我不知道這是爲什麼... – 2012-02-15 07:52:17