当前位置: 首页 > 工具软件 > LBase-Android > 使用案例 >

Android数据库---Room、LitePal、GreenDao

袁良弼
2023-12-01

Room

https://developer.android.google.cn/training/data-storage/room

  1. app/build.gradle中添加依赖声明。
  2. 创建实体类,添加对应的注解。
  3. 创建Dao接口,接口中的方法对应crud操作。
  4. 创建继承自RoomDatabase的抽象类,并在类中创建数据库的实例。
  5. 进行数据库的crud操作,要放在子线程中执行。

实体类,对应数据库中的表:

@Entity(tableName = "user_table")
public class UserEntity {
    @PrimaryKey(autoGenerate = true)
    public int id;

    @ColumnInfo(name = "name")
    public String name;
    @ColumnInfo(name = "address")
    public String address;

    public UserEntity (String name, String address) {
        this.name= name;
        this.address= address;
    }
}

Dao接口,每个方法对应一条sql语句:

@Dao
public interface UserEntityDao {
    @Query("SELECT * FROM user_table")
    List<UserEntity> queryAll();

    @Insert
    void insetItem(UserEntity userEntity);

    @Insert
    void insertAll(UserEntity... userEntities);
}

创建数据库实例:

@Database(entities = {UserEntity.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
    private static MyDatabase sMyDatabase;

    public abstract UserEntityDao mUserEntityDao();
    
    public static MyDatabase getMyDatabase() {
        if (sMyDatabase== null) {
            synchronized (MyDatabase .class) {
                sMyDatabase= Room.databaseBuilder(BaseApplication.getAppContext(),
                        MyDatabase .class, "demo_db").build();
            }
        }
        return sMyDatabase;
    }
}

使用:

    public void loadHistories() {
        new Thread(() -> {
            MyDatabase database = MyDatabase .getMyDatabase();
            List<UserEntity> list = database.mUserEntityDao().queryAll();
        }).start();
    }

LitePal

github:https://github.com/guolindev/LitePal

  1. app/build.gradle中添加依赖声明。
  2. main/assets文件夹下添加litepal.xml文件。
  3. application中初始化。
  4. 实体类要继承LitePalSupport,才能进行crud操作,不需要创建数据库的实例。

注意:

  • 进行crud操作时,最好使用try/catch捕获异常;
  • 使用userAll方法更新数据库时,实体类中需要有无参的构造方法;
  • 修改数据库模型,litepal.xml修改版本号即可,但是有一些LitePal无法处理的升级条件,并且将清除升级表中的所有数据:
    添加一个注释为的字段unique = true。
    将字段的注释更改为unique = true。
    将字段的注释更改为nullable = false。

GreenDao

github:https://github.com/greenrobot/greenDAO,https://github.com/yuweiguocn/GreenDaoUpgradeHelper

  1. project/build.gradle和app/build.gradle中添加插件和依赖声明。
  2. app/build.gradle中添加greendao到相关配置。
  3. 实体类对应数据库表,使用@Entity注解标记,使用@Id修改的属性必须是Long类型,不能是long,否则会插入数据失败。创建完实体类后进行编译,会自动生成对应实体类的Dao类。如果后续对实体类进行了修改,需要重新编译。
  4. 分别创建DaoMaster.OpenHelper、Database、DaoSession 的对象,最后通过DaoSession 获取Dao的对象。关于创建DaoMaster.OpenHelper对象,因为DaoMaster.DevOpenHelper在进行数据升级时,会把旧表删除,然后创建新表,并没有迁移旧数据到新表中,从而造成数据丢失.。所以建议最好新建一个继承自DaoMaster.OpenHelper的Helper类,重写onUpgrade(Database db, int oldVersion, int newVersion)方法,在该方法中使用MigrationHelper进行数据库升级以及数据迁移。关于MigrationHelper的代码,可参考网上或者https://github.com/yuweiguocn/GreenDaoUpgradeHelper中的MigrationHelper,主要通过创建一个临时表,将旧表的数据迁移到新表中。
  5. 获取自动生成的实体类的Dao对象,进行crud操作。
android {
	greendao {
		schemaVersion 1 //当前数据库版本
	}
}

除schemaVersion外还可以添加的配置:
daoPackage:生成的DAO,DaoMaster和DaoSession的软件包名称。 默认为源实体的程序包名称。
targetGenDir:应将生成的源存储在的位置。 默认为生成目录内生成的源文件夹( build/generated/source/greendao)。
generateTests: 设置为true以自动生成单元测试
targetGenDirTests: 应将生成的单元测试存储在的基本目录。默认为 src/androidTest/java.。

public class GreenDaoManager {
    private static GreenDaoManager sInstance;
    private final DaoSession mDaoSession;

    public static GreenDaoManager getInstance() {
        if (sInstance == null) {
            synchronized (GreenDaoManager.class) {
                sInstance = new GreenDaoManager();
            }
        }
        return sInstance;
    }

    private GreenDaoManager() {
        DaoMaster.OpenHelper helper = new MyOpenHelper(BaseApplication.getApplication(), "greendao_user.db");
        Database db = helper.getWritableDb();
        mDaoSession = new DaoMaster(db).newSession();
    }

    public GreenDaoUserEntityDao getUserEntityDao() {
        return mDaoSession.getGreenDaoUserEntityDao();
    }

	// 通过GreenDaoUserEntityDao进行crud操作
    public void insertAllUsers(List<GreenDaoUserEntity> lists) {
        if (lists != null) {
            for (GreenDaoUserEntity userEntity : lists) {
                getUserEntityDao().insert(userEntity);
            }
        }
    }

    public List<GreenDaoUserEntity> queryUsersByName(String name) {
        return getGreenDaoUserEntityDao().queryBuilder().where(GreenDaoUserEntityDao.Properties.Name.eq(name)).list();
    }
 }
 类似资料: