---
# System prepended metadata

title: OrmLiteSqliteOpenHelper 教學 (包含寫入圖片) (java)
tags: [Third-party]

---

OrmLiteSqliteOpenHelper 教學 (包含寫入圖片) (java)
===

### 環境設定

安裝 OrmLiteSqliteOpenHelper API，[下載 orm jar](https://ormlite.com/releases/)

有三包要下載，下載完放在路徑 `Project/ app/ libs ` 底下，全選按右鍵 → **Add As Library**

![](https://i.imgur.com/T4OZNLf.png)

![](https://i.imgur.com/96dPoBD.png)




### 程式碼

- `DBHelper.java`

```java=

public class DBHelper extends OrmLiteSqliteOpenHelper {
    private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());

    // 資料庫名稱
    private static final String DATABASE_NAME = "my_sql" + ".sqlite";
    
    // 資料庫版本
    private static final int DATABASE_VERSION = 1;
    
    private Dao<User, Integer> userDao;

    private static DBHelper instance = null;

    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {

        try {
            TableUtils.createTable(connectionSource, User.class);
        } catch (SQLException e) {
            logger.error(String.valueOf(e));
        }

    }

    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int i, int i1) {
        try {
            TableUtils.dropTable(connectionSource, User.class, false);
            onCreate(database,connectionSource);
        } catch (SQLException e) {
            logger.error(String.valueOf(e));
        }
    }

    
    // DAO: 資料存取物件
    // 每個 Table 都必須建立一個 Dao 的對應，然後才能對其 Table 進行 SQLite 的操作
    // 此範例只建立一個 User Table，故只需建立一個即可
    
    // 取得操作 'User' Table 的 Dao 物件
    public Dao<User, Integer> getUserDao() throws SQLException {
        if (userDao == null){
            userDao = getDao(User.class);
        }
        return userDao;
    }

    @Override
    public void close() {
        userDao = null;
        super.close();
    }

    public static synchronized DBHelper getInstance(Context context) {
        if (instance == null) {
            instance = new DBHelper(context);
        }
        return instance;
    }
}

```

- 建立資料庫中的 Table：`User.java` 

```java=

// 資料庫的 Table 名稱
@DatabaseTable(tableName = "userList")
public class User {

    // @DatabaseField：定義資料欄位名稱
    // generatedId：true 表示 id 為系統自動產生(遞增)
    // columnName：表示 table 中的欄位
    // dataType = DataType.SERIALIZABLE：若存的是圖片，必須聲明此資料類型
    
    @DatabaseField(generatedId = true) private int id;

    @DatabaseField(columnName = "name") private String name;

    @DatabaseField(columnName = "img", dataType = DataType.SERIALIZABLE) private byte [] img;

    public User() {
    }

    public User(String name, byte[] img) {
        this.name = name;
        this.img = img;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setImg(byte[] img) {
        this.img = img;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public byte[] getImg() {
        return img;
    }
}
```

- 測試：寫入 DB

```java=

    DBHelper dbHelper = DBHelper.getInstance(context);

    // 測試的來源圖片, 放在 res/raw/sample_jpg.jpg
    InputStream is = context.getResources().openRawResource(R.raw.sample_jpg);
    
    // 圖片壓縮
    BufferedInputStream bis = new BufferedInputStream(is);
    Bitmap bmp = BitmapFactory.decodeStream(bis);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bmp.compress(Bitmap.CompressFormat.PNG, 100, baos);

    // 轉 byte array 格式
    byte[] image = baos.toByteArray();

    try {
        User user = new User("Fred", image);
        
        // 寫入 db
        dbHelper.getUserDao().create(user);

    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
```

- 測試：讀取 DB

```java=
    
    DBHelper dbHelper = DBHelper.getInstance(context);

    byte[] img = new byte[0];
    try {
        
        // 根據系統自動產生的 id 取得 user data；因目前只寫入一筆，系統產生的 id 會從 1 開始遞增，故 queryForId(1)
        img = dbHelper.getUserDao().queryForId(1).getImg();
        
        // 轉 Bitmap
        Bitmap bmp = BitmapFactory.decodeByteArray(img, 0, img.length);

        // 顯示
        ImageView imageView = new ImageView(context);
        imageView.setImageBitmap(bmp);
        Toast toast = new Toast(context);
        toast.setView(imageView);
        toast.setDuration(Toast.LENGTH_SHORT);
        toast.show();


    } catch (SQLException throwables) {
        throwables.printStackTrace();
    }
```

### 驗證
小技巧：利用 IDE 提供的功能，可以查看該 App 的內部儲存空間

![](https://i.imgur.com/SEJojhX.png)

因隱私權關係，將本機相關 App package name 遮罩起來
![](https://i.imgur.com/e12Z8u5.png)

透過下載 [DB Browser for SQLite](https://sqlitebrowser.org/) 查看 `.sqlite` 的檔案。

## Ref.
[Android两种数据库操作方式入门介绍](https://www.jianshu.com/p/0d8fa55d603b)
[Android两种数据库操作方式入门介绍(備份)](https://blog.csdn.net/ljp12345/article/details/52057636)
[ORMLite and Images saved as BLOB on Android](https://stackoverflow.com/a/6836337) 寫入圖片的宣告
[OrmLite Releases](https://ormlite.com/releases/)

###### tags: `Third-party`