简化ImageDbHelper
操作。
@Entity(tableName = "images")
public class ImageInfo {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id")
private long id;
@ColumnInfo(name = "md5")
private String md5;
@ColumnInfo(name = "path")
private String path;
@ColumnInfo(name = "size")
private long size;
@ColumnInfo(name = "width")
private int width;
@ColumnInfo(name = "height")
private int height;
@ColumnInfo(name = "date_added")
private long dateAdded;
// Getters and setters...
}
@Dao
public interface ImageDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
long insertImage(ImageInfo imageInfo);
@Query("SELECT * FROM images WHERE md5 = :md5 LIMIT 1")
ImageInfo getImageByMd5(String md5);
@Query("SELECT * FROM images ORDER BY date_added DESC")
List<ImageInfo> getAllImages();
@Delete
void deleteImage(ImageInfo imageInfo);
@Update
int updateImage(ImageInfo imageInfo);
@Query("SELECT EXISTS(SELECT * FROM images WHERE md5 = :md5)")
boolean isImageExists(String md5);
}
@Database(entities = {ImageInfo.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract ImageDao imageDao();
private static volatile AppDatabase INSTANCE;
public static AppDatabase getInstance(Context context) {
if (INSTANCE == null) {
synchronized (AppDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
AppDatabase.class, "ImageDatabase.db")
.build();
}
}
}
return INSTANCE;
}
}
AppDatabase db = AppDatabase.getInstance(context);
ImageDao imageDao = db.imageDao();
// 插入
ImageInfo image = new ImageInfo();
// 设置image属性...
long id = imageDao.insertImage(image);
// 查询
List<ImageInfo> images = imageDao.getAllImages();
// 检查存在
boolean exists = imageDao.isImageExists("some_md5");
@Entity
public class ImageInfo {
@Id(autoincrement = true)
private Long id;
@Unique
private String md5;
private String path;
private long size;
private int width;
private int height;
private long dateAdded;
// Getters and setters...
}
public class DaoManager {
private static final String DB_NAME = "ImageDatabase.db";
private static DaoSession daoSession;
public static void init(Context context) {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME);
Database db = helper.getWritableDb();
DaoMaster daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoSession() {
return daoSession;
}
}
// 初始化 (在Application中)
DaoManager.init(context);
// 获取DAO
ImageInfoDao imageDao = DaoManager.getDaoSession().getImageInfoDao();
// 插入
ImageInfo image = new ImageInfo();
// 设置image属性...
long id = imageDao.insert(image);
// 查询
List<ImageInfo> images = imageDao.queryBuilder()
.orderDesc(ImageInfoDao.Properties.DateAdded)
.list();
// 检查存在
boolean exists = imageDao.queryBuilder()
.where(ImageInfoDao.Properties.Md5.eq("some_md5"))
.count() > 0;
public class ImageInfo extends RealmObject {
@PrimaryKey
private long id;
@Index
private String md5;
private String path;
private long size;
private int width;
private int height;
private long dateAdded;
// Getters and setters...
// Realm需要无参构造函数
public ImageInfo() {}
}
public class RealmManager {
private static RealmConfiguration realmConfig;
public static void init(Context context) {
Realm.init(context);
realmConfig = new RealmConfiguration.Builder()
.name("ImageDatabase.realm")
.schemaVersion(1)
.build();
Realm.setDefaultConfiguration(realmConfig);
}
public static Realm getRealm() {
return Realm.getDefaultInstance();
}
}
// 初始化 (在Application中)
RealmManager.init(context);
// 获取Realm实例
Realm realm = RealmManager.getRealm();
// 插入
realm.executeTransaction(r -> {
ImageInfo image = r.createObject(ImageInfo.class, generateId());
// 设置image属性...
image.setMd5("md5_value");
// ...
});
// 查询
List<ImageInfo> images = realm.where(ImageInfo.class)
.sort("dateAdded", Sort.DESCENDING)
.findAll();
// 检查存在
boolean exists = realm.where(ImageInfo.class)
.equalTo("md5", "some_md5")
.count() > 0;
-
Room:
- 官方推荐,与LiveData、ViewModel集成好
- 编译时验证SQL查询
- 需要较多的样板代码
-
GreenDAO:
- 性能优秀
- 查询构建器API直观
- 需要额外的初始化配置
-
Realm:
- 不是基于SQLite,有自己的数据库引擎
- 自动更新对象,无需手动刷新
- 跨平台支持好
- 会增加APK大小
根据你的项目需求选择合适的ORM库。如果是新项目,推荐使用Room,因为它是Android官方维护的解决方案。