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`