OrmLiteSqliteOpenHelper 教學 (包含寫入圖片) (java)
===
### 環境設定
安裝 OrmLiteSqliteOpenHelper API,[下載 orm jar](https://ormlite.com/releases/)
有三包要下載,下載完放在路徑 `Project/ app/ libs ` 底下,全選按右鍵 → **Add As Library**


### 程式碼
- `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 的內部儲存空間

因隱私權關係,將本機相關 App package name 遮罩起來

透過下載 [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`