Android SQLite 數據庫 存取 BLOB 二進制
作者: 東方閒仁
Android開發時用到二進制數據(也可以理解爲BYTE數組)的SQLite存取,可能會有人對存取如mp3、圖片類文件困惑,其實p3、圖片類文件讀到內存就可理解爲BYTE數組,只要在 下面的基礎上增加將文件讀到BYTE數組就可以了,其他操作是相同的(在網上搜了一段代碼放下面了)。
寫此文的目的是方便自己今後查詢,當然碰巧方便了其他人就當我奉獻了:)
package com.Jung.DH;
import java.io.ByteArrayOutputStream;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;
// 數據操作類
public class testSeedDB {
private Context mContext = null;
private testDBHelper mDBHelper = null;
private SQLiteDatabase mTestDatabase = null;
private static final String DATABASE_NAME = "DHSeedData.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_SEED = "TBseed";
private static final String TABLE_INFO = "TBinfo";
// 構造函數,一個引用類的Context作爲參數
public testSeedDB(Context context){
mContext = context;
}
// 打開數據庫
public void open(){
mDBHelper = new testDBHelper(mContext,DATABASE_NAME, null, DATABASE_VERSION);
mTestDatabase = mDBHelper.getWritableDatabase();
Log.i("testSeedDB", "open");
}
// Close the database
public void close(){
mDBHelper.close();
}
public void CreateSeedTable() {
// 創建數據表是先刪除以前的,以免出錯
String sql = "drop table "+ TABLE_SEED;
try {
mTestDatabase.execSQL(sql);
} catch (SQLException e) {
}
// second create table
sql = "CREATE TABLE IF NOT EXISTS " + TABLE_SEED
+ " (ID INTEGER PRIMARY KEY, ToyID INTEGER,ToySeed BLOB,ToyMemo TEXT);";
try {
mTestDatabase.execSQL(sql);
} catch (SQLException ex) {
}
Log.i("testSeedDB", "CreateSeedTable");
}
public void CreateInfoTable() {
// first delete old table
String sql = "drop table"+ TABLE_INFO;
try {
mTestDatabase.execSQL(sql);
} catch (SQLException e) {
}
// second create table
sql = "CREATE TABLE IF NOT EXISTS " + TABLE_INFO
+ " (ToyID INTEGER PRIMARY KEY,ToySeed BLOB,ToyMemo TEXT not null);";
try {
mTestDatabase.execSQL(sql);
} catch (SQLException ex) {
}
}
public void CleanSeedTable() {
try {
mTestDatabase.delete(TABLE_SEED, null, null);
} catch (SQLException e) {
}
Log.i("testSeedDB", "ClearSeedTable");
}
public void insertSeedItem(long ToyID, byte[]ToySeed) {
String sqlstr = "insert into " + TABLE_SEED + " (ToyID, ToySeed,ToyMemo) values (?,?,?);";
Object[] args = new Object[]{ToyID,ToySeed,null};
try{
mTestDatabase.execSQL(sqlstr,args);
} catch (SQLException ex) {
}
Log.i("testSeedDB", "insertSeedItem");
}
public byte[] GetSeedItem(long ToyID) {
Cursor cur;
byte[] strSeed = null;
String col[] = {"ToyID", "ToySeed" ,"ToyMemo"};
String strToy = "ToyID=" + new Integer((int) ToyID).toString();
try{
cur = mTestDatabase.query(TABLE_SEED, col, strToy, null, null, null, null);
cur.moveToFirst();
strSeed = cur.getBlob(1);
} catch (SQLException ex) {
}
if (cur !=null) cur.close;
Log.i("testSeedDB", strToy);
return strSeed;
}
// 數據操作的基礎類,作爲數據操作的內嵌子類
public class testDBHelper extends SQLiteOpenHelper {
public testDBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public voidonCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
}
@Override
public voidonUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
} // end of testDBHelper
}
// 讀文件到 BYTE 來自網上 未驗證
//http://www.a3gs.com/BookViews.asp?InfoID=2865&ClassID=935
導入包:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
實現代碼:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
getBytesFromFile(new File("C:\\aaa.txt"));
}catch(IOException e){
System.out.println("IOException");
}
}
// 返回一個byte數組
public static byte[] getBytesFromFile(File file) throws IOException {
InputStream is = new FileInputStream(file);
// 獲取文件大小
long length = file.length();
if (length > Integer.MAX_VALUE) {
// 文件太大,無法讀取
throw new IOException("File is to large "+file.getName());
}
// 創建一個數據來保存文件數據
byte[] bytes = new byte[(int)length];
// 讀取數據到byte數組中
int offset = 0;
int numRead = 0;
while (offset < bytes.length
&& (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
offset += numRead;
}
// 確保所有數據均被讀取
if (offset < bytes.length) {
throw new IOException("Could not completely read file "+file.getName());
}
// Close the input stream and return bytes
is.close();
return bytes;
}
}