Android SQLite 數據庫 存取 BLOB 二進制

Android SQLite 數據庫 存取 BLOB 二進制

轉載 2014年07月21日 16:50:01


作者: 東方閒仁

   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;

    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章